1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027 |
- <?php
- // +----------------------------------------------------------------------
- // | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ]
- // +----------------------------------------------------------------------
- // | Copyright (c) 2017~2021 https://www.yiovo.com All rights reserved.
- // +----------------------------------------------------------------------
- // | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
- // +----------------------------------------------------------------------
- // | Author: 萤火科技 <admin@yiovo.com>
- // +----------------------------------------------------------------------
- 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\library\wechat\WxPay;
- 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;
- }
- //获取需要微信发货的订单商品,wx_delivery_status=10未微信发货,20已微信发货
- public function getNeedToWxDelivery()
- {
- //return $this->where(['order_goods_id'=>91])->select()->toArray();
- return $this->where(['delivery_status' => DeliveryStatusEnum::DELIVERED, 'receipt_status' => ReceiptStatusEnum::NOT_RECEIVED,'wx_delivery_status' => 10])->limit(50)->select()->toArray();
- }
- /**
- * 获取待发货数量
- */
- 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");
- }
- }
|