UserRiceDelivery.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. <?php
  2. namespace app\store\model\card;
  3. use app\common\enum\order\DeliveryStatus as DeliveryStatusEnum;
  4. use app\common\enum\order\DeliveryStatus;
  5. use app\common\enum\order\ReceiptStatus as ReceiptStatusEnum;
  6. use \app\common\model\card\UserRiceDelivery as UserRiceDeliveryModel;
  7. use app\common\service\Kuaidi as KuaidiService;
  8. use app\store\model\card\UserRiceDeliveryExpress as UserRiceDeliveryExpressModel;
  9. use app\store\model\Express as ExpressModel;
  10. /**
  11. * 米卡配送模型
  12. * @package app\store\model
  13. */
  14. class UserRiceDelivery extends UserRiceDeliveryModel
  15. {
  16. /**
  17. * 获取列表
  18. * @param array $param 查询条件
  19. * @param int $listRows 分页数量
  20. * @return mixed
  21. * @throws \think\db\exception\DbException
  22. */
  23. public function getList(array $param = [], int $listRows = 15)
  24. {
  25. // 检索查询条件
  26. $filter = $this->getQueryFilter($param);
  27. // 执行查询
  28. $list = $this->with(['userRiceCard.riceCardGoods','userRiceDeliveryExpress'])
  29. ->alias('delivery')
  30. ->field('delivery.*')
  31. ->where($filter)
  32. ->order(['delivery_status'=>'asc','create_time'=>'desc'])
  33. ->paginate($listRows);
  34. return $list;
  35. }
  36. /**
  37. * 检索查询条件
  38. * @param array $param
  39. * @return \think\db\BaseQuery
  40. */
  41. private function getQueryFilter(array $param)
  42. {
  43. // 商品列表获取条件
  44. $params = $this->setQueryDefaultValue($param, [
  45. 'is_delete' => 0,
  46. ]);
  47. // 筛选条件
  48. $filter = [];
  49. // 兑换起止时间
  50. if (!empty($params['betweenTime'])) {
  51. $times = between_time($params['betweenTime']);
  52. $filter[] = ['create_time', 'between', [$times['start_time'], $times['end_time']]];
  53. }
  54. // 发货起止时间
  55. if (!empty($params['betweenDeliveryTime'])) {
  56. $times = between_time($params['betweenDeliveryTime']);
  57. $filter[] = ['delivery_time', 'between', [$times['start_time'], $times['end_time']]];
  58. }
  59. // 收件人
  60. !empty($params['name']) && $filter[] = ['name', 'like', "%{$params['name']}%"];
  61. // 收件人手机号码
  62. !empty($params['phone']) && $filter[] = ['phone', 'like', "%{$params['phone']}%"];
  63. //米卡名称
  64. if(isset($params['cardId'])&&$params['cardId']>-1){
  65. $filter[] = ['card_id','=',$params['cardId']];
  66. }
  67. //配送状态
  68. if(isset($params['statusText'])&&$params['statusText']>0){
  69. switch ($params['statusText']){
  70. case 1://待配送
  71. $filter[] = ['delivery_status','=',DeliveryStatusEnum::NOT_DELIVERED];
  72. break;
  73. case 2://配送中
  74. $filter[] = ['delivery_status','=',DeliveryStatusEnum::DELIVERED];
  75. $filter[] = ['receipt_status','=',ReceiptStatusEnum::NOT_RECEIVED];
  76. break;
  77. case 3://配送完成
  78. $filter[] = ['receipt_status','=',ReceiptStatusEnum::RECEIVED];
  79. break;
  80. }
  81. }
  82. // 实例化新查询对象
  83. return $filter;
  84. }
  85. /**
  86. * 确认发货/拆分发货
  87. * @param $data
  88. * @return array|bool|false
  89. * @throws \Exception
  90. */
  91. public function delivery($param)
  92. {
  93. $param = $this->setQueryDefaultValue($param, [
  94. 'is_update' => 0, //1更改物流 0去发货 不传默认0
  95. ]);
  96. // 验证订单是否满足发货条件
  97. if (!$this->verifyDelivery($param)) {
  98. return false;
  99. }
  100. // 请求快递100订阅接口
  101. foreach ($param['express_list'] as $item) {
  102. $express = ExpressModel::detail($item['express_id']);
  103. // 请求快递100订阅接口
  104. $subscribe = KuaidiService::subscribe($item['express_no'],4,$express['kuaidi100_code']??'');
  105. if(!$subscribe->result){
  106. if(stripos($subscribe->message,"重复订阅") === false){ //重复订阅允许提交物流
  107. $this->error = '物流单号订阅异常:'.$subscribe->message;
  108. return false;
  109. }
  110. }
  111. }
  112. //添加测试的时间
  113. if(env('SERVE_ENV')=='test'){
  114. }
  115. //事物处理
  116. $this->transaction(function () use ($param) {
  117. // 更新订单发货状态
  118. $this->save([
  119. 'is_split_package' => count($param['express_list'])>1?1:0,
  120. 'delivery_status' => DeliveryStatusEnum::DELIVERED,
  121. 'delivery_time' => time()
  122. ]);
  123. // 新增订单商品拆分包裹记录
  124. UserRiceDeliveryExpressModel::add($this,$param);
  125. });
  126. return true;
  127. }
  128. /**
  129. * 验证订单是否满足发货条件
  130. * @param $orderGoods
  131. * @param $param
  132. * @return bool
  133. */
  134. private function verifyDelivery($data)
  135. {
  136. if(!$this){
  137. $this->error = "不存在!";
  138. return false;
  139. }
  140. if($this['delivery_status']!=DeliveryStatus::NOT_DELIVERED){
  141. $this->error = "已经发货了";
  142. return false;
  143. }
  144. return true;
  145. }
  146. /**
  147. * 修改下单用户收货信息
  148. * @param array $param
  149. * @return int
  150. */
  151. public function updAddress(array $param)
  152. {
  153. if ($this['delivery_status'] != DeliveryStatus::NOT_DELIVERED) {
  154. $this->error = '未发货才能修改收货地址哦';
  155. return false;
  156. }
  157. // 更新收货地址
  158. return $this->save([
  159. 'name' => $param['name'],
  160. 'phone' => $param['phone'],
  161. 'province_id' => $param['province_id'],
  162. 'city_id' => $param['city_id'],
  163. 'region_id' => $param['region_id'],
  164. 'detail' => $param['detail'],
  165. ]);
  166. }
  167. }