OrderGoods.php 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2017~2021 https://www.yiovo.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
  8. // +----------------------------------------------------------------------
  9. // | Author: 萤火科技 <admin@yiovo.com>
  10. // +----------------------------------------------------------------------
  11. declare (strict_types = 1);
  12. namespace app\store\model;
  13. use app\api\model\subscribe\WechatSub;
  14. use app\common\enum\order\DeliveryStatus as DeliveryStatusEnum;
  15. use app\common\enum\order\DeliveryType as DeliveryTypeEnum;
  16. use app\common\enum\order\OrderStatus as OrderStatusEnum;
  17. use app\common\enum\order\PayStatus as PayStatusEnum;
  18. use app\common\enum\order\ReceiptStatus as ReceiptStatusEnum;
  19. use app\common\library\helper;
  20. use app\common\library\wechat\WxPay;
  21. use app\common\model\OrderGoods as OrderGoodsModel;
  22. use app\store\model\Order as OrderModel;
  23. use app\store\model\OrderGoodsPackage as OrderGoodsPackageModel;
  24. use app\common\service\Kuaidi as KuaidiService;
  25. use app\common\service\Message as MessageService;
  26. use app\store\model\Express as ExpressModel;
  27. use think\model\relation\HasOne;
  28. use app\common\enum\order\HxStatus as HxStatusEnum;
  29. /**
  30. * 订单商品模型
  31. * Class OrderGoods
  32. * @package app\store\model
  33. */
  34. class OrderGoods extends OrderGoodsModel
  35. {
  36. /**
  37. * 添加订单商品名称搜索
  38. * @param $goodName
  39. * @return mixed
  40. * @author: zjwhust
  41. * @Time: 2021/10/10 15:56
  42. */
  43. public function searchGoodName($goodName){
  44. $orderIdArray = $this->distinct(true)->where('goods_name', 'like', '%'.$goodName.'%')->column("order_id");
  45. return $orderIdArray;
  46. }
  47. /**
  48. * 添加订单快递单号搜索
  49. * @param $goodName
  50. * @return mixed
  51. * @author: zjwhust
  52. * @Time: 2021/10/10 15:56
  53. */
  54. public function searchExpressNo($expressNo){
  55. $orderIdArray = $this->distinct(true)->where('express_no', 'like', '%'.$expressNo.'%')->column("order_id");
  56. return $orderIdArray;
  57. }
  58. public function getList(string $dataType = OrderModel::LIST_TYPE_ALL, array $param = [])
  59. {
  60. $size = 15; // 其他列表默认展示15条数据
  61. $order = ['order_goods.delivery_time' => 'desc','order_goods.create_time' => 'desc']; // 排序规则
  62. if ($dataType == OrderModel::LIST_TYPE_DELIVERY && isset($param['gtype']) && $param['gtype'] == 1) {
  63. // 普通商品-待发货列表展示全部数据
  64. $size = 500;
  65. // $order = ['order_goods.create_time' => 'asc']; // 排序规则
  66. $order = ['order_goods.is_export'=>'asc','order_goods.create_time' => 'asc'];
  67. }
  68. if($dataType==OrderModel::LIST_TYPE_RECEIPT){
  69. $size = 10;
  70. $order = ['order.delivery_time'=>'desc'];
  71. }
  72. // 检索查询条件
  73. $filter = $this->getQueryFilter($param);
  74. //如果是套餐
  75. if (isset($param['gtype']) && $param['gtype'] == 2){
  76. // 设置订单类型条件
  77. $dataTypeFilter = $this->getFilterDataType($dataType);
  78. $query = $this->with(['orderM' => ['address'], 'shop','package'])
  79. ->alias('order_goods')
  80. ->field('order_goods.*,goods.provider_id,provider.provider_name')
  81. //->field('order_goods.order_goods_id,order_goods.goods_id,goods.provider_id,provider.provider_name')
  82. ->leftJoin('order', 'order_goods.order_id = order.order_id')
  83. ->leftJoin('order_address','order_address.order_id = order.order_id')
  84. ->leftJoin('goods','order_goods.goods_id = goods.goods_id')
  85. ->leftJoin('provider','goods.provider_id = provider.provider_id')
  86. ->where($dataTypeFilter)
  87. ->where('order_goods.goods_type',30)
  88. ->where($filter)
  89. ->hidden(['content']);
  90. $res = $query->where('order.is_delete', '=', 0)
  91. ->order($order)
  92. ->paginate($size);
  93. foreach ($res as &$item){
  94. $item->goods_packages = OrderGoodsTaocan::where('order_goods_id',$item->order_goods_id)->field('*,1 as total_num')->select();
  95. }
  96. return $res;
  97. // 获取数据列表
  98. $query = $this->with(['orderM' => ['address'], 'shop','package'])
  99. ->alias('order_goods')
  100. ->field('order_goods.*,goods.provider_id,provider.provider_name')
  101. //->field('order_goods.order_goods_id,order_goods.goods_id,goods.provider_id,provider.provider_name')
  102. ->leftJoin('order', 'order_goods.order_id = order.order_id')
  103. ->leftJoin('order_address','order_address.order_id = order.order_id')
  104. ->leftJoin('goods','order_goods.goods_id = goods.goods_id')
  105. ->leftJoin('provider','goods.provider_id = provider.provider_id')
  106. ->where($dataTypeFilter)
  107. ->where('order_goods.goods_type',30)
  108. ->where($filter)
  109. ->hidden(['content']);
  110. $res = $query->where('order.is_delete', '=', 0)
  111. ->order($order)
  112. ->paginate($size);
  113. //dd($res->toArray());
  114. foreach ($res as &$r){
  115. /* $r->goods_packages = GoodsPackage::with(['goods','images'=>['file'],'skuList'])
  116. ->where('goods_id',$r->goods_id)->select();*/
  117. $goods_packages = GoodsPackage::with(['goods'])
  118. ->where('goods_id',$r->goods_id)->select();
  119. if (count($goods_packages)){
  120. foreach ($goods_packages as &$pack){
  121. //dd($pack->rel_goods_sku_id);
  122. if ($pack->rel_goods_sku_id == 0){
  123. $pack->sku_info = GoodsSku::with(['image'])->where('goods_id',$pack->rel_goods_id)->find();
  124. }else{
  125. $pack->sku_info = GoodsSku::with(['image'])->where('goods_sku_id',$pack->rel_goods_sku_id)->find();
  126. }
  127. $pack->goods->total_num = 1;
  128. }
  129. }
  130. $r->goods_packages = $goods_packages;
  131. }
  132. return $res;
  133. }
  134. // 设置订单类型条件
  135. $dataTypeFilter = $this->getFilterDataType($dataType);
  136. // 获取数据列表
  137. $query = $this->with(['orderM' => ['address'], 'image', 'shop', 'provider','package'])
  138. ->alias('order_goods')
  139. ->field('order_goods.*')
  140. ->leftJoin('order', 'order_goods.order_id = order.order_id')
  141. ->leftJoin('order_address','order_address.order_id = order.order_id')
  142. ->leftJoin('provider','order_goods.provider_id = provider.provider_id')
  143. ->where($dataTypeFilter)
  144. ->where('order_goods.goods_type','<>',30)
  145. ->where($filter)
  146. ->hidden(['content']);
  147. return $query->where('order.is_delete', '=', 0)
  148. ->order($order)
  149. ->paginate($size);
  150. }
  151. /**
  152. * 设置检索查询条件
  153. * @param array $param
  154. * @return array
  155. */
  156. private function getQueryFilter(array $param): array
  157. {
  158. // 默认参数
  159. $params = $this->setQueryDefaultValue($param);
  160. // 检索查询条件
  161. $filter = [];
  162. // 订单号
  163. if (!empty($params['providerId'])) {
  164. $filter[] = ['order_goods.provider_id', '=', $params['providerId']];
  165. }
  166. // 订单号
  167. if (!empty($params['orderNo'])) {
  168. $filter[] = ['order.order_no', 'like', "%{$params['orderNo']}%"];
  169. }
  170. // 订单号
  171. if (!empty($params['orderId'])) {
  172. $filter[] = ['order.order_id', '=', $params['orderId']];
  173. }
  174. //商品名称
  175. if (isset($params['goodsName']) && !empty($params['goodsName'])) {
  176. $filter[] = ['order_goods.goods_name', 'like', "%{$params['goodsName']}%"];
  177. }
  178. //供应商名称
  179. if (isset($params['providerName']) && !empty($params['providerName'])) {
  180. $filter[] = ['provider.provider_name', 'like', "%{$params['providerName']}%"];
  181. }
  182. //物流单号
  183. if (isset($params['expressNo']) && !empty($params['expressNo'])) {
  184. $filter[] = ['order_goods.express_no', 'like', "%{$params['expressNo']}%"];
  185. }
  186. //物流公司ID
  187. if (isset($params['expressId']) && !empty($params['expressId'])) {
  188. $filter[] = ['order_goods.express_id', '=', $params['expressId']];
  189. }
  190. //收件人姓名或手机
  191. if(isset($params['addressKw'])&&!empty($params['addressKw'])){
  192. $filter[] = ['order_address.phone|order_address.name', 'like', '%' . trim($params['addressKw']) . '%'];
  193. }
  194. //是否导出
  195. if (isset($params['isExport']) && in_array($params['isExport'],[0,1])) {
  196. $filter[] = ['order_goods.is_export', '=', $params['isExport']];
  197. }
  198. // 收货地址
  199. if(isset($params['address'])&&!empty($params['address'])){
  200. $oids = OrderAddress::alias('order_address')
  201. ->leftJoin('areas province', 'province.id=order_address.province_id')
  202. ->leftJoin('areas city', 'city.id=order_address.city_id')
  203. ->leftJoin('areas region', 'region.id=order_address.region_id')
  204. ->where('province.name|city.name|region.name|detail', 'like','%' . trim($params['address']) . '%')
  205. ->column('order_id');
  206. $filter[] = ['order.order_id', 'in', $oids];
  207. }
  208. //发货时间
  209. if (isset($params['betweenDeliveryTime']) && $params['betweenDeliveryTime']){
  210. if (isset($params['betweenDeliveryTime'][0]) && $params['betweenDeliveryTime'][0] && isset($params['betweenDeliveryTime'][1]) && $params['betweenDeliveryTime'][1]){
  211. $times = between_time_format($params['betweenDeliveryTime']);
  212. $from = $times['start_time'];
  213. $to = $times['end_time'];
  214. $filter[] = ['order.delivery_time','between',[$from,$to]];
  215. }
  216. }
  217. //下单时间
  218. if (isset($params['betweenTime']) && $params['betweenTime']){
  219. if (isset($params['betweenTime'][0]) && $params['betweenTime'][0] && isset($params['betweenTime'][1]) && $params['betweenTime'][1]){
  220. $times = between_time_format($params['betweenTime']);
  221. $from = $times['start_time'];
  222. $to = $times['end_time'];
  223. $filter[] = ['order.create_time','between',[$from,$to]];
  224. }
  225. }
  226. //支付时间
  227. if (isset($params['betweenPayTime']) && $params['betweenPayTime']){
  228. if (isset($params['betweenPayTime'][0]) && $params['betweenPayTime'][0] && isset($params['betweenPayTime'][1]) && $params['betweenPayTime'][1]){
  229. $times = between_time_format($params['betweenPayTime']);
  230. $from = $times['start_time'];
  231. $to = $times['end_time'];
  232. $filter[] = ['order.pay_time','between',[$from,$to]];
  233. }
  234. }
  235. //收货时间
  236. if (isset($params['receiptTime']) && $params['receiptTime']){
  237. if (isset($params['receiptTime'][0]) && $params['receiptTime'][0] && isset($params['receiptTime'][1]) && $params['receiptTime'][1]){
  238. $times = between_time_format($params['receiptTime']);
  239. $from = $times['start_time'];
  240. $to = $times['end_time'];
  241. $filter[] = ['order_goods.sign_time','between',[$from,$to]];
  242. }
  243. }
  244. //财务结算状态
  245. if(isset($params['financeClearingStatus']) && $params['financeClearingStatus']){
  246. $filter[] = ['order_goods.finance_clearing_status ' ,'=',$params['financeClearingStatus']];
  247. if ($params['financeClearingStatus'] == self::FINANCE_CLEARING_WAIT){
  248. $filter[] = ['order_goods.provider_settlement_time ' ,'<',time()];
  249. }
  250. }
  251. //是否退货状态
  252. if(isset($params['hasRefundAct']) && in_array($params['hasRefundAct'],[0,1])){
  253. $filter[] = ['order_goods.has_refund_act ' ,'=',$params['hasRefundAct']];
  254. }
  255. //是否导出
  256. if(isset($params['isExport']) && in_array($params['isExport'],[0,1])){
  257. $filter[] = ['order_goods.is_export ' ,'=',$params['isExport']];
  258. }
  259. return $filter;
  260. }
  261. /**
  262. * 设置订单类型条件
  263. * @param string $dataType
  264. * @return array
  265. */
  266. private function getFilterDataType(string $dataType = OrderModel::LIST_TYPE_ALL): array
  267. {
  268. // 数据类型
  269. $filter = [];
  270. switch ($dataType) {
  271. case OrderModel::LIST_TYPE_DELIVERY://待发货
  272. $filter = [
  273. ['order.pay_status', '=', PayStatusEnum::SUCCESS],
  274. ['order.delivery_status', '=', DeliveryStatusEnum::NOT_DELIVERED],
  275. ['order.delivery_type', '=', DeliveryTypeEnum::EXPRESS],
  276. ['order.order_status', 'in', [OrderStatusEnum::NORMAL, OrderStatusEnum::APPLY_CANCEL]],
  277. ['order_goods.delivery_status', '=', DeliveryStatusEnum::NOT_DELIVERED],
  278. ['order_goods.has_refund_full', '=', 0]
  279. ];
  280. break;
  281. case OrderModel::LIST_TYPE_RECEIPT: //待收货
  282. $filter = [
  283. ['order.pay_status', '=', PayStatusEnum::SUCCESS],
  284. ['order.delivery_status', '=', DeliveryStatusEnum::DELIVERED],
  285. ['order.delivery_type', '=', DeliveryTypeEnum::EXPRESS],
  286. ['order.receipt_status', '=', ReceiptStatusEnum::NOT_RECEIVED],
  287. ['order_goods.delivery_status', '=', DeliveryStatusEnum::DELIVERED],
  288. ['order_goods.receipt_status', '=', ReceiptStatusEnum::NOT_RECEIVED]
  289. ];
  290. break;
  291. }
  292. return $filter;
  293. }
  294. //获取需要微信发货的订单商品,wx_delivery_status=10未微信发货,20已微信发货
  295. public function getNeedToWxDelivery()
  296. {
  297. return $this->where(['delivery_status' => DeliveryStatusEnum::DELIVERED, 'receipt_status' => ReceiptStatusEnum::NOT_RECEIVED,'wx_delivery_status' => 10])->limit(50)->select()->toArray();
  298. }
  299. /**
  300. * 获取待发货数量
  301. */
  302. public function getNotDeliveredOrderTotal()
  303. {
  304. $filter = [
  305. ['order.delivery_type','=',DeliveryTypeEnum::EXPRESS],
  306. ['order.pay_status', '=', PayStatusEnum::SUCCESS],
  307. ['order.delivery_status', '=', DeliveryStatusEnum::NOT_DELIVERED],
  308. ['order.order_status', 'in', [OrderStatusEnum::NORMAL, OrderStatusEnum::APPLY_CANCEL]],
  309. ['order_goods.delivery_status', '=', DeliveryStatusEnum::NOT_DELIVERED],
  310. ['order_goods.has_refund_full', '=', 0],
  311. ['order.is_delete', '=', 0]
  312. ];
  313. return $this->alias('order_goods')
  314. ->leftJoin('order', 'order_goods.order_id = order.order_id')
  315. ->where($filter)
  316. ->count();
  317. }
  318. /**
  319. * 获取待提货订单数量 参考上面的快递订单写的
  320. */
  321. public function getNotDeliveredShopOrderTotal()
  322. {
  323. $filter = [
  324. ['order.delivery_type','=',DeliveryTypeEnum::SHOPS_DELIVERY],
  325. ['order.pay_status', '=', PayStatusEnum::SUCCESS],
  326. ['order.hx_status', '=', HxStatusEnum::PENDING], //未核消等于未自提吧
  327. ['order.order_status', 'in', [OrderStatusEnum::NORMAL, OrderStatusEnum::APPLY_CANCEL]],
  328. ['order_goods.has_refund_full', '=', 0],
  329. ['order.is_delete', '=', 0]
  330. ];
  331. return $this->alias('order_goods')
  332. ->leftJoin('order', 'order_goods.order_id = order.order_id')
  333. ->where($filter)
  334. ->count();
  335. }
  336. /**
  337. * 确认发货(单独订单)
  338. * @param $data
  339. * @return array|bool|false
  340. * @throws \Exception
  341. */
  342. public function delivery($param)
  343. {
  344. $param = $this->setQueryDefaultValue($param, [
  345. 'is_update' => 0, //1更改物流 0去发货 不传默认0
  346. ]);
  347. $orderGoods = self::find($param['order_goods_id']);
  348. // 验证订单是否满足发货条件
  349. if (!$this->verifyDelivery($orderGoods,$param)) {
  350. return false;
  351. }
  352. $express = ExpressModel::detail($param['express_id']);
  353. // 请求快递100订阅接口
  354. $subscribe = KuaidiService::subscribe($param['express_no'],1,$express['kuaidi100_code']??'');
  355. if(!$subscribe->result){
  356. log_record($param['express_no'].'----'.json_encode($subscribe));
  357. if(stripos($subscribe->message,"重复订阅") === false){ //重复订阅允许提交物流
  358. $this->error = '物流单号订阅异常:'.$subscribe->message;
  359. return false;
  360. }
  361. }
  362. //添加测试的时间
  363. if(env('SERVE_ENV')=='test'){
  364. // $this->testUpd($orderGoodsList);
  365. }
  366. //事物处理
  367. $this->transaction(function () use ($orderGoods,$param,$express) {
  368. // 更新订单发货状态
  369. $this->updateToDelivery($orderGoods,$param,$express);
  370. //推送订阅
  371. $data = [
  372. 'date4'=>["value"=>date('Y年m月d日')],//发货时间
  373. 'thing14'=>["value"=>$express['express_name']],//快递公司
  374. 'character_string13'=>["value"=>$param['express_no']], //物流单号
  375. 'thing1'=>["value"=>$orderGoods['goods_name']], //物品名称
  376. 'thing12'=>["value"=>'点击查看配送信息更新>>'], //温馨提示
  377. ];
  378. $this->pushSub($orderGoods['user_id'],$orderGoods['order_id'],$data);
  379. });
  380. return true;
  381. }
  382. //下单并发起拼团,拼团成功后发送
  383. public function pushSub($user_id,$order_id,$data){
  384. $template_type = 'order';
  385. $sub = new WechatSub($template_type);
  386. $page = '/pages/cart/pages/orderDetail/orderDetail?orderId='.$order_id;
  387. $sub->pushSub($user_id,$page,$data);
  388. }
  389. /**
  390. * 拆分发货(单独订单)
  391. * @param $data
  392. * @return array|bool|false
  393. * @throws \Exception
  394. */
  395. public function splitDelivery($param)
  396. {
  397. $param = $this->setQueryDefaultValue($param, [
  398. 'is_update' => 0, //1更改物流 0去发货 不传默认0
  399. ]);
  400. $orderGoods = self::find($param['order_goods_id']);
  401. // 验证订单是否满足发货条件
  402. if (!$this->verifySplitDelivery($orderGoods,$param)) {
  403. return false;
  404. }
  405. foreach ($param['express_list'] as $item) {
  406. $express = ExpressModel::detail($item['express_id']);
  407. // 请求快递100订阅接口
  408. $subscribe = KuaidiService::subscribe($item['express_no'],3,$express['kuaidi100_code']??'');
  409. if(!$subscribe->result){
  410. if(stripos($subscribe->message,"重复订阅") === false){ //重复订阅允许提交物流
  411. $this->error = '物流单号订阅异常:'.$subscribe->message;
  412. return false;
  413. }
  414. }
  415. }
  416. //添加测试的时间
  417. if(env('SERVE_ENV')=='test'){
  418. // $this->testUpd($orderGoodsList);
  419. }
  420. //修改物流
  421. if($param['is_update']){
  422. //事物处理
  423. $this->transaction(function () use ($orderGoods,$param) {
  424. // 修改订单商品拆分包裹记录
  425. OrderGoodsPackageModel::edit($orderGoods,$param);
  426. });
  427. }else{
  428. //事物处理
  429. $this->transaction(function () use ($orderGoods,$param) {
  430. // 更新订单发货状态
  431. $orderGoods->save([
  432. 'is_split_package' => 1,
  433. 'delivery_status' => DeliveryStatusEnum::DELIVERED,
  434. 'delivery_time' => time()
  435. ]);
  436. // 新增订单商品拆分包裹记录
  437. OrderGoodsPackageModel::add($orderGoods,$param);
  438. //判断订单其他商品是不是都是已发货状态
  439. if(!$this::where('order_id',$orderGoods['order_id'])->where('delivery_status',DeliveryStatusEnum::NOT_DELIVERED)->where('has_refund_full',0)->count()){ //如果所有的订单商品都发货了
  440. orderModel::updateBase([
  441. 'delivery_status' => DeliveryStatusEnum::DELIVERED,
  442. 'delivery_time' => time(),
  443. ],['order_id' => $orderGoods['order_id']]);
  444. }
  445. //推送订阅
  446. $data = [
  447. 'date4'=>["value"=>date('Y年m月d日')],//发货时间
  448. 'thing14'=>["value"=>$param['express_list'][0]['express_company']],//快递公司
  449. 'character_string13'=>["value"=>$param['express_list'][0]['express_no']], //物流单号
  450. 'thing1'=>["value"=>$orderGoods['goods_name']], //物品名称
  451. 'thing12'=>["value"=>'点击查看配送信息更新>>'], //温馨提示
  452. ];
  453. $this->pushSub($orderGoods['user_id'],$orderGoods['order_id'],$data);
  454. });
  455. }
  456. return true;
  457. }
  458. public function testUpd($orderGoodsList){
  459. foreach ($orderGoodsList as $item) {
  460. $data = [
  461. 'provider_settlement_time' => time()+300,//供应商结算开始时间5分钟后
  462. 'commission_settlement_time' => time()+300,//分佣结算开始时间5分钟后
  463. 'refund_time' => time()+600,//关闭售后时间10分钟
  464. 'auto_receipt_time' => time()+300,//自动收货最晚时间5分钟后
  465. 'sign_time' => time(),//自动收货最晚时间5分钟后
  466. //售后退款用户退货发货超时5分钟
  467. ];
  468. OrderGoodsModel::updateBase($data, ['order_goods_id'=>$item['order_goods_id']]);
  469. }
  470. }
  471. /**
  472. * 确认发货后发送消息通知
  473. * @param $orderList
  474. * @return bool
  475. */
  476. private function sendDeliveryMessage($orderList)
  477. {
  478. // 发送消息通知
  479. foreach ($orderList as $item) {
  480. MessageService::send('order.delivery', ['order' => $item], self::$storeId);
  481. }
  482. return true;
  483. }
  484. /**
  485. * 更新订单发货状态(批量)
  486. * @param $orderGoods
  487. * @param $param
  488. * @return bool
  489. */
  490. private function updateToDelivery($orderGoods,$param,$express)
  491. {
  492. // 整理更新的数据
  493. $data = [];
  494. // $express = ExpressModel::detail($param['express_id']);
  495. if($param['is_update']==1){
  496. $data[] = [
  497. 'data' => [
  498. 'express_no' => $param['express_no'],
  499. 'express_id' => $param['express_id'],
  500. 'express_company' => $express['express_name'],
  501. 'delivery_status' => DeliveryStatusEnum::DELIVERED,
  502. ],
  503. 'where' => ['order_goods_id' => $param['order_goods_id']]
  504. ];
  505. }else{
  506. $data[] = [
  507. 'data' => [
  508. 'express_no' => $param['express_no'],
  509. 'express_id' => $param['express_id'],
  510. 'express_company' => $express['express_name'],
  511. 'delivery_status' => DeliveryStatusEnum::DELIVERED,
  512. 'delivery_time' => time(),
  513. ],
  514. 'where' => ['order_goods_id' => $param['order_goods_id']]
  515. ];
  516. }
  517. // 批量更新
  518. $this->updateAll($data);
  519. if(!$this::where('order_id',$orderGoods['order_id'])->where('delivery_status',DeliveryStatusEnum::NOT_DELIVERED)->where('has_refund_full',0)->count()){ //如果所有的订单商品都发货了
  520. if($param['is_update']==0){
  521. orderModel::updateBase([
  522. 'delivery_status' => DeliveryStatusEnum::DELIVERED,
  523. 'delivery_time' => time(),
  524. ],['order_id' => $orderGoods['order_id']]);
  525. }
  526. }
  527. return true;
  528. }
  529. /**
  530. * 验证订单是否满足发货条件
  531. * @param $orderGoods
  532. * @param $param
  533. * @return bool
  534. */
  535. private function verifyDelivery($orderGoods,$param)
  536. {
  537. if(!$orderGoods){
  538. $this->error = "订单商品不存在!";
  539. return false;
  540. }
  541. $order = OrderModel::find($orderGoods['order_id']);
  542. if($param['is_update']==0){
  543. if (
  544. $order['pay_status'] != PayStatusEnum::SUCCESS
  545. || $order['delivery_type'] != DeliveryTypeEnum::EXPRESS
  546. || $order['delivery_status'] != DeliveryStatusEnum::NOT_DELIVERED
  547. ) {
  548. $this->error = "订单号[{$order['order_no']}] 不满足发货条件!";
  549. return false;
  550. }
  551. }
  552. $express_no_list_true = [];
  553. foreach ($order['goods'] as $goods){
  554. if($goods['is_split_package']){
  555. foreach ($goods['package'] as $pack){
  556. $express_no_list_true[] = $pack['express_no'];
  557. }
  558. }
  559. }
  560. if(in_array($param['express_no'],$express_no_list_true)){
  561. $this->error = "单号【".$param['express_no']."】已经存在拆分包裹中!";
  562. return false;
  563. }
  564. if(OrderGoodsPackageModel::where(['express_no'=>$param['express_no']])->count()){
  565. $this->error = "单号【".$param['express_no']."】已经存在于别的订单商品拆分包裹中!";
  566. return false;
  567. }
  568. return true;
  569. }
  570. /**
  571. * 验证订单是否满足发货条件
  572. * @param $orderGoods
  573. * @param $param
  574. * @return bool
  575. */
  576. private function verifySplitDelivery($orderGoods,$param)
  577. {
  578. if(!$orderGoods){
  579. $this->error = "订单商品不存在!";
  580. return false;
  581. }
  582. $express_no_list = helper::getArrayColumn($param['express_list'],'express_no');
  583. if (count($express_no_list) != count(array_unique($express_no_list))) {
  584. $this->error = "拆分包裹的物流单号不能相同!";
  585. return false;
  586. }
  587. $totalNums = helper::getArrayColumnSum($param['express_list'],'total_num');
  588. if($totalNums!=$orderGoods['total_num']){
  589. $this->error = "拆分包裹累积数量和订单商品数量不一致!";
  590. return false;
  591. }
  592. $express_no_list_true = [];
  593. $order = OrderModel::find($orderGoods['order_id']);
  594. foreach ($order['goods'] as $goods){
  595. if($param['is_update']==0 || $goods['goods_id']!=$orderGoods['goods_id']){//编辑包裹时排除掉自己的包裹
  596. if($goods['is_split_package']){
  597. foreach ($goods['package'] as $pack){
  598. $express_no_list_true[] = $pack['express_no'];
  599. }
  600. }else{
  601. if($goods['express_no']){
  602. $express_no_list_true[] = $goods['express_no'];
  603. }
  604. }
  605. }
  606. }
  607. foreach ($param['express_list'] as $item){
  608. if(in_array($item['express_no'],$express_no_list_true)){
  609. $this->error = "单号【".$item['express_no']."】已经存在!";
  610. return false;
  611. }
  612. if(OrderGoodsModel::where(['express_no'=>$item['express_no']])->count()){
  613. $this->error = "单号【".$item['express_no']."】已经存在于别的订单商品中!";
  614. return false;
  615. }
  616. }
  617. $totalNums = helper::getArrayColumnSum($param['express_list'],'total_num');
  618. if($totalNums!=$orderGoods['total_num']){
  619. $this->error = "拆分包裹累积数量和订单商品数量不一致!";
  620. return false;
  621. }
  622. if($param['is_update']==0){
  623. if($orderGoods['delivery_status'] != DeliveryStatusEnum::NOT_DELIVERED){
  624. $this->error = "订单商品已经发货了!";
  625. return false;
  626. }
  627. $order = OrderModel::where('order_id','=',$orderGoods['order_id'])->find();
  628. if (
  629. $order['pay_status'] != PayStatusEnum::SUCCESS
  630. || $order['delivery_type'] != DeliveryTypeEnum::EXPRESS
  631. || $order['delivery_status'] != DeliveryStatusEnum::NOT_DELIVERED
  632. ) {
  633. $this->error = "订单号[{$order['order_no']}] 不满足发货条件!";
  634. return false;
  635. }
  636. }
  637. return true;
  638. }
  639. public function getFinanceList($params){
  640. // 检索查询条件
  641. $filter = $this->getQueryFilter($params);
  642. // 获取数据列表
  643. //todo total_clearing_price = (clearing_price*(order_goods.total_num-退货数量 )+ order.express_price)
  644. //order.express_price,2011-11-19删除运费金额
  645. $query = $this->field('order_goods.order_goods_id,user.nick_name,order_goods.user_id,order_goods.create_time,order_goods.goods_props,order_goods.goods_name,order_goods.total_pay_price,order_goods.clearing_price,order_goods.total_num,order_goods.total_num,order_goods.order_id,order_goods.provider_id,order_goods.sign_time as receipt_time,order.order_no,order.express_price,order_goods.finance_clearing_status,FROM_UNIXTIME(order_goods.finance_clearing_time,"%Y-%m-%d %H:%i:%S") as finance_clearing_time,finance_evidence,order_goods.has_refund_act,order.delivery_type,shops.shop_name,order_goods.shop_id')
  646. ->with([ 'provider','evidence','recover','refund'])
  647. ->alias('order_goods')
  648. ->leftJoin('user', 'order_goods.user_id = user.user_id')
  649. ->leftJoin('order', 'order_goods.order_id = order.order_id')
  650. ->leftJoin('provider','order_goods.provider_id = provider.provider_id')
  651. ->leftJoin('shops','order_goods.shop_id = shops.shop_id')
  652. ->where($filter)
  653. ->where('order_goods.provider_settlement_time','>',0)
  654. //->where('order_goods.finance_clearing_status','<',self::FINANCE_CLEARING_DONE)
  655. ->hidden(['content']);
  656. $res = $query->where('order.is_delete', '=', 0)
  657. ->order(['order.order_id' => 'desc'])
  658. ->paginate(15)->toArray();
  659. $data = &$res['data'];
  660. foreach ($data as $key =>&$re){
  661. $re['has_refund'] = false;
  662. $re['refund_goods_num'] = 0;
  663. $refund_num = 0;
  664. if ($re['refund'] && $re['refund']['status'] == 20){
  665. $refund_num = $re['refund']['goods_num'];
  666. $re['has_refund'] = true;
  667. }
  668. //$re['total_clearing_price'] =helper::bcadd(($re['total_num']-$refund_num)*$re['clearing_price'] + $re['express_price'],0,2);//总结算金额
  669. $re['refund_goods_num'] = $refund_num;
  670. unset($re['refund']);
  671. }
  672. return $res;
  673. }
  674. /**
  675. * 退款
  676. * @return HasOne
  677. */
  678. public function refund()
  679. {
  680. return $this->hasOne('orderRefund', 'order_goods_id', 'order_goods_id')->field('order_goods_id,refund_money,goods_num,type,status,finance_refund,close_username');
  681. }
  682. /**
  683. * 凭证
  684. * @return HasOne
  685. */
  686. public function evidence()
  687. {
  688. return $this->hasOne('uploadFile', 'file_id', 'finance_evidence')->bind(['preview_url' => 'preview_url']);
  689. }
  690. /**
  691. * 关联用户头像表
  692. * @return HasOne
  693. */
  694. public function recover()
  695. {
  696. return $this->hasOne('recoverMoney', 'order_goods_id', 'order_goods_id')->field('order_goods_id,goods_money,desc,clearing_evidence,recover_evidence');
  697. }
  698. /**
  699. * 结算,冻结,解冻
  700. * @param $params
  701. * @param int $type
  702. * @param int $evidence
  703. * @return bool
  704. */
  705. public function clearing($params,$type=1,$evidence=0){
  706. if (!count($params))return true;
  707. $finance_clearing_time = 0;
  708. if ($type == 1){//结算
  709. $where_status = self::FINANCE_CLEARING_WAIT;
  710. $status = self::FINANCE_CLEARING_DONE;
  711. $finance_clearing_time = time();
  712. }elseif($type == 2){//冻结
  713. $where_status = self::FINANCE_CLEARING_WAIT;
  714. $status = self::FINANCE_CLEARING_FREEZE;
  715. }elseif($type == 3){//解冻
  716. $where_status = self::FINANCE_CLEARING_FREEZE;
  717. $status = self::FINANCE_CLEARING_WAIT;
  718. }else{
  719. return true;
  720. }
  721. self::whereIn('order_goods_id',$params)
  722. ->where('finance_clearing_status',$where_status)
  723. ->update(['finance_clearing_status'=>$status,'finance_clearing_time'=>$finance_clearing_time,'finance_evidence'=>$evidence]);
  724. return true;
  725. }
  726. /**
  727. * 导出订单商品列表
  728. * @param array $param
  729. * @author: zjwhust
  730. * @Time: 2021/10/15 13:51
  731. */
  732. public function orderExport(array $param)
  733. {
  734. $order_goods_ids = $param['order_goods_id'];
  735. //$data['header'] = ['序号', '订单编号', '商品名称', '商品编码', '商品数量', '供应商名称', '收件人', '联系方式', '收货地址', '物流公司', '物流单号'];
  736. $data['header'] = ['序号', '订单编号','收货地址','收货人','收货电话','商品sku','商品名称', '商品规格','商品数量', '供应商名称','物流公司','物流单号', '备注'];
  737. $data['filename'] = '订单商品导出';
  738. $data['data'] = [];
  739. $list = $this->with(['provider','orderM'=>['address']])
  740. ->whereIn('order_goods_id',$order_goods_ids)->select();
  741. //->where('total_num','=',1)//导出限制:商品件数>1 时 不支持批量导出,导出的数据中不含件数>1的商品
  742. foreach ($list as $arr){
  743. $new_list['order_goods_id'] = $arr['order_goods_id'];
  744. $new_list['order_no'] = (string)$arr['orderM']['order_no'];
  745. $new_list['detail'] = $arr['orderM']['address']['region']['province'].$arr['orderM']['address']['region']['city'].$arr['orderM']['address']['region']['region'].$arr['orderM']['address']['detail'];
  746. $new_list['name'] = $arr['orderM']['address']['name'];
  747. $new_list['phone'] = $arr['orderM']['address']['phone'];
  748. $new_list['goods_sku_no'] = $arr['goods_sku_no'];
  749. $new_list['goods_name'] = $arr['goods_name'];
  750. $new_list['goods_props'] = $arr['goods_props'][0]['value']['name']??'';
  751. $new_list['total_num'] = $arr['total_num'];
  752. $new_list['provider_name'] = $arr['provider']['provider_name'];
  753. $new_list['express_company'] = $arr['express_company'];
  754. $new_list['express_no'] = $arr['express_no'];
  755. $new_list['color_remark'] = $arr['orderM']['color_remark'];
  756. // $new_list['create_time'] = $arr['create_time'];
  757. // $new_list['is_export'] = '已导出';
  758. $data['data'][] = $new_list;
  759. }
  760. // $data['data'] = $this->field('order_goods_id,order.order_no,goods_name,provider.provider_name,order_address.name,order_address.phone,order_address.phone+order_address.name,order_goods.express_company,order_goods.express_no')
  761. // ->alias('order_goods')
  762. // ->leftJoin('order', 'order_goods.order_id = order.order_id')
  763. // ->leftJoin('provider','order_goods.provider_id = provider.provider_id')
  764. // ->leftJoin('order_address','order_goods.order_id = order_address.order_id')
  765. // ->whereIn('order_goods_id',$order_goods_ids)
  766. // ->select()
  767. // ->toArray();
  768. return $data;
  769. }
  770. /**
  771. * 导出套餐订单商品列表
  772. * @param array $param
  773. * @author: zjwhust
  774. * @Time: 2021/10/15 13:51
  775. */
  776. public function orderBagExport(array $param)
  777. {
  778. $order_goods_ids = $param['order_goods_id'];
  779. $data['header'] = ['序号', '订单编号', '套餐商品名称', '套餐商品编码', '套餐商品规格','套餐商品数量','供应商名称', '收件人', '联系方式', '收货地址', '物流公司', '物流单号','导出状态','商品名称','商品SKU编码','商品规格'];
  780. $data['filename'] = '订单商品导出';
  781. $data['data'] = [];
  782. // 设置订单类型条件
  783. // 获取数据列表
  784. $query = $this->with(['orderM' => ['address']])
  785. ->alias('order_goods')
  786. ->field('order_goods.*,goods.provider_id,provider.provider_name,order.order_no')
  787. ->leftJoin('order', 'order_goods.order_id = order.order_id')
  788. ->leftJoin('order_address','order_address.order_id = order.order_id')
  789. ->leftJoin('goods','order_goods.goods_id = goods.goods_id')
  790. ->leftJoin('provider','goods.provider_id = provider.provider_id')
  791. ->where('order_goods.goods_type',30)
  792. ->whereIn('order_goods_id',$order_goods_ids)
  793. ->hidden(['content']);
  794. $list = $query->where('order.is_delete', '=', 0)
  795. ->order(['order_goods.delivery_time' => 'desc','order_goods.create_time' => 'desc'])
  796. ->paginate();
  797. //加入套餐快照后的
  798. foreach ($list as &$item){
  799. $item->goods_packages = OrderGoodsTaocan::where('order_goods_id',$item->order_goods_id)->field('*,1 as total_num')->select();
  800. }
  801. //加入套餐快照前的
  802. /* foreach ($list as &$r){
  803. $goods_packages = GoodsPackage::with(['goods'])
  804. ->where('goods_id',$r->goods_id)->select();
  805. if (count($goods_packages)){
  806. foreach ($goods_packages as &$pack){
  807. if ($pack->rel_goods_sku_id == 0){
  808. $pack->sku_info = GoodsSku::with(['image'])->where('goods_id',$pack->rel_goods_id)->find();
  809. }else{
  810. $pack->sku_info = GoodsSku::with(['image'])->where('goods_id',$pack->rel_goods_id)->where('goods_sku_id',$pack->rel_goods_sku_id)->find();
  811. }
  812. }
  813. }
  814. $r->goods_packages = $goods_packages;
  815. }*/
  816. //按照套餐格式化导出数据
  817. foreach ($list as &$val){
  818. $new_list['order_goods_id'] = $val['order_goods_id'];
  819. $new_list['order_no'] = (string)$val['orderM']['order_no'];
  820. $new_list['goods_name'] = trim($val['goods_name']);
  821. $new_list['goods_sku_no'] = $val['goods_sku_no'];
  822. $new_list['goods_props'] = $val['goods_props'][0]['value']['name']??'--';//单规格商品的规格是空
  823. $new_list['total_num'] = $val['total_num'];
  824. $new_list['provider_name'] = $val['provider_name'];
  825. $new_list['name'] = $val['orderM']['address']['name'];
  826. $new_list['phone'] = $val['orderM']['address']['phone'];
  827. $new_list['detail'] = $val['orderM']['address']['region']['province'].$val['orderM']['address']['region']['city'].$val['orderM']['address']['region']['region'].$val['orderM']['address']['detail'];
  828. $new_list['express_company'] = $val['express_company'];
  829. $new_list['express_no'] = $val['express_no'];
  830. $new_list['is_export'] = '已导出';
  831. $names = $sku_noes = $sku_specs=[];
  832. if (count($val['goods_packages'])){
  833. foreach ($val['goods_packages'] as $v){
  834. $names[] = $v['goods_name'];
  835. $sku_noes[] = $v['goods_sku_no'];
  836. $sku_specs[] = $v['goods_props'][0]['value']['name']??'--';
  837. /* $names[] = $v['goods']['goods_name'];
  838. $sku_noes[] = $v['sku_info']['goods_sku_no'];
  839. $sku_specs[] = $v['sku_info']['goods_props'][0]['value']['name']??'--';*/
  840. }
  841. }
  842. $new_list['goods_names'] = implode(PHP_EOL,$names);
  843. $new_list['sku_noes'] = implode(PHP_EOL,$sku_noes);
  844. $new_list['sku_specs'] = implode(PHP_EOL,$sku_specs);
  845. $data['data'][] = $new_list;
  846. }
  847. return $data;
  848. //todo 此代码是按照套餐内的商品导出,以备后用,切记切记
  849. /* foreach ($list as &$r){
  850. $goods_packages = GoodsPackage::with(['goods'])
  851. ->where('goods_id',$r->goods_id)->select();
  852. if (count($goods_packages)){
  853. foreach ($goods_packages as &$pack){
  854. if ($pack->goods_sku_id == 0){
  855. $pack->sku_info = GoodsSku::with(['image'])->where('goods_id',$pack->goods_id)->find();
  856. }else{
  857. $pack->sku_info = GoodsSku::with(['image'])->where('goods_sku_id',$pack->rel_goods_sku_id)->find();
  858. }
  859. }
  860. }
  861. $r->goods_packages = $goods_packages;
  862. }
  863. foreach ($list as $arr){
  864. //dd($arr->toArray());
  865. foreach ($arr['goods_packages'] as $pack){
  866. $new_list['order_goods_id'] = $arr['order_goods_id'];
  867. $new_list['order_no'] = (string)$arr['order_no'];
  868. $new_list['goods_name'] = $pack['goods']['goods_name'];
  869. $new_list['goods_sku_no'] = $pack['sku_info']['goods_sku_no']??'';
  870. $new_list['goods_props'] = $pack['sku_info']['goods_props'][0]['value']['name']??'';
  871. $new_list['total_num'] = $arr['total_num'];
  872. $new_list['provider_name'] = $arr['provider_name'];
  873. $new_list['name'] = $arr['orderM']['address']['name'];
  874. $new_list['phone'] = $arr['orderM']['address']['phone'];
  875. $new_list['detail'] = $arr['orderM']['address']['region']['province'].$arr['orderM']['address']['region']['city'].$arr['orderM']['address']['region']['region'].$arr['orderM']['address']['detail'];
  876. $new_list['express_company'] = $arr['express_company'];
  877. $new_list['express_no'] = $arr['express_no'];
  878. $new_list['is_export'] = '已导出';
  879. $data['data'][] = $new_list;
  880. }
  881. }
  882. return $data;*/
  883. }
  884. public function clearingMoney($params){
  885. $list = self::field("order_goods_id,clearing_price,total_num")->with([ 'refund'])->whereIn('order_goods_id',$params)
  886. ->where('finance_clearing_status','=',self::FINANCE_CLEARING_WAIT)
  887. ->select()->toArray();
  888. //->sum("clearing_price*total_num");//todo 需要减去退款数量
  889. $m = 0;
  890. foreach ($list as $key=>$arr){
  891. $refund_num = 0;
  892. if (isset($arr['refund']) && $arr['refund']['status'] == 20){
  893. $refund_num = $arr['refund']['goods_num'];
  894. }
  895. $m += ($arr['total_num']-$refund_num)*$arr['clearing_price'];
  896. }
  897. return $m;
  898. }
  899. /**
  900. * 导出财务结算商品列表
  901. * @param $params
  902. * @return array
  903. * @author: zjwhust
  904. * @Time: 2021/10/15 13:51
  905. */
  906. public function goodsClearingExport($params)
  907. {
  908. $data['header'] = ['序号','供应商名称','签收时间', '订单编号', '销售门店','配送方式','商品名称','商品规格', '用户姓名','购买件数','结算单价','退货数量','是否退货','结算状态', '结算时间'];
  909. $data['filename'] = '订单商品导出';
  910. $data['data'] = [];
  911. $filter = $this->getQueryFilter($params);
  912. //$query = $this->field('order_goods.order_goods_id,user.nick_name,order_goods.user_id,order_goods.create_time,order_goods.goods_props,order_goods.goods_name,order_goods.total_pay_price,order_goods.clearing_price,order_goods.total_num,clearing_price*order_goods.total_num as clearing_goods_price,(clearing_price*order_goods.total_num + order.express_price) as total_clearing_price,order_goods.order_id,order_goods.provider_id,order.order_no,order.express_price,order_goods.sign_time as receipt_time,order_goods.finance_clearing_status,FROM_UNIXTIME(order_goods.finance_clearing_time,"%Y-%m-%d %H:%i:%S") as finance_clearing_time')
  913. $query = $this->field('order_goods.order_goods_id,user.nick_name,order_goods.user_id,order_goods.create_time,order_goods.goods_props,order_goods.goods_name,order_goods.total_pay_price,order_goods.clearing_price,order_goods.total_num,order_goods.order_id,order_goods.provider_id,order.order_no,order.express_price,order_goods.sign_time as receipt_time,order_goods.finance_clearing_status,FROM_UNIXTIME(order_goods.finance_clearing_time,"%Y-%m-%d %H:%i:%S") as finance_clearing_time,order_goods.has_refund_act,order_goods.shop_id,order.delivery_type,shops.shop_name')
  914. ->with([ 'provider','refund'])
  915. ->alias('order_goods')
  916. ->leftJoin('user', 'order_goods.user_id = user.user_id')
  917. ->leftJoin('order', 'order_goods.order_id = order.order_id')
  918. ->leftJoin('provider','order_goods.provider_id = provider.provider_id')
  919. ->leftJoin('shops','order_goods.shop_id = shops.shop_id')
  920. ->where($filter)
  921. ->where('order_goods.provider_settlement_time','>',0)
  922. ->where('order_goods.finance_clearing_status','<>',self::FINANCE_CLEARING_MISS)
  923. ->hidden(['content']);
  924. $query = $query->where('order.is_delete', '=', 0)->select();
  925. $query = $query?$query->toArray():[];
  926. //dd($query);
  927. //todo 缺少退货数量,是否退货
  928. foreach ($query as $key=>$arr){
  929. $new_list['order'] = $key+1;
  930. $new_list['provider_name'] = $arr['provider_name'];
  931. $new_list['receipt_time'] = (string)$arr['receipt_time'];
  932. $new_list['order_no'] = (string)$arr['order_no'];
  933. $new_list['shop_name'] = $arr['shop_name'];
  934. $new_list['delivery_type'] = $arr['delivery_type']==10?'快递配送':'门店自提';
  935. $new_list['goods_name'] = $arr['goods_name'];
  936. //$new_list['goods_props'] = $arr['goods_props'][0]['group']['name'].'-'.$arr['goods_props'][0]['value']['name']??'';
  937. $new_list['goods_props'] = $arr['goods_props'][0]['value']['name']??'';
  938. $new_list['nick_name'] = $arr['nick_name'];
  939. $new_list['total_num'] = $arr['total_num'];
  940. $new_list['clearing_price'] = $arr['clearing_price'];//结算单价
  941. $refund_num = 0;
  942. if (isset($arr['refund']) && $arr['refund'] && $arr['refund']['status'] == 20){
  943. $refund_num = $arr['refund']['goods_num'];
  944. }
  945. $new_list['refund_goods_num'] = $refund_num;//退货数量
  946. //$new_list['express_price'] = $arr['express_price'];//运费金额
  947. //$new_list['total_clearing_price'] = ($arr['total_num']-$refund_num)*$arr['clearing_price'] + $arr['express_price'];//总结算金额
  948. $new_list['has_refund_act'] = $arr['has_refund_act']==0?'否':'是';
  949. $new_list['finance_clearing_status'] = $arr['finance_clearing_status']==1?'待结算':'已结算';
  950. $new_list['finance_clearing_time'] = strtotime($arr['finance_clearing_time'])==0 ? '-':$arr['finance_clearing_time'] ;
  951. $data['data'][] = $new_list;
  952. }
  953. //dd($data['data']);
  954. return $data;
  955. }
  956. /**
  957. * 计算供应商的待结算佣金
  958. * @param int $params 供应商ID
  959. * @return float
  960. */
  961. public static function waitClearingMoney($params){
  962. return self::where('provider_id',$params)
  963. ->where('finance_clearing_status','=',self::FINANCE_CLEARING_WAIT)
  964. ->sum("clearing_price*total_num");
  965. }
  966. }