// +---------------------------------------------------------------------- declare (strict_types = 1); namespace app\store\model; use app\api\model\subscribe\WechatSub; use app\common\enum\order\DeliveryStatus as DeliveryStatusEnum; use app\common\enum\order\DeliveryType as DeliveryTypeEnum; use app\common\enum\order\OrderStatus as OrderStatusEnum; use app\common\enum\order\PayStatus as PayStatusEnum; use app\common\enum\order\ReceiptStatus as ReceiptStatusEnum; use app\common\library\helper; use app\common\model\OrderGoods as OrderGoodsModel; use app\store\model\Order as OrderModel; use app\store\model\OrderGoodsPackage as OrderGoodsPackageModel; use app\common\service\Kuaidi as KuaidiService; use app\common\service\Message as MessageService; use app\store\model\Express as ExpressModel; use think\model\relation\HasOne; use app\common\enum\order\HxStatus as HxStatusEnum; /** * 订单商品模型 * Class OrderGoods * @package app\store\model */ class OrderGoods extends OrderGoodsModel { /** * 添加订单商品名称搜索 * @param $goodName * @return mixed * @author: zjwhust * @Time: 2021/10/10 15:56 */ public function searchGoodName($goodName){ $orderIdArray = $this->distinct(true)->where('goods_name', 'like', '%'.$goodName.'%')->column("order_id"); return $orderIdArray; } /** * 添加订单快递单号搜索 * @param $goodName * @return mixed * @author: zjwhust * @Time: 2021/10/10 15:56 */ public function searchExpressNo($expressNo){ $orderIdArray = $this->distinct(true)->where('express_no', 'like', '%'.$expressNo.'%')->column("order_id"); return $orderIdArray; } public function getList(string $dataType = OrderModel::LIST_TYPE_ALL, array $param = []) { $size = 15; // 其他列表默认展示15条数据 $order = ['order_goods.delivery_time' => 'desc','order_goods.create_time' => 'desc']; // 排序规则 if ($dataType == OrderModel::LIST_TYPE_DELIVERY && isset($param['gtype']) && $param['gtype'] == 1) { // 普通商品-待发货列表展示全部数据 $size = 500; // $order = ['order_goods.create_time' => 'asc']; // 排序规则 $order = ['order_goods.is_export'=>'asc','order_goods.create_time' => 'asc']; } if($dataType==OrderModel::LIST_TYPE_RECEIPT){ $size = 10; $order = ['order.delivery_time'=>'desc']; } // 检索查询条件 $filter = $this->getQueryFilter($param); //如果是套餐 if (isset($param['gtype']) && $param['gtype'] == 2){ // 设置订单类型条件 $dataTypeFilter = $this->getFilterDataType($dataType); $query = $this->with(['orderM' => ['address'], 'shop','package']) ->alias('order_goods') ->field('order_goods.*,goods.provider_id,provider.provider_name') //->field('order_goods.order_goods_id,order_goods.goods_id,goods.provider_id,provider.provider_name') ->leftJoin('order', 'order_goods.order_id = order.order_id') ->leftJoin('order_address','order_address.order_id = order.order_id') ->leftJoin('goods','order_goods.goods_id = goods.goods_id') ->leftJoin('provider','goods.provider_id = provider.provider_id') ->where($dataTypeFilter) ->where('order_goods.goods_type',30) ->where($filter) ->hidden(['content']); $res = $query->where('order.is_delete', '=', 0) ->order($order) ->paginate($size); foreach ($res as &$item){ $item->goods_packages = OrderGoodsTaocan::where('order_goods_id',$item->order_goods_id)->field('*,1 as total_num')->select(); } return $res; // 获取数据列表 $query = $this->with(['orderM' => ['address'], 'shop','package']) ->alias('order_goods') ->field('order_goods.*,goods.provider_id,provider.provider_name') //->field('order_goods.order_goods_id,order_goods.goods_id,goods.provider_id,provider.provider_name') ->leftJoin('order', 'order_goods.order_id = order.order_id') ->leftJoin('order_address','order_address.order_id = order.order_id') ->leftJoin('goods','order_goods.goods_id = goods.goods_id') ->leftJoin('provider','goods.provider_id = provider.provider_id') ->where($dataTypeFilter) ->where('order_goods.goods_type',30) ->where($filter) ->hidden(['content']); $res = $query->where('order.is_delete', '=', 0) ->order($order) ->paginate($size); //dd($res->toArray()); foreach ($res as &$r){ /* $r->goods_packages = GoodsPackage::with(['goods','images'=>['file'],'skuList']) ->where('goods_id',$r->goods_id)->select();*/ $goods_packages = GoodsPackage::with(['goods']) ->where('goods_id',$r->goods_id)->select(); if (count($goods_packages)){ foreach ($goods_packages as &$pack){ //dd($pack->rel_goods_sku_id); if ($pack->rel_goods_sku_id == 0){ $pack->sku_info = GoodsSku::with(['image'])->where('goods_id',$pack->rel_goods_id)->find(); }else{ $pack->sku_info = GoodsSku::with(['image'])->where('goods_sku_id',$pack->rel_goods_sku_id)->find(); } $pack->goods->total_num = 1; } } $r->goods_packages = $goods_packages; } return $res; } // 设置订单类型条件 $dataTypeFilter = $this->getFilterDataType($dataType); // 获取数据列表 $query = $this->with(['orderM' => ['address'], 'image', 'shop', 'provider','package']) ->alias('order_goods') ->field('order_goods.*') ->leftJoin('order', 'order_goods.order_id = order.order_id') ->leftJoin('order_address','order_address.order_id = order.order_id') ->leftJoin('provider','order_goods.provider_id = provider.provider_id') ->where($dataTypeFilter) ->where('order_goods.goods_type','<>',30) ->where($filter) ->hidden(['content']); return $query->where('order.is_delete', '=', 0) ->order($order) ->paginate($size); } /** * 设置检索查询条件 * @param array $param * @return array */ private function getQueryFilter(array $param): array { // 默认参数 $params = $this->setQueryDefaultValue($param); // 检索查询条件 $filter = []; // 订单号 if (!empty($params['providerId'])) { $filter[] = ['order_goods.provider_id', '=', $params['providerId']]; } // 订单号 if (!empty($params['orderNo'])) { $filter[] = ['order.order_no', 'like', "%{$params['orderNo']}%"]; } // 订单号 if (!empty($params['orderId'])) { $filter[] = ['order.order_id', '=', $params['orderId']]; } //商品名称 if (isset($params['goodsName']) && !empty($params['goodsName'])) { $filter[] = ['order_goods.goods_name', 'like', "%{$params['goodsName']}%"]; } //供应商名称 if (isset($params['providerName']) && !empty($params['providerName'])) { $filter[] = ['provider.provider_name', 'like', "%{$params['providerName']}%"]; } //物流单号 if (isset($params['expressNo']) && !empty($params['expressNo'])) { $filter[] = ['order_goods.express_no', 'like', "%{$params['expressNo']}%"]; } //物流公司ID if (isset($params['expressId']) && !empty($params['expressId'])) { $filter[] = ['order_goods.express_id', '=', $params['expressId']]; } //收件人姓名或手机 if(isset($params['addressKw'])&&!empty($params['addressKw'])){ $filter[] = ['order_address.phone|order_address.name', 'like', '%' . trim($params['addressKw']) . '%']; } //是否导出 if (isset($params['isExport']) && in_array($params['isExport'],[0,1])) { $filter[] = ['order_goods.is_export', '=', $params['isExport']]; } // 收货地址 if(isset($params['address'])&&!empty($params['address'])){ $oids = OrderAddress::alias('order_address') ->leftJoin('areas province', 'province.id=order_address.province_id') ->leftJoin('areas city', 'city.id=order_address.city_id') ->leftJoin('areas region', 'region.id=order_address.region_id') ->where('province.name|city.name|region.name|detail', 'like','%' . trim($params['address']) . '%') ->column('order_id'); $filter[] = ['order.order_id', 'in', $oids]; } //发货时间 if (isset($params['betweenDeliveryTime']) && $params['betweenDeliveryTime']){ if (isset($params['betweenDeliveryTime'][0]) && $params['betweenDeliveryTime'][0] && isset($params['betweenDeliveryTime'][1]) && $params['betweenDeliveryTime'][1]){ $times = between_time_format($params['betweenDeliveryTime']); $from = $times['start_time']; $to = $times['end_time']; $filter[] = ['order.delivery_time','between',[$from,$to]]; } } //下单时间 if (isset($params['betweenTime']) && $params['betweenTime']){ if (isset($params['betweenTime'][0]) && $params['betweenTime'][0] && isset($params['betweenTime'][1]) && $params['betweenTime'][1]){ $times = between_time_format($params['betweenTime']); $from = $times['start_time']; $to = $times['end_time']; $filter[] = ['order.create_time','between',[$from,$to]]; } } //支付时间 if (isset($params['betweenPayTime']) && $params['betweenPayTime']){ if (isset($params['betweenPayTime'][0]) && $params['betweenPayTime'][0] && isset($params['betweenPayTime'][1]) && $params['betweenPayTime'][1]){ $times = between_time_format($params['betweenPayTime']); $from = $times['start_time']; $to = $times['end_time']; $filter[] = ['order.pay_time','between',[$from,$to]]; } } //收货时间 if (isset($params['receiptTime']) && $params['receiptTime']){ if (isset($params['receiptTime'][0]) && $params['receiptTime'][0] && isset($params['receiptTime'][1]) && $params['receiptTime'][1]){ $times = between_time_format($params['receiptTime']); $from = $times['start_time']; $to = $times['end_time']; $filter[] = ['order_goods.sign_time','between',[$from,$to]]; } } //财务结算状态 if(isset($params['financeClearingStatus']) && $params['financeClearingStatus']){ $filter[] = ['order_goods.finance_clearing_status ' ,'=',$params['financeClearingStatus']]; if ($params['financeClearingStatus'] == self::FINANCE_CLEARING_WAIT){ $filter[] = ['order_goods.provider_settlement_time ' ,'<',time()]; } } //是否退货状态 if(isset($params['hasRefundAct']) && in_array($params['hasRefundAct'],[0,1])){ $filter[] = ['order_goods.has_refund_act ' ,'=',$params['hasRefundAct']]; } //是否导出 if(isset($params['isExport']) && in_array($params['isExport'],[0,1])){ $filter[] = ['order_goods.is_export ' ,'=',$params['isExport']]; } return $filter; } /** * 设置订单类型条件 * @param string $dataType * @return array */ private function getFilterDataType(string $dataType = OrderModel::LIST_TYPE_ALL): array { // 数据类型 $filter = []; switch ($dataType) { case OrderModel::LIST_TYPE_DELIVERY://待发货 $filter = [ ['order.pay_status', '=', PayStatusEnum::SUCCESS], ['order.delivery_status', '=', DeliveryStatusEnum::NOT_DELIVERED], ['order.delivery_type', '=', DeliveryTypeEnum::EXPRESS], ['order.order_status', 'in', [OrderStatusEnum::NORMAL, OrderStatusEnum::APPLY_CANCEL]], ['order_goods.delivery_status', '=', DeliveryStatusEnum::NOT_DELIVERED], ['order_goods.has_refund_full', '=', 0] ]; break; case OrderModel::LIST_TYPE_RECEIPT: //待收货 $filter = [ ['order.pay_status', '=', PayStatusEnum::SUCCESS], ['order.delivery_status', '=', DeliveryStatusEnum::DELIVERED], ['order.delivery_type', '=', DeliveryTypeEnum::EXPRESS], ['order.receipt_status', '=', ReceiptStatusEnum::NOT_RECEIVED], ['order_goods.delivery_status', '=', DeliveryStatusEnum::DELIVERED], ['order_goods.receipt_status', '=', ReceiptStatusEnum::NOT_RECEIVED] ]; break; } return $filter; } /** * 获取待发货数量 */ public function getNotDeliveredOrderTotal() { $filter = [ ['order.delivery_type','=',DeliveryTypeEnum::EXPRESS], ['order.pay_status', '=', PayStatusEnum::SUCCESS], ['order.delivery_status', '=', DeliveryStatusEnum::NOT_DELIVERED], ['order.order_status', 'in', [OrderStatusEnum::NORMAL, OrderStatusEnum::APPLY_CANCEL]], ['order_goods.delivery_status', '=', DeliveryStatusEnum::NOT_DELIVERED], ['order_goods.has_refund_full', '=', 0], ['order.is_delete', '=', 0] ]; return $this->alias('order_goods') ->leftJoin('order', 'order_goods.order_id = order.order_id') ->where($filter) ->count(); } /** * 获取待提货订单数量 参考上面的快递订单写的 */ public function getNotDeliveredShopOrderTotal() { $filter = [ ['order.delivery_type','=',DeliveryTypeEnum::SHOPS_DELIVERY], ['order.pay_status', '=', PayStatusEnum::SUCCESS], ['order.hx_status', '=', HxStatusEnum::PENDING], //未核消等于未自提吧 ['order.order_status', 'in', [OrderStatusEnum::NORMAL, OrderStatusEnum::APPLY_CANCEL]], ['order_goods.has_refund_full', '=', 0], ['order.is_delete', '=', 0] ]; return $this->alias('order_goods') ->leftJoin('order', 'order_goods.order_id = order.order_id') ->where($filter) ->count(); } /** * 确认发货(单独订单) * @param $data * @return array|bool|false * @throws \Exception */ public function delivery($param) { $param = $this->setQueryDefaultValue($param, [ 'is_update' => 0, //1更改物流 0去发货 不传默认0 ]); $orderGoods = self::find($param['order_goods_id']); // 验证订单是否满足发货条件 if (!$this->verifyDelivery($orderGoods,$param)) { return false; } $express = ExpressModel::detail($param['express_id']); // 请求快递100订阅接口 $subscribe = KuaidiService::subscribe($param['express_no'],1,$express['kuaidi100_code']??''); if(!$subscribe->result){ log_record($param['express_no'].'----'.json_encode($subscribe)); if(stripos($subscribe->message,"重复订阅") === false){ //重复订阅允许提交物流 $this->error = '物流单号订阅异常:'.$subscribe->message; return false; } } //添加测试的时间 if(env('SERVE_ENV')=='test'){ // $this->testUpd($orderGoodsList); } //事物处理 $this->transaction(function () use ($orderGoods,$param,$express) { // 更新订单发货状态 $this->updateToDelivery($orderGoods,$param,$express); //推送订阅 $data = [ 'date4'=>["value"=>date('Y年m月d日')],//发货时间 'thing14'=>["value"=>$express['express_name']],//快递公司 'character_string13'=>["value"=>$param['express_no']], //物流单号 'thing1'=>["value"=>$orderGoods['goods_name']], //物品名称 'thing12'=>["value"=>'点击查看配送信息更新>>'], //温馨提示 ]; $this->pushSub($orderGoods['user_id'],$orderGoods['order_id'],$data); }); return true; } //下单并发起拼团,拼团成功后发送 public function pushSub($user_id,$order_id,$data){ $template_type = 'order'; $sub = new WechatSub($template_type); $page = '/pages/cart/pages/orderDetail/orderDetail?orderId='.$order_id; $sub->pushSub($user_id,$page,$data); } /** * 拆分发货(单独订单) * @param $data * @return array|bool|false * @throws \Exception */ public function splitDelivery($param) { $param = $this->setQueryDefaultValue($param, [ 'is_update' => 0, //1更改物流 0去发货 不传默认0 ]); $orderGoods = self::find($param['order_goods_id']); // 验证订单是否满足发货条件 if (!$this->verifySplitDelivery($orderGoods,$param)) { return false; } foreach ($param['express_list'] as $item) { $express = ExpressModel::detail($item['express_id']); // 请求快递100订阅接口 $subscribe = KuaidiService::subscribe($item['express_no'],3,$express['kuaidi100_code']??''); if(!$subscribe->result){ if(stripos($subscribe->message,"重复订阅") === false){ //重复订阅允许提交物流 $this->error = '物流单号订阅异常:'.$subscribe->message; return false; } } } //添加测试的时间 if(env('SERVE_ENV')=='test'){ // $this->testUpd($orderGoodsList); } //修改物流 if($param['is_update']){ //事物处理 $this->transaction(function () use ($orderGoods,$param) { // 修改订单商品拆分包裹记录 OrderGoodsPackageModel::edit($orderGoods,$param); }); }else{ //事物处理 $this->transaction(function () use ($orderGoods,$param) { // 更新订单发货状态 $orderGoods->save([ 'is_split_package' => 1, 'delivery_status' => DeliveryStatusEnum::DELIVERED, 'delivery_time' => time() ]); // 新增订单商品拆分包裹记录 OrderGoodsPackageModel::add($orderGoods,$param); //判断订单其他商品是不是都是已发货状态 if(!$this::where('order_id',$orderGoods['order_id'])->where('delivery_status',DeliveryStatusEnum::NOT_DELIVERED)->where('has_refund_full',0)->count()){ //如果所有的订单商品都发货了 orderModel::updateBase([ 'delivery_status' => DeliveryStatusEnum::DELIVERED, 'delivery_time' => time(), ],['order_id' => $orderGoods['order_id']]); } //推送订阅 $data = [ 'date4'=>["value"=>date('Y年m月d日')],//发货时间 'thing14'=>["value"=>$param['express_list'][0]['express_company']],//快递公司 'character_string13'=>["value"=>$param['express_list'][0]['express_no']], //物流单号 'thing1'=>["value"=>$orderGoods['goods_name']], //物品名称 'thing12'=>["value"=>'点击查看配送信息更新>>'], //温馨提示 ]; $this->pushSub($orderGoods['user_id'],$orderGoods['order_id'],$data); }); } return true; } public function testUpd($orderGoodsList){ foreach ($orderGoodsList as $item) { $data = [ 'provider_settlement_time' => time()+300,//供应商结算开始时间5分钟后 'commission_settlement_time' => time()+300,//分佣结算开始时间5分钟后 'refund_time' => time()+600,//关闭售后时间10分钟 'auto_receipt_time' => time()+300,//自动收货最晚时间5分钟后 'sign_time' => time(),//自动收货最晚时间5分钟后 //售后退款用户退货发货超时5分钟 ]; OrderGoodsModel::updateBase($data, ['order_goods_id'=>$item['order_goods_id']]); } } /** * 确认发货后发送消息通知 * @param $orderList * @return bool */ private function sendDeliveryMessage($orderList) { // 发送消息通知 foreach ($orderList as $item) { MessageService::send('order.delivery', ['order' => $item], self::$storeId); } return true; } /** * 更新订单发货状态(批量) * @param $orderGoods * @param $param * @return bool */ private function updateToDelivery($orderGoods,$param,$express) { // 整理更新的数据 $data = []; // $express = ExpressModel::detail($param['express_id']); if($param['is_update']==1){ $data[] = [ 'data' => [ 'express_no' => $param['express_no'], 'express_id' => $param['express_id'], 'express_company' => $express['express_name'], 'delivery_status' => DeliveryStatusEnum::DELIVERED, ], 'where' => ['order_goods_id' => $param['order_goods_id']] ]; }else{ $data[] = [ 'data' => [ 'express_no' => $param['express_no'], 'express_id' => $param['express_id'], 'express_company' => $express['express_name'], 'delivery_status' => DeliveryStatusEnum::DELIVERED, 'delivery_time' => time(), ], 'where' => ['order_goods_id' => $param['order_goods_id']] ]; } // 批量更新 $this->updateAll($data); if(!$this::where('order_id',$orderGoods['order_id'])->where('delivery_status',DeliveryStatusEnum::NOT_DELIVERED)->where('has_refund_full',0)->count()){ //如果所有的订单商品都发货了 if($param['is_update']==0){ orderModel::updateBase([ 'delivery_status' => DeliveryStatusEnum::DELIVERED, 'delivery_time' => time(), ],['order_id' => $orderGoods['order_id']]); } } return true; } /** * 验证订单是否满足发货条件 * @param $orderGoods * @param $param * @return bool */ private function verifyDelivery($orderGoods,$param) { if(!$orderGoods){ $this->error = "订单商品不存在!"; return false; } $order = OrderModel::find($orderGoods['order_id']); if($param['is_update']==0){ if ( $order['pay_status'] != PayStatusEnum::SUCCESS || $order['delivery_type'] != DeliveryTypeEnum::EXPRESS || $order['delivery_status'] != DeliveryStatusEnum::NOT_DELIVERED ) { $this->error = "订单号[{$order['order_no']}] 不满足发货条件!"; return false; } } $express_no_list_true = []; foreach ($order['goods'] as $goods){ if($goods['is_split_package']){ foreach ($goods['package'] as $pack){ $express_no_list_true[] = $pack['express_no']; } } } if(in_array($param['express_no'],$express_no_list_true)){ $this->error = "单号【".$param['express_no']."】已经存在拆分包裹中!"; return false; } if(OrderGoodsPackageModel::where(['express_no'=>$param['express_no']])->count()){ $this->error = "单号【".$param['express_no']."】已经存在于别的订单商品拆分包裹中!"; return false; } return true; } /** * 验证订单是否满足发货条件 * @param $orderGoods * @param $param * @return bool */ private function verifySplitDelivery($orderGoods,$param) { if(!$orderGoods){ $this->error = "订单商品不存在!"; return false; } $express_no_list = helper::getArrayColumn($param['express_list'],'express_no'); if (count($express_no_list) != count(array_unique($express_no_list))) { $this->error = "拆分包裹的物流单号不能相同!"; return false; } $totalNums = helper::getArrayColumnSum($param['express_list'],'total_num'); if($totalNums!=$orderGoods['total_num']){ $this->error = "拆分包裹累积数量和订单商品数量不一致!"; return false; } $express_no_list_true = []; $order = OrderModel::find($orderGoods['order_id']); foreach ($order['goods'] as $goods){ if($param['is_update']==0 || $goods['goods_id']!=$orderGoods['goods_id']){//编辑包裹时排除掉自己的包裹 if($goods['is_split_package']){ foreach ($goods['package'] as $pack){ $express_no_list_true[] = $pack['express_no']; } }else{ if($goods['express_no']){ $express_no_list_true[] = $goods['express_no']; } } } } foreach ($param['express_list'] as $item){ if(in_array($item['express_no'],$express_no_list_true)){ $this->error = "单号【".$item['express_no']."】已经存在!"; return false; } if(OrderGoodsModel::where(['express_no'=>$item['express_no']])->count()){ $this->error = "单号【".$item['express_no']."】已经存在于别的订单商品中!"; return false; } } $totalNums = helper::getArrayColumnSum($param['express_list'],'total_num'); if($totalNums!=$orderGoods['total_num']){ $this->error = "拆分包裹累积数量和订单商品数量不一致!"; return false; } if($param['is_update']==0){ if($orderGoods['delivery_status'] != DeliveryStatusEnum::NOT_DELIVERED){ $this->error = "订单商品已经发货了!"; return false; } $order = OrderModel::where('order_id','=',$orderGoods['order_id'])->find(); if ( $order['pay_status'] != PayStatusEnum::SUCCESS || $order['delivery_type'] != DeliveryTypeEnum::EXPRESS || $order['delivery_status'] != DeliveryStatusEnum::NOT_DELIVERED ) { $this->error = "订单号[{$order['order_no']}] 不满足发货条件!"; return false; } } return true; } public function getFinanceList($params){ // 检索查询条件 $filter = $this->getQueryFilter($params); // 获取数据列表 //todo total_clearing_price = (clearing_price*(order_goods.total_num-退货数量 )+ order.express_price) //order.express_price,2011-11-19删除运费金额 $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') ->with([ 'provider','evidence','recover','refund']) ->alias('order_goods') ->leftJoin('user', 'order_goods.user_id = user.user_id') ->leftJoin('order', 'order_goods.order_id = order.order_id') ->leftJoin('provider','order_goods.provider_id = provider.provider_id') ->leftJoin('shops','order_goods.shop_id = shops.shop_id') ->where($filter) ->where('order_goods.provider_settlement_time','>',0) //->where('order_goods.finance_clearing_status','<',self::FINANCE_CLEARING_DONE) ->hidden(['content']); $res = $query->where('order.is_delete', '=', 0) ->order(['order.order_id' => 'desc']) ->paginate(15)->toArray(); $data = &$res['data']; foreach ($data as $key =>&$re){ $re['has_refund'] = false; $re['refund_goods_num'] = 0; $refund_num = 0; if ($re['refund'] && $re['refund']['status'] == 20){ $refund_num = $re['refund']['goods_num']; $re['has_refund'] = true; } //$re['total_clearing_price'] =helper::bcadd(($re['total_num']-$refund_num)*$re['clearing_price'] + $re['express_price'],0,2);//总结算金额 $re['refund_goods_num'] = $refund_num; unset($re['refund']); } return $res; } /** * 退款 * @return HasOne */ public function refund() { return $this->hasOne('orderRefund', 'order_goods_id', 'order_goods_id')->field('order_goods_id,refund_money,goods_num,type,status,finance_refund,close_username'); } /** * 凭证 * @return HasOne */ public function evidence() { return $this->hasOne('uploadFile', 'file_id', 'finance_evidence')->bind(['preview_url' => 'preview_url']); } /** * 关联用户头像表 * @return HasOne */ public function recover() { return $this->hasOne('recoverMoney', 'order_goods_id', 'order_goods_id')->field('order_goods_id,goods_money,desc,clearing_evidence,recover_evidence'); } /** * 结算,冻结,解冻 * @param $params * @param int $type * @param int $evidence * @return bool */ public function clearing($params,$type=1,$evidence=0){ if (!count($params))return true; $finance_clearing_time = 0; if ($type == 1){//结算 $where_status = self::FINANCE_CLEARING_WAIT; $status = self::FINANCE_CLEARING_DONE; $finance_clearing_time = time(); }elseif($type == 2){//冻结 $where_status = self::FINANCE_CLEARING_WAIT; $status = self::FINANCE_CLEARING_FREEZE; }elseif($type == 3){//解冻 $where_status = self::FINANCE_CLEARING_FREEZE; $status = self::FINANCE_CLEARING_WAIT; }else{ return true; } self::whereIn('order_goods_id',$params) ->where('finance_clearing_status',$where_status) ->update(['finance_clearing_status'=>$status,'finance_clearing_time'=>$finance_clearing_time,'finance_evidence'=>$evidence]); return true; } /** * 导出订单商品列表 * @param array $param * @author: zjwhust * @Time: 2021/10/15 13:51 */ public function orderExport(array $param) { $order_goods_ids = $param['order_goods_id']; //$data['header'] = ['序号', '订单编号', '商品名称', '商品编码', '商品数量', '供应商名称', '收件人', '联系方式', '收货地址', '物流公司', '物流单号']; $data['header'] = ['序号', '订单编号','收货地址','收货人','收货电话','商品sku','商品名称', '商品规格','商品数量', '供应商名称','物流公司','物流单号', '备注']; $data['filename'] = '订单商品导出'; $data['data'] = []; $list = $this->with(['provider','orderM'=>['address']]) ->whereIn('order_goods_id',$order_goods_ids)->select(); //->where('total_num','=',1)//导出限制:商品件数>1 时 不支持批量导出,导出的数据中不含件数>1的商品 foreach ($list as $arr){ $new_list['order_goods_id'] = $arr['order_goods_id']; $new_list['order_no'] = (string)$arr['orderM']['order_no']; $new_list['detail'] = $arr['orderM']['address']['region']['province'].$arr['orderM']['address']['region']['city'].$arr['orderM']['address']['region']['region'].$arr['orderM']['address']['detail']; $new_list['name'] = $arr['orderM']['address']['name']; $new_list['phone'] = $arr['orderM']['address']['phone']; $new_list['goods_sku_no'] = $arr['goods_sku_no']; $new_list['goods_name'] = $arr['goods_name']; $new_list['goods_props'] = $arr['goods_props'][0]['value']['name']??''; $new_list['total_num'] = $arr['total_num']; $new_list['provider_name'] = $arr['provider']['provider_name']; $new_list['express_company'] = $arr['express_company']; $new_list['express_no'] = $arr['express_no']; $new_list['color_remark'] = $arr['orderM']['color_remark']; // $new_list['create_time'] = $arr['create_time']; // $new_list['is_export'] = '已导出'; $data['data'][] = $new_list; } // $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') // ->alias('order_goods') // ->leftJoin('order', 'order_goods.order_id = order.order_id') // ->leftJoin('provider','order_goods.provider_id = provider.provider_id') // ->leftJoin('order_address','order_goods.order_id = order_address.order_id') // ->whereIn('order_goods_id',$order_goods_ids) // ->select() // ->toArray(); return $data; } /** * 导出套餐订单商品列表 * @param array $param * @author: zjwhust * @Time: 2021/10/15 13:51 */ public function orderBagExport(array $param) { $order_goods_ids = $param['order_goods_id']; $data['header'] = ['序号', '订单编号', '套餐商品名称', '套餐商品编码', '套餐商品规格','套餐商品数量','供应商名称', '收件人', '联系方式', '收货地址', '物流公司', '物流单号','导出状态','商品名称','商品SKU编码','商品规格']; $data['filename'] = '订单商品导出'; $data['data'] = []; // 设置订单类型条件 // 获取数据列表 $query = $this->with(['orderM' => ['address']]) ->alias('order_goods') ->field('order_goods.*,goods.provider_id,provider.provider_name,order.order_no') ->leftJoin('order', 'order_goods.order_id = order.order_id') ->leftJoin('order_address','order_address.order_id = order.order_id') ->leftJoin('goods','order_goods.goods_id = goods.goods_id') ->leftJoin('provider','goods.provider_id = provider.provider_id') ->where('order_goods.goods_type',30) ->whereIn('order_goods_id',$order_goods_ids) ->hidden(['content']); $list = $query->where('order.is_delete', '=', 0) ->order(['order_goods.delivery_time' => 'desc','order_goods.create_time' => 'desc']) ->paginate(); //加入套餐快照后的 foreach ($list as &$item){ $item->goods_packages = OrderGoodsTaocan::where('order_goods_id',$item->order_goods_id)->field('*,1 as total_num')->select(); } //加入套餐快照前的 /* foreach ($list as &$r){ $goods_packages = GoodsPackage::with(['goods']) ->where('goods_id',$r->goods_id)->select(); if (count($goods_packages)){ foreach ($goods_packages as &$pack){ if ($pack->rel_goods_sku_id == 0){ $pack->sku_info = GoodsSku::with(['image'])->where('goods_id',$pack->rel_goods_id)->find(); }else{ $pack->sku_info = GoodsSku::with(['image'])->where('goods_id',$pack->rel_goods_id)->where('goods_sku_id',$pack->rel_goods_sku_id)->find(); } } } $r->goods_packages = $goods_packages; }*/ //按照套餐格式化导出数据 foreach ($list as &$val){ $new_list['order_goods_id'] = $val['order_goods_id']; $new_list['order_no'] = (string)$val['orderM']['order_no']; $new_list['goods_name'] = trim($val['goods_name']); $new_list['goods_sku_no'] = $val['goods_sku_no']; $new_list['goods_props'] = $val['goods_props'][0]['value']['name']??'--';//单规格商品的规格是空 $new_list['total_num'] = $val['total_num']; $new_list['provider_name'] = $val['provider_name']; $new_list['name'] = $val['orderM']['address']['name']; $new_list['phone'] = $val['orderM']['address']['phone']; $new_list['detail'] = $val['orderM']['address']['region']['province'].$val['orderM']['address']['region']['city'].$val['orderM']['address']['region']['region'].$val['orderM']['address']['detail']; $new_list['express_company'] = $val['express_company']; $new_list['express_no'] = $val['express_no']; $new_list['is_export'] = '已导出'; $names = $sku_noes = $sku_specs=[]; if (count($val['goods_packages'])){ foreach ($val['goods_packages'] as $v){ $names[] = $v['goods_name']; $sku_noes[] = $v['goods_sku_no']; $sku_specs[] = $v['goods_props'][0]['value']['name']??'--'; /* $names[] = $v['goods']['goods_name']; $sku_noes[] = $v['sku_info']['goods_sku_no']; $sku_specs[] = $v['sku_info']['goods_props'][0]['value']['name']??'--';*/ } } $new_list['goods_names'] = implode(PHP_EOL,$names); $new_list['sku_noes'] = implode(PHP_EOL,$sku_noes); $new_list['sku_specs'] = implode(PHP_EOL,$sku_specs); $data['data'][] = $new_list; } return $data; //todo 此代码是按照套餐内的商品导出,以备后用,切记切记 /* foreach ($list as &$r){ $goods_packages = GoodsPackage::with(['goods']) ->where('goods_id',$r->goods_id)->select(); if (count($goods_packages)){ foreach ($goods_packages as &$pack){ if ($pack->goods_sku_id == 0){ $pack->sku_info = GoodsSku::with(['image'])->where('goods_id',$pack->goods_id)->find(); }else{ $pack->sku_info = GoodsSku::with(['image'])->where('goods_sku_id',$pack->rel_goods_sku_id)->find(); } } } $r->goods_packages = $goods_packages; } foreach ($list as $arr){ //dd($arr->toArray()); foreach ($arr['goods_packages'] as $pack){ $new_list['order_goods_id'] = $arr['order_goods_id']; $new_list['order_no'] = (string)$arr['order_no']; $new_list['goods_name'] = $pack['goods']['goods_name']; $new_list['goods_sku_no'] = $pack['sku_info']['goods_sku_no']??''; $new_list['goods_props'] = $pack['sku_info']['goods_props'][0]['value']['name']??''; $new_list['total_num'] = $arr['total_num']; $new_list['provider_name'] = $arr['provider_name']; $new_list['name'] = $arr['orderM']['address']['name']; $new_list['phone'] = $arr['orderM']['address']['phone']; $new_list['detail'] = $arr['orderM']['address']['region']['province'].$arr['orderM']['address']['region']['city'].$arr['orderM']['address']['region']['region'].$arr['orderM']['address']['detail']; $new_list['express_company'] = $arr['express_company']; $new_list['express_no'] = $arr['express_no']; $new_list['is_export'] = '已导出'; $data['data'][] = $new_list; } } return $data;*/ } public function clearingMoney($params){ $list = self::field("order_goods_id,clearing_price,total_num")->with([ 'refund'])->whereIn('order_goods_id',$params) ->where('finance_clearing_status','=',self::FINANCE_CLEARING_WAIT) ->select()->toArray(); //->sum("clearing_price*total_num");//todo 需要减去退款数量 $m = 0; foreach ($list as $key=>$arr){ $refund_num = 0; if (isset($arr['refund']) && $arr['refund']['status'] == 20){ $refund_num = $arr['refund']['goods_num']; } $m += ($arr['total_num']-$refund_num)*$arr['clearing_price']; } return $m; } /** * 导出财务结算商品列表 * @param $params * @return array * @author: zjwhust * @Time: 2021/10/15 13:51 */ public function goodsClearingExport($params) { $data['header'] = ['序号','供应商名称','签收时间', '订单编号', '销售门店','配送方式','商品名称','商品规格', '用户姓名','购买件数','结算单价','退货数量','是否退货','结算状态', '结算时间']; $data['filename'] = '订单商品导出'; $data['data'] = []; $filter = $this->getQueryFilter($params); //$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') $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') ->with([ 'provider','refund']) ->alias('order_goods') ->leftJoin('user', 'order_goods.user_id = user.user_id') ->leftJoin('order', 'order_goods.order_id = order.order_id') ->leftJoin('provider','order_goods.provider_id = provider.provider_id') ->leftJoin('shops','order_goods.shop_id = shops.shop_id') ->where($filter) ->where('order_goods.provider_settlement_time','>',0) ->where('order_goods.finance_clearing_status','<>',self::FINANCE_CLEARING_MISS) ->hidden(['content']); $query = $query->where('order.is_delete', '=', 0)->select(); $query = $query?$query->toArray():[]; //dd($query); //todo 缺少退货数量,是否退货 foreach ($query as $key=>$arr){ $new_list['order'] = $key+1; $new_list['provider_name'] = $arr['provider_name']; $new_list['receipt_time'] = (string)$arr['receipt_time']; $new_list['order_no'] = (string)$arr['order_no']; $new_list['shop_name'] = $arr['shop_name']; $new_list['delivery_type'] = $arr['delivery_type']==10?'快递配送':'门店自提'; $new_list['goods_name'] = $arr['goods_name']; //$new_list['goods_props'] = $arr['goods_props'][0]['group']['name'].'-'.$arr['goods_props'][0]['value']['name']??''; $new_list['goods_props'] = $arr['goods_props'][0]['value']['name']??''; $new_list['nick_name'] = $arr['nick_name']; $new_list['total_num'] = $arr['total_num']; $new_list['clearing_price'] = $arr['clearing_price'];//结算单价 $refund_num = 0; if (isset($arr['refund']) && $arr['refund'] && $arr['refund']['status'] == 20){ $refund_num = $arr['refund']['goods_num']; } $new_list['refund_goods_num'] = $refund_num;//退货数量 //$new_list['express_price'] = $arr['express_price'];//运费金额 //$new_list['total_clearing_price'] = ($arr['total_num']-$refund_num)*$arr['clearing_price'] + $arr['express_price'];//总结算金额 $new_list['has_refund_act'] = $arr['has_refund_act']==0?'否':'是'; $new_list['finance_clearing_status'] = $arr['finance_clearing_status']==1?'待结算':'已结算'; $new_list['finance_clearing_time'] = strtotime($arr['finance_clearing_time'])==0 ? '-':$arr['finance_clearing_time'] ; $data['data'][] = $new_list; } //dd($data['data']); return $data; } /** * 计算供应商的待结算佣金 * @param int $params 供应商ID * @return float */ public static function waitClearingMoney($params){ return self::where('provider_id',$params) ->where('finance_clearing_status','=',self::FINANCE_CLEARING_WAIT) ->sum("clearing_price*total_num"); } }