OrderGoods.php 47 KB

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