1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423 |
- <?php
- // +----------------------------------------------------------------------
- // | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ]
- // +----------------------------------------------------------------------
- // | Copyright (c) 2017~2021 https://www.yiovo.com All rights reserved.
- // +----------------------------------------------------------------------
- // | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
- // +----------------------------------------------------------------------
- // | Author: 萤火科技 <admin@yiovo.com>
- // +----------------------------------------------------------------------
- declare (strict_types=1);
- namespace app\api\model;
- use app\api\model\Goods as GoodsModel;
- use app\api\model\kj\KjActivityGood;
- use app\api\model\kj\KjActivityJoin;
- use app\api\model\OrderGoods as OrderGoodsModel;
- use app\api\model\Setting as SettingModel;
- use app\api\model\GoodsSku as GoodsSkuModel;
- use app\api\model\user\CommissionsDetail as CommissionsDetailApi;
- use app\api\model\user\CommissionsDetail;
- use app\api\service\User as UserService;
- use app\api\service\Payment as PaymentService;
- use app\api\service\order\PaySuccess as OrderPaySuccesService;
- use app\api\service\order\source\Factory as OrderSourceFactory;
- use app\common\enum\order\PayType;
- use app\common\enum\order\refund\RefundStatus as RefundStatusEnum;
- use app\common\model\Order as OrderModel;
- use app\common\service\Order as OrderService;
- use app\common\enum\Setting as SettingEnum;
- use app\common\enum\OrderType as OrderTypeEnum;
- use app\common\enum\order\PayType as OrderPayTypeEnum;
- use app\common\enum\order\PayStatus as PayStatusEnum;
- use app\common\enum\order\OrderStatus as OrderStatusEnum;
- use app\common\enum\order\ReceiptStatus as ReceiptStatusEnum;
- use app\common\enum\order\DeliveryStatus as DeliveryStatusEnum;
- use app\common\library\helper;
- use app\common\exception\BaseException;
- use app\common\model\groupbuy\GroupBuyJoin;
- use app\common\model\groupbuy\GroupBuyActivity;
- use app\common\model\groupbuy\GroupBuyGoods;
- use app\common\model\groupbuy\GroupBuyHelp;
- use app\common\model\groupbuylb\GroupBuyLbJoin;
- use app\common\model\groupbuylb\GroupBuyLbActivity;
- use app\common\model\groupbuylb\GroupBuyLbGoods;
- use app\common\model\groupbuylb\GroupBuyLbHelp;
- use app\common\model\ms\MsActivityGood;
- use app\common\model\ms\MsActivity;
- use app\common\enum\order\OrderSource as OrderSourceEnum;
- use app\api\model\za\{ZaActivityGood,ZaActivityRelation,ZaActivity};
- /**
- * 订单模型
- * Class Order
- * @package app\api\model
- */
- class Order extends OrderModel
- {
- /**
- * 隐藏字段
- * @var array
- */
- protected $hidden = [
- 'store_id',
- 'update_time'
- ];
- /**
- * 追加字段
- * @var array
- */
- protected $append = [
- 'state_text', // 售后单状态文字描述
- 'state_value', // 售后状态码 20已取消 30已完成 11待支付 12待收货未发货 13待收货已发货
- 'djs_time', // 待支付倒计时(时间戳)
- 'dsh_time', // 待收货倒计时(时间戳)
- ];
- /**
- * 待支付订单详情
- * @param string $orderNo 订单号
- * @return null|static
- */
- public static function getPayDetail(string $orderNo)
- {
- return self::detail(['order_no' => $orderNo, 'pay_status' => 10, 'is_delete' => 0], ['goods', 'user']);
- }
- /**
- * 订单支付事件
- * @param int $payType
- * @return bool
- */
- public function onPay(int $payType = OrderPayTypeEnum::WECHAT)
- {
- // 判断订单状态
- $orderSource = OrderSourceFactory::getFactory($this['order_source']);
- if (!$orderSource->checkOrderStatusOnPay($this)) {
- $this->error = $orderSource->getError();
- return false;
- }
- // 余额支付
- if ($payType == OrderPayTypeEnum::BALANCE) {
- return $this->onPaymentByBalance($this['order_no']);
- }
- return true;
- }
- /**
- * 构建支付请求的参数
- * @param self $order 订单信息
- * @param string $payType 订单支付方式
- * @return array
- * @throws BaseException
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\DbException
- * @throws \think\db\exception\ModelNotFoundException
- */
- public function onOrderPayment(self $order, int $payType)
- {
- if ($payType == OrderPayTypeEnum::WECHAT) {
- if($order['order_source']!=OrderTypeEnum::ZA){
- return $this->onPaymentByWechat($order);
- }
- return $this->onPrePayByWechat($order,$order['order_source']);
- }
- return [];
- }
- // 预调起支付
- public function onPrePayByWechat(array $order,$order_type){
- return PaymentService::wechat(
- $order['order_id'],
- $order['order_no'],
- $order['pay_price'],
- $order_type
- // OrderTypeEnum::ORDER
- );
- }
- /**
- * 构建微信支付请求
- * @param self $order 订单详情
- * @return array
- * @throws BaseException
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\DbException
- * @throws \think\db\exception\ModelNotFoundException
- */
- protected function onPaymentByWechat(self $order)
- {
- return PaymentService::wechat(
- $order['order_id'],
- $order['order_no'],
- $order['pay_price'],
- OrderTypeEnum::ORDER
- );
- }
- /**
- * 立即购买:获取订单商品列表
- * @param int $goodsId 商品ID
- * @param string $goodsSkuId 商品SKU
- * @param int $goodsNum 购买数量
- * @param int $staffUserId 分享链接用户ID 可不传
- * @return mixed
- * @throws BaseException
- */
- public function getOrderGoodsListByNow(int $goodsId, string $goodsSkuId, int $goodsNum, int $staffUserId = 0)
- {
- // 获取商品列表
- $model = new GoodsModel;
- $goodsList = $model->getListByIdsFromApi([$goodsId]);
- if ($goodsList->isEmpty()) {
- throwError('未找到商品信息2');
- }
-
- // 隐藏冗余的属性
- $goodsList->hidden(array_merge($model->hidden, ['content', 'goods_images', 'images']));
- // 返回商品处理
- // 获取链接分享者的用户ID和店铺ID
- $data = $this->getStaffUserId($staffUserId);
-
- foreach ($goodsList as &$item) {
- // 商品sku信息
- $item['skuInfo'] = GoodsSkuModel::detail($item['goods_id'], $goodsSkuId);
- // 商品单价
- $item['goods_price'] = $item['skuInfo']['goods_price'];
- // 商品购买数量
- $item['total_num'] = $goodsNum;
- // 商品SKU索引
- $item['goods_sku_id'] = $item['skuInfo']['goods_sku_id'];
- // 商品购买总金额
- $item['total_price'] = helper::bcmul($item['goods_price'], $goodsNum);
- $item['staffUserId'] = $data['staffUserId'];
- $item['shopId'] = $data['shopId'];
- $item['distributorRadio'] = $data['distributorRadio'];
- }
- return $goodsList;
- }
- /**
- * 立即购买:获取订单商品列表
- * @param int $goodsId 商品ID
- * @param string $goodsSkuId 商品SKU
- * @param int $goodsNum 购买数量
- * @param int $bargainId 砍价活动ID
- * @return mixed
- * @throws BaseException
- */
- public function getOrderGoodsZaListByNow(int $goodsId, string $goodsSkuId, int $goodsNum, int $zaGoodsId,int $staffUserId = 0,bool $isReceive = false)
- {
- // 获取商品列表
- $model = new GoodsModel;
- $goodsList = $model->getListByIdsFromApi([$goodsId]);
- if ($goodsList->isEmpty()) {
- throwError('未找到商品信息');
- }
- //获取砍价数据
- $user = UserService::getCurrentLoginUser(true);
- $zaGoods = ZaActivityGood::where('goods_id',$goodsId)->where('id',$zaGoodsId)->find();
- if(empty($zaGoods)){
- throwError('未找到买一赠一信息');
- }
- if(!$isReceive){
- if($zaGoods['stock_num']<=1){
- throwError('该买一赠一商品库存不足');
- }
- }
-
- // 隐藏冗余的属性
- $goodsList->hidden(array_merge($model->hidden, ['content', 'goods_images', 'images']));
- // 返回商品处理
- $data = $this->getStaffUserId($staffUserId);
- foreach ($goodsList as &$item) {
- // 商品sku信息
- $item['skuInfo'] = GoodsSkuModel::detail($item['goods_id'], $goodsSkuId);
- // 商品单价
- $item['goods_price'] = $item['skuInfo']['goods_price'];
- // 商品购买数量
- $item['total_num'] = $goodsNum;
- // 商品SKU索引
- $item['goods_sku_id'] = $item['skuInfo']['goods_sku_id'];
- // 商品购买总金额
- $item['total_price'] = helper::bcmul($item['goods_price'], $goodsNum);
- // 获取砍价活动的最终金额
- // $item['bargain_price'] = $KjActivityJoin['kj_price'];
- // $item['bargain_id'] = $bargainId;
- $item['za_goods_id'] = $zaGoods['id'];
- $item['staffUserId'] = $data['staffUserId'];
- $item['shopId'] = $data['shopId'];
- $item['distributorRadio'] = $data['distributorRadio'];
- }
- return $goodsList;
- }
- /**
- * 立即购买:获取订单商品列表
- * @param int $goodsId 商品ID
- * @param string $goodsSkuId 商品SKU
- * @param int $goodsNum 购买数量
- * @param int $bargainId 砍价活动ID
- * @return mixed
- * @throws BaseException
- */
- public function getOrderGoodsBargainListByNow(int $goodsId, string $goodsSkuId, int $goodsNum, int $bargainId,int $staffUserId = 0)
- {
- // 获取商品列表
- $model = new GoodsModel;
- $goodsList = $model->getListByIdsFromApi([$goodsId]);
- if ($goodsList->isEmpty()) {
- throwError('未找到商品信息2');
- }
- //获取砍价数据
- $user = UserService::getCurrentLoginUser(true);
- $KjActivityJoin = KjActivityJoin::where('user_id',$user['user_id'])->find($bargainId);
- if (!$KjActivityJoin) {
- throwError('未找到砍价信息');
- }
- if($KjActivityJoin['is_submit_order']|| (strtotime($KjActivityJoin['end_time'])+3600*48)<time()){
- // if($KjActivityJoin['is_submit_order']|| (strtotime($KjActivityJoin['end_time'])+300)<time()){
- throwError('该砍价记录已下单或超过下单时间');
- }
- $KjActivityGood = KjActivityGood::where(['goods_id'=>$goodsId,'activity_id'=>$KjActivityJoin['activity_id']])->find();
- if($KjActivityGood['limit_stock']-$KjActivityGood['purchase_stock']<=0){
- throwError('该砍价商品没有库存了');
- }
- // 隐藏冗余的属性
- $goodsList->hidden(array_merge($model->hidden, ['content', 'goods_images', 'images']));
- // 返回商品处理
- $data = $this->getStaffUserId($staffUserId);
- foreach ($goodsList as &$item) {
- // 商品sku信息
- $item['skuInfo'] = GoodsSkuModel::detail($item['goods_id'], $goodsSkuId);
- // 商品单价
- $item['goods_price'] = $item['skuInfo']['goods_price'];
- // 商品购买数量
- $item['total_num'] = $goodsNum;
- // 商品SKU索引
- $item['goods_sku_id'] = $item['skuInfo']['goods_sku_id'];
- // 商品购买总金额
- $item['total_price'] = helper::bcmul($item['goods_price'], $goodsNum);
- // 获取砍价活动的最终金额
- $item['bargain_price'] = $KjActivityJoin['kj_price'];
- $item['bargain_id'] = $bargainId;
- $item['bargain_activity_id'] = $KjActivityJoin['activity_id'];
- $item['staffUserId'] = $data['staffUserId'];
- $item['shopId'] = $data['shopId'];
- $item['distributorRadio'] = $data['distributorRadio'];
-
- }
- return $goodsList;
- }
- //当前秒杀活动商品买了多少件
- public function miaoshaHaveBuyCnt($ms_goods_id,$user_id){
- $order_id_arr = Order::where('order_source',OrderSourceEnum::MIAOSHA)->where('order_source_id',$ms_goods_id)->where('user_id', $user_id)->where('pay_status',PayStatusEnum::SUCCESS)->column("order_id");
- if(count($order_id_arr)==0){
- return 0;
- }
- else if(count($order_id_arr)>0){
- $total_num = OrderGoodsModel::where("order_id",'in',$order_id_arr)->sum('total_num');
- return $total_num;
- }
- }
- /**
- * 立即购买:获取订单商品列表
- * @param int $goodsId 商品ID
- * @param string $goodsSkuId 商品SKU
- * @param int $goodsNum 购买数量
- * @param int $bargainId 砍价活动ID
- * @return mixed
- * @throws BaseException
- */
- public function getOrderGoodsMiaoshaListByNow(int $goodsId, string $goodsSkuId, int $goodsNum, int $msId,int $staffUserId = 0)
- {
- // 获取商品列表
- $model = new GoodsModel;
- $goodsList = $model->getListByIdsFromApi([$goodsId]);
- if ($goodsList->isEmpty()) {
- throwError('未找到商品信息2');
- }
- //获取秒杀数据
- $user = UserService::getCurrentLoginUser(true);
- $msGood = MsActivityGood::where('id',$msId)->find();
- if (!$msGood) {
- throwError('未找到秒杀信息');
- }
- if($goodsNum>$msGood->stock_num){
- throwError("库存不足");
- }
- if(time()>strtotime($msGood->end_time)){
- throwError("秒杀活动已结束");
- }
- $activity = MsActivity::where("id",$msGood->ms_activity_id)->find();
- if($activity->is_up==0||$activity->audit_status!=1){
- throwError("秒杀活动已结束!");
- }
- if($msGood->limit_mount>0&&$goodsNum>$msGood->limit_mount){
- throwError("超过限购数量");
- }
- if($msGood->limit_mount>0){
- $order_id_arr = Order::where('order_source',OrderSourceEnum::MIAOSHA)->where('order_source_id',$msGood->id)->where('user_id', $user->user_id)->where('pay_status',PayStatusEnum::SUCCESS)->column("order_id");
- if(count($order_id_arr)>0){
- $total_num = OrderGoodsModel::where("order_id",'in',$order_id_arr)->sum('total_num');
- if($total_num>=$msGood->limit_mount){
- throwError("限购".$msGood->limit_mount."件!");
- }
- }
-
- }
-
- // 隐藏冗余的属性
- $goodsList->hidden(array_merge($model->hidden, ['content', 'goods_images', 'images']));
- // 返回商品处理
- $data = $this->getStaffUserId($staffUserId);
- foreach ($goodsList as &$item) {
- // 商品sku信息
- $item['skuInfo'] = GoodsSkuModel::detail($item['goods_id'], $goodsSkuId);
- // 商品单价
- $item['goods_price'] = $item['skuInfo']['goods_price'];
- // 商品购买数量
- $item['total_num'] = $goodsNum;
- // 商品SKU索引
- $item['goods_sku_id'] = $item['skuInfo']['goods_sku_id'];
- // 商品购买总金额
- $item['total_price'] = helper::bcmul($item['goods_price'], $goodsNum);
- // 获取秒杀活动的最终金额
- $item['ms_price'] = $msGood['ms_price'];
- $item['ms_id'] = $msId;
- $item['staffUserId'] = $data['staffUserId'];
- $item['shopId'] = $data['shopId'];
- $item['distributorRadio'] = $data['distributorRadio'];
- $item['limit_mount'] = $msGood['limit_mount'];
- }
- return $goodsList;
- }
- /**
- * 立即购买:获取订单商品列表
- * @param int $goodsId 商品ID
- * @param string $goodsSkuId 商品SKU
- * @param int $goodsNum 购买数量
- * @param int $activity_id 拼团活动ID
- * @return mixed
- * @throws BaseException
- */
- public function getOrderGoodsGroupListByNow(int $goodsId, string $goodsSkuId, int $goodsNum, int $joinId=0,int $activity_id=0,int $staffUserId = 0)
- {
- // 获取商品列表
- $model = new GoodsModel;
- $goodsList = $model->getListByIdsFromApi([$goodsId]);
- if ($goodsList->isEmpty()) {
- throwError('未找到商品信息');
- }
- //获取砍价数据
- $user = UserService::getCurrentLoginUser(true);
- $now = Date("Y-m-d H:i:s",time());
- if($joinId>0){
- $join = GroupBuyJoin::where('id',$joinId)->lock('for update')->find();
- $helpCnt = GroupBuyHelp::where("join_id",$join->id)->where('pay_state','in',[0,1])->count();
- $have = GroupBuyHelp::where("join_id",$join->id)->where('user_id',$user->user_id)->where('pay_state','in',[0,1])->find();
- if($have&&$have->pay_state==0){
- throwError("你有一个待支付的拼团");
- }
- if($have&&$have->pay_state==1){
- throwError("你已经参与该拼团");
- }
- if($helpCnt>=$join->people_count){
- throwError("拼团人数已够");
- }
- if($now>$join->end_time){
- throwError('拼团已结束');
- }
- if($join->status==1){
- throwError("拼团已完成");
- }
- if($join->status==2){
- throwError("拼团结束");
- }
- $groupgoods = GroupBuyGoods::where('group_buy_activity_id',$join['group_buy_activity_id'])->find();
- if(empty($groupgoods)){
- throwError('找不到商品');
- }
- if($groupgoods->goods_id!=$goodsId){
- throwError('商品id跟活动商品id对不上');
- }
- if($goodsNum>$groupgoods->limit_mount){
- throwError('超过限购数量');
- }
- if($goodsNum>$groupgoods->residue_stock){
- throwError('拼团活动库存不足');
- }
- }
- else if($activity_id>0){
- $activity = GroupBuyActivity::where("id",$activity_id)->find();
- if(empty($activity)){
- throwError("找不到拼团活动");
- }
- if($now>$activity->end_time){
- throwError('拼团活动已结束');
- }
- if($activity->audit_status!=1||$activity->status!=1){
- throwError('拼团活动不存在');
- }
- $join = GroupBuyJoin::where('user_id',$user->user_id)->where('group_buy_activity_id',$activity_id)->where('status',0)->where('end_time',">",$now)->find();
- if($join){
- throwError('你有一个拼团正在进行中');
- }
- $groupgoods = GroupBuyGoods::where('group_buy_activity_id',$activity_id)->find();
- if(empty($groupgoods)){
- throwError('找不到商品');
- }
- if($groupgoods->goods_id!=$goodsId){
- throwError('商品id跟活动商品id对不上');
- }
- if($goodsNum>$groupgoods->limit_mount){
- throwError('超过限购数量');
- }
- //判断库存数量
- if($groupgoods->limit_stock - $groupgoods->purchase_stock <=0){
- throwError('活动已结束~');
- }
- }
- if(empty($groupgoods)){
- throwError("找不到商品");
- }
- // 隐藏冗余的属性
- $goodsList->hidden(array_merge($model->hidden, ['content', 'goods_images', 'images']));
- // 返回商品处理
- $data = $this->getStaffUserId($staffUserId);
- foreach ($goodsList as &$item) {
- // 商品sku信息
- $item['skuInfo'] = GoodsSkuModel::detail($item['goods_id'], $goodsSkuId);
- // 商品单价
- $item['goods_price'] = $item['skuInfo']['goods_price'];
- // 商品购买数量
- $item['total_num'] = $goodsNum;
- // 商品SKU索引
- $item['goods_sku_id'] = $item['skuInfo']['goods_sku_id'];
- // 商品购买总金额
- $item['total_price'] = helper::bcmul($item['goods_price'], $goodsNum);
- // 获取最终拼团单价金额
- $item['group_price'] = $groupgoods['group_price'];
- $item['group_buy_id'] = $joinId>0 ? $join['group_buy_activity_id'] : $activity_id;
- $item['join_id'] = $joinId;
- $item['limit_mount'] = $groupgoods['limit_mount'];
- $item['staffUserId'] = $data['staffUserId'];
- $item['shopId'] = $data['shopId'];
- $item['distributorRadio'] = $data['distributorRadio'];
- }
- return $goodsList;
-
- }
- /**拼团裂变
- * 立即购买:获取订单商品列表
- * @param int $goodsId 商品ID
- * @param string $goodsSkuId 商品SKU
- * @param int $goodsNum 购买数量
- * @param int $bargainId 砍价活动ID
- * @return mixed
- * @throws BaseException
- */
- public function getOrderGoodsGroupLbListByNow(int $goodsId, string $goodsSkuId, int $goodsNum, int $joinId=0,int $activity_id=0)
- {
- // 获取商品列表
- $model = new GoodsModel;
- $goodsList = $model->getListByIdsFromApi([$goodsId]);
- if ($goodsList->isEmpty()) {
- throwError('未找到商品信息');
- }
- //获取砍价数据
- $user = UserService::getCurrentLoginUser(true);
- $now = Date("Y-m-d H:i:s",time());
- if($joinId>0){
- $join = GroupBuyLbJoin::where('id',$joinId)->lock('for update')->find();
- $helpCnt = GroupBuyLbHelp::where("join_id",$join->id)->where('pay_state','in',[0,1])->count();
- $have = GroupBuyLbHelp::where("join_id",$join->id)->where('user_id',$user->user_id)->where('pay_state','in',[0,1])->find();
- if($have&&$have->pay_state==0){
- throwError("你有一个待支付的拼团");
- }
- if($have&&$have->pay_state==1){
- throwError("你已经参与该拼团");
- }
- if($helpCnt>=$join->people_count){
- throwError("拼团人数已够");
- }
- if($now>$join->end_time){
- throwError('拼团已结束');
- }
- if($join->status==1){
- throwError("拼团已完成");
- }
- if($join->status==2){
- throwError("拼团结束");
- }
- $groupgoods = GroupBuyLbGoods::where('group_buy_lb_activity_id',$join['group_buy_lb_activity_id'])->find();
- if(empty($groupgoods)){
- throwError('找不到商品');
- }
- if($groupgoods->goods_id!=$goodsId){
- throwError('商品id跟活动商品id对不上');
- }
- if($goodsNum>$groupgoods->limit_mount){
- throwError('超过限购数量');
- }
- }
- else if($activity_id>0){
- $activity = GroupBuyLbActivity::where("id",$activity_id)->find();
- if(empty($activity)){
- throwError("找不到拼团活动");
- }
- if($now>$activity->end_time){
- throwError('拼团活动已结束');
- }
- if($activity->audit_status!=1||$activity->status!=1){
- throwError('拼团活动不存在');
- }
- $join = GroupBuyLbJoin::where('user_id',$user->user_id)->where('group_buy_lb_activity_id',$activity_id)->where('status',0)->where('end_time',">",$now)->find();
- if($join){
- // throwError('你有一个拼团正在进行中');
- }
- $groupgoods = GroupBuyLbGoods::where('group_buy_lb_activity_id',$activity_id)->find();
- if(empty($groupgoods)){
- throwError('找不到商品');
- }
- if($groupgoods->goods_id!=$goodsId){
- throwError('商品id跟活动商品id对不上');
- }
- if($goodsNum>$groupgoods->limit_mount){
- throwError('超过限购数量');
- }
- //判断库存数量
- if($groupgoods->limit_stock - $groupgoods->purchase_stock <=0){
- throwError('活动已结束~');
- }
- }
- if(empty($groupgoods)){
- throwError("找不到商品");
- }
- // 隐藏冗余的属性
- $goodsList->hidden(array_merge($model->hidden, ['content', 'goods_images', 'images']));
- // 返回商品处理
- foreach ($goodsList as &$item) {
- // 商品sku信息
- $item['skuInfo'] = GoodsSkuModel::detail($item['goods_id'], $goodsSkuId);
- // 商品单价
- $item['goods_price'] = $item['skuInfo']['goods_price'];
- // 商品购买数量
- $item['total_num'] = $goodsNum;
- // 商品SKU索引
- $item['goods_sku_id'] = $item['skuInfo']['goods_sku_id'];
- // 商品购买总金额
- $item['total_price'] = helper::bcmul($item['goods_price'], $goodsNum);
- // 获取最终拼团单价金额
- $item['group_price'] = $groupgoods['group_price'];
- $item['join_id'] = $joinId;
- $item['group_buy_lb_id'] = $joinId>0 ? $join['group_buy_lb_activity_id'] : $activity_id;
- $item['limit_mount'] = $groupgoods['limit_mount'];
- }
- return $goodsList;
-
- }
- /**
- * 余额支付标记订单已支付
- * @param string $orderNo 订单号
- * @return bool
- */
- public function onPaymentByBalance(string $orderNo)
- {
- // 获取订单详情
- $service = new OrderPaySuccesService($orderNo);
- // 发起余额支付
- $status = $service->onPaySuccess(OrderPayTypeEnum::BALANCE);
- if (!$status) {
- $this->error = $service->getError();
- }
- return $status;
- }
- /**
- * 积分兑换支付标记订单已支付
- * @param string $orderNo 订单号
- * @return bool
- */
- public function onPaymentByAccumulatePoints(string $orderNo)
- {
- // 获取订单详情
- $service = new OrderPaySuccesService($orderNo);
- // 发起积分支付
- $status = $service->onPaySuccess(OrderPayTypeEnum::EXCHANGE);
- if (!$status) {
- $this->error = $service->getError();
- }
- return $status;
- }
- /**
- * 获取用户订单列表
- * @param string $type 订单类型 (all全部 payment待付款 delivery待发货 received待收货 completed已完成 comment待评价)
- * @param boolean $isExchange 是否积分兑换订单
- * @return \think\Paginator
- * @throws BaseException
- * @throws \think\db\exception\DbException
- */
- public function getList($type = 'all',$isExchange = false)
- {
- /* // 筛选条件
- $filter = [];
- // 订单数据类型
- switch ($type) {
- case 'all':
- break;
- case 'payment':
- $filter['pay_status'] = PayStatusEnum::PENDING;
- $filter['order_status'] = OrderStatusEnum::NORMAL;
- break;
- // case 'delivery':
- // $filter['pay_status'] = PayStatusEnum::SUCCESS;
- // $filter['delivery_status'] = DeliveryStatusEnum::NOT_DELIVERED;
- // $filter['order_status'] = OrderStatusEnum::NORMAL;
- // break;
- case 'received':
- $filter['pay_status'] = PayStatusEnum::SUCCESS;
- // $filter['delivery_status'] = DeliveryStatusEnum::DELIVERED;
- $filter['receipt_status'] = ReceiptStatusEnum::NOT_RECEIVED;
- $filter['order_status'] = OrderStatusEnum::NORMAL;
- break;
- case 'completed':
- $filter['is_comment'] = 0;
- $filter['order_status'] = OrderStatusEnum::COMPLETED;
- break;
- case 'comment':
- $filter['is_comment'] = 0;
- $filter['order_status'] = OrderStatusEnum::COMPLETED;
- break;
- }*/
- $filter = $this->getFilter($type);
- $rate = 0;
- if ($isExchange){
- $filter['pay_type'] = PayType::EXCHANGE;
- $rate = SettingModel::getItem('points_rate')['points_2_money'];
- }
- // 当前用户ID
- $userId = UserService::getCurrentLoginUserId();
- // 查询列表数据
- return $this->with(['goods.image'])
- ->where($filter)
- ->where('user_id', '=', $userId)
- ->where('is_delete', '=', 0)
- ->order(['create_time' => 'desc'])
- ->paginate(15)->each(function($e) use ($isExchange,$rate){
- $e['goods_total_num'] = 0;
- $e['exchanged_points'] = 0;
- if ($isExchange){
- $e['exchanged_points'] = bcmul($e['total_price'], $rate,0);
- }
- foreach ($e['goods'] as $good){
- $e['goods_total_num'] += $good['total_num'];
- }
- $e['za'] =null;
- if($e['order_source']==OrderSourceEnum::ZA){
- //OrderPayTypeEnum::ACTIVITY 这个类型肯定是领取人
- if($e['pay_type']!=OrderPayTypeEnum::ACTIVITY){
- $za = ZaActivityRelation::where("order_id",$e['order_id'])->where('is_pay',1)->field('sign_str,receive_state,expire_time,is_pay,za_activity_id')->find();
- if($za){
- $now = Date("Y-m-d H:i:s",time());
- $data['is_expire'] =$now > $za->expire_time ? true: false;
- $data['sign_str'] = $za->sign_str;
- $data['is_receive'] = $za->receive_state;
- $data['expire_time'] = $za->expire_time;
- $data['share_title'] = ZaActivity::where("id",$za->za_activity_id)->value("share_title")??'';
- $e['za'] = $data;
- }
-
- }
- }
- });
- }
- public function getFilter($type){
- // 筛选条件
- $filter = [];
- // 订单数据类型
- switch ($type) {
- case 'all':
- break;
- case 'payment':
- $filter['pay_status'] = PayStatusEnum::PENDING;
- $filter['order_status'] = OrderStatusEnum::NORMAL;
- break;
- // case 'delivery':
- // $filter['pay_status'] = PayStatusEnum::SUCCESS;
- // $filter['delivery_status'] = DeliveryStatusEnum::NOT_DELIVERED;
- // $filter['order_status'] = OrderStatusEnum::NORMAL;
- // break;
- case 'received':
- $filter['pay_status'] = PayStatusEnum::SUCCESS;
- // $filter['delivery_status'] = DeliveryStatusEnum::DELIVERED;
- $filter['receipt_status'] = ReceiptStatusEnum::NOT_RECEIVED;
- $filter['order_status'] = OrderStatusEnum::NORMAL;
- break;
- case 'completed':
- // $filter['is_comment'] = 0;
- $filter['order_status'] = OrderStatusEnum::COMPLETED;
- break;
- case 'comment':
- $filter['is_comment'] = 0;
- $filter['order_status'] = OrderStatusEnum::COMPLETED;
- break;
- case 'cancel':
- $filter['order_status'] = OrderStatusEnum::CANCELLED;
- break;
- case 'close':
- $filter['order_status'] = OrderStatusEnum::CLOSE;
- break;
- }
- return $filter;
- }
- /**
- * 取消订单
- * @return bool|mixed
- */
- public function cancel()
- {
- if ($this['pay_status'] == PayStatusEnum::SUCCESS) {
- $this->error = '已支付订单不可取消';
- return false;
- }
- if ($this['delivery_status'] == DeliveryStatusEnum::DELIVERED) {
- $this->error = '已发货订单不可取消';
- return false;
- }
- // 订单取消事件
- return $this->transaction(function () {
- // 订单是否已支付
- $isPay = $this['pay_status'] == PayStatusEnum::SUCCESS;
- // 订单取消事件
- $isPay == false && OrderService::cancelEvent($this);
- // 更新订单状态: 已付款的订单设置为"待取消", 等待后台审核
- return $this->save(['order_status' => $isPay ? OrderStatusEnum::APPLY_CANCEL : OrderStatusEnum::CANCELLED]);
- });
- }
- /**
- * 删除指定订单记录
- * @return bool
- * @throws BaseException
- */
- public function clear()
- {
- // 验证订单是否合法
- // 条件1: 订单必须已取消
- // 条件2: 订单必须已完成
- // 条件3: 订单必须已关闭
- if ($this['order_status'] != 20 && $this['order_status'] != 30 && $this['order_status'] != 40) {
- $this->error = '该订单不能删除';
- return false;
- }
- // 获取当前用户ID
- $userId = UserService::getCurrentLoginUserId();
- // 设置更新条件
- $where = [['user_id', '=', $userId], ['order_id', '=', $this['order_id']]];
- // 更新记录
- return static::updateBase(['is_delete'=>1],$where);
- }
- /**
- * 确认收货
- * @return bool|mixed
- */
- public function receipt()
- {
- // 验证订单是否合法
- // 条件1: 订单必须已发货
- // 条件2: 订单必须未收货
- if ($this['delivery_status'] != 20 || $this['receipt_status'] != 10) {
- $this->error = '该订单不合法';
- return false;
- }
- return $this->transaction(function () {
- // 更新订单状态
- $status = $this->save([
- 'receipt_status' => 20,
- 'receipt_time' => time(),
- 'order_status' => $this['order_status']==10 ? 30 : $this['order_status'],
- ]);
- // 执行订单完成后的操作
- // $OrderCompleteService = new OrderCompleteService(OrderTypeEnum::ORDER);
- // $OrderCompleteService->complete([$this], static::$storeId);
- return $status;
- });
- }
- /**
- * 确认核销并确认收货
- * @return bool|mixed
- */
- public function writeOff()
- {
- // 验证订单是否合法
- // 条件1: 订单必须未过提货截止时间
- if ($this['pickup_deadline'] < date('Y-m-d H:i:s')) {
- $this->error = '该订单已超过提货截止时间';
- return false;
- }
- // 条件1: 订单必须未核销
- // 条件2: 订单必须未收货
- if ($this['hx_status'] != 10 || $this['receipt_status'] != 10) {
- $this->error = '该订单已核销';
- return false;
- }
- if ($this['refund'] && $this['refund']['status'] == 0) {
- $this->error = '该订单在售后中';
- return false;
- }
- if ($this['order_status'] != 10) {
- $this->error = '该订单已取消或已退款';
- return false;
- }
- return $this->transaction(function () {
- // 更新订单状态
- $status = $this->save([
- 'receipt_status' => ReceiptStatusEnum::RECEIVED,//收货状态(10未收货 20已收货)
- 'receipt_time' => time(),//收货时间
- 'delivery_status' => DeliveryStatusEnum::DELIVERED, // 发货状态(10未发货 20已发货)
- 'delivery_time' => time(), // 发货时间
- 'order_status' => 30,//订单状态(10进行中 20取消 21待取消 30已完成)
- 'hx_status' => 20,//核销状态(10未核销 20已核销)',
- 'pickup_time' => time(),//提货时间
- 'hx_user_id' => UserService::getCurrentLoginUserId(),//核销人用户ID
- ]);
- $orderGoodsIds = helper::getArrayColumn($this['goods'],'order_goods_id');
- static::setSignTime($orderGoodsIds,$this['order_id']);
- return $status;
- });
- }
- /**
- * 核销后结算时间
- * @param $orderGoodsIds
- * @param $orderId
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\DbException
- * @throws \think\db\exception\ModelNotFoundException
- * @author: zjwhust
- * @Time: 2021/12/10 14:48
- */
- public static function setSignTime($orderGoodsIds,$orderId){
- // 自动关闭订单的分钟数
- $provider_days = SettingModel::getItem('provider_settlement')['provider_days'];//供应商结算时间
- $refund = SettingModel::getItem('shops');//门店自提订单配置
- $data = [
- 'provider_settlement_time' => time()+$provider_days*86400,
- 'commission_settlement_time' => time()+$refund['commission_days']*86400,
- 'refund_time' => time()+$refund['refund_days']*86400,
- 'auto_receipt_time' => time(),
- 'sign_time' => time(),
- 'receipt_status' => ReceiptStatusEnum::RECEIVED,//收货状态(10未收货 20已收货)
- 'receipt_time' => time(),//收货时间
- 'delivery_status' => DeliveryStatusEnum::DELIVERED, // 发货状态(10未发货 20已发货)
- 'delivery_time' => time(), // 发货时间
- ];
- $dataOrder = [
- 'commission_settlement_time' => time()+$refund['commission_days']*86400,
- 'refund_time' => time()+$refund['refund_days']*86400,
- ];
- //添加测试的时间
- if(env('SERVE_ENV')=='test') {
- $data = [
- 'provider_settlement_time' => time() + 300,//供应商结算开始时间5分钟后
- 'commission_settlement_time' => time() + 600,//分佣结算开始时间10分钟后
- 'refund_time' => time() + 300,//关闭售后时间5分钟
- 'auto_receipt_time' => time(),//自动收货最晚时间5分钟后
- 'sign_time' => time(),//记录签到时间
- 'receipt_status' => 20,//收货状态(10未收货 20已收货)
- 'receipt_time' => time(),//收货时间
- 'delivery_status' => DeliveryStatusEnum::DELIVERED, // 发货状态(10未发货 20已发货)
- 'delivery_time' => time(), // 发货时间
- //售后退款用户退货发货超时5分钟
- ];
- $dataOrder = [
- 'commission_settlement_time' => time() + 600,//分佣结算开始时间10分钟后
- 'refund_time' => time() + 300,//关闭售后时间5分钟
- ];
- }
- OrderGoodsModel::updateBase($data, [['order_goods_id', 'in', $orderGoodsIds]]);
- self::updateBase($dataOrder,['order_id'=>$orderId]);
- }
- /**
- * 获取当前用户订单数量
- * @param string $type 订单类型 (all全部 payment待付款 received待发货 deliver待收货 comment待评价)
- * @return int
- * @throws BaseException
- */
- public function getCount($type = 'all')
- {
- // 筛选条件
- $filter = [];
- // 订单数据类型
- switch ($type) {
- case 'all':
- break;
- case 'payment':
- $filter['pay_status'] = PayStatusEnum::PENDING;
- break;
- case 'received':
- $filter['pay_status'] = PayStatusEnum::SUCCESS;
- $filter['delivery_status'] = DeliveryStatusEnum::DELIVERED;
- $filter['receipt_status'] = ReceiptStatusEnum::NOT_RECEIVED;
- break;
- case 'delivery':
- $filter['pay_status'] = PayStatusEnum::SUCCESS;
- $filter['delivery_status'] = DeliveryStatusEnum::NOT_DELIVERED;
- $filter['order_status'] = OrderStatusEnum::NORMAL;
- break;
- case 'comment':
- $filter['is_comment'] = 0;
- $filter['order_status'] = OrderStatusEnum::COMPLETED;
- break;
- }
- // 当前用户ID
- $userId = UserService::getCurrentLoginUserId();
- // 查询数据
- return $this->where('user_id', '=', $userId)
- ->where('order_status', '<>', 20)
- ->where($filter)
- ->where('is_delete', '=', 0)
- ->count();
- }
- /**
- * 获取分享链接的用户ID
- * @param int $staffUserId
- * @return mixed
- * @author: zjwhust
- * @Time: 2021/9/30 13:32
- */
- private function getStaffUserId( int $staffUserId)
- {
- // 获取当前用户ID
- $user = UserService::getCurrentLoginUser(true);
- $is_staff = 1;
- if($staffUserId<=0 || $staffUserId==$user['user_id']){
- if(in_array($user['role'],[1,99])){
- $staffUserId = $user['upper_user_id'];
- $is_staff = 0;
- }else{
- $staffUserId = 0;
- }
- }
- $data['staffUserId'] = $staffUserId;
- $data['shopId'] = 0;
- $data['distributorRadio'] = 0;
- if ($staffUserId>0) {
- // 获取分享链接的用户信息
- $user_staff = User::detail($staffUserId);
- if($user_staff){
- $data['shopId'] = !in_array($user_staff['role'],[1,99]) ? $user_staff['shop_id'] : $user_staff['bind_shop_id'];//获取分享链接用户的shop_id
- if($user['role']==99){
- $data['distributorRadio'] = SettingModel::getItem(SettingEnum::DISTRIBUTOR)['shopping_discount'];
- }else{
- if($user_staff['role'] == 99 && $is_staff){
- $data['distributorRadio'] = SettingModel::getItem(SettingEnum::DISTRIBUTOR)['shopping_discount'];
- }
- }
- }else{
- if($user['role']==99){
- $data['distributorRadio'] = SettingModel::getItem(SettingEnum::DISTRIBUTOR)['shopping_discount'];
- }
- }
- }else{
- if($user['role']==99){
- $data['distributorRadio'] = SettingModel::getItem(SettingEnum::DISTRIBUTOR)['shopping_discount'];
- }
- }
- return $data;
- }
- /**
- * 获取用户订单详情(含关联数据)
- * @param int $orderId 订单ID
- * @return Order|array|null
- * @throws BaseException
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\DbException
- * @throws \think\db\exception\ModelNotFoundException
- */
- public static function getUserOrderDetail(int $orderId)
- {
- // 关联查询
- $with = [
- 'goods' => ['image', 'refund', 'package'],
- 'address', 'express', 'shops', 'hxUser'
- ];
- // 查询订单记录
- $order = static::getDetail($orderId, $with);
- //重整订单列表结构
- // static::restructureGoods($order);
- //添加订单商品售后状态
- static::refundStatus($order);
- // 订单商品总数量
- $order['orderTotalNum'] = helper::getArrayColumnSum($order['goods'], 'total_num');
- // 该订单是否允许申请售后
- // $order['isAllowRefund'] = static::isAllowRefund($order);
- // 订单是否允许申请开票
- $order['isAllowInvoice'] = static::isAllowInvoice($order);
- return $order;
- }
- // 订单是否允许申请开票
- public static function isAllowInvoice(self $order) {
- if($order['order_source']==OrderSourceEnum::ZA&&$order['pay_type']==OrderPayTypeEnum::ACTIVITY){
- return false;
- }
- if ($order['invoice_deadline'] > 0 && ($order['invoice_deadline'] - time()) > 0) {
- return true;
- }
- return false;
- }
- //重构订单列表逻辑
- public static function restructureGoods(self $order){
- $mj_send_goods_list = [];
- foreach($order['goods'] as $key=>$goods){
- if($goods['master_order_goods_id']>0){
- $mj_send_goods_list[$goods['master_order_goods_id']][] = $goods;
- unset($order['goods'][$key]);
- }
- }
- foreach ($order['goods'] as $good){
- $good['mj_send_goods_list'] = [];
- foreach ($mj_send_goods_list as $key => $list){
- if($good['order_goods_id']==$key){
- $good['mj_send_goods_list'] = $list;
- }
- }
- }
- }
- //处理订单商品当前的售后状态
- public static function refundStatus(self $order){
- $order['is_full_refund'] = true;
- $order['total_amount'] = helper::bcadd($order['total_price'],$order['express_price']);
- foreach($order['goods'] as $goods){
- $goods['order_refund_status_text'] = '';
- $goods['order_refund_status'] = 0;
- if($order['pay_status']==PayStatusEnum::SUCCESS && in_array($order['order_status'],[OrderStatusEnum::NORMAL,OrderStatusEnum::COMPLETED]) && $goods['goods_type']!=20) { //已支付并且不是赠品
- if($goods['is_export'] || $goods['delivery_status'] == DeliveryStatusEnum::DELIVERED){
- $order['is_full_refund'] = false;
- }
- if(($order['is_full_send']==1||$order['is_qc_send_send']==1) && $goods['delivery_status'] == DeliveryStatusEnum::NOT_DELIVERED) {//如果是满就送订单或者全场满件送订单,并且订单商品未发货
- }else{
- $order_refund_status_text = $goods['delivery_status'] == DeliveryStatusEnum::DELIVERED ? '申请售后' : '申请退款';
- if (empty($goods['refund_time']) || $goods['refund_time'] > time()) {//申请售后的时间未过期
- if ($goods['refund']) {
- $order['is_full_refund'] = false;//有了退款申请就不能在全部退款了
- // if ($goods['is_export'] && $goods['refund']['status'] == 0){//导出并且在已退款中
- // $goods['order_refund_status_text'] = '退款中';
- // $goods['order_refund_status'] = 2;
- // }elseif($goods['is_export']){//导出不显示退款按钮
- // $goods['order_refund_status'] = 0;
- // }else
- if ($goods['refund']['status'] == RefundStatusEnum::CANCELLED || $goods['refund']['status'] == RefundStatusEnum::CLOSE) {
- //导出未发货时不显示申请退款状态
- if($goods['is_export'] && $goods['delivery_status'] == DeliveryStatusEnum::NOT_DELIVERED ) continue;
- $goods['order_refund_status_text'] = $order_refund_status_text;
- $goods['order_refund_status'] = 1;
- } elseif($goods['refund']['status'] == RefundStatusEnum::COMPLETED ) {//已完成 不在给第二次申请的机会
- $goods['order_refund_status_text'] = '退款成功';
- $goods['order_refund_status'] = 3;
- }else{
- $goods['order_refund_status_text'] = '退款中';
- $goods['order_refund_status'] = 2;
- }
- } else {
- //导出未发货时不显示申请退款状态
- if($goods['is_export'] && $goods['delivery_status'] == DeliveryStatusEnum::NOT_DELIVERED ) {
- $order['is_full_refund'] = false;
- continue;
- }
- // 门店自提订单未核销时不显示申请退款状态
- if ($order['delivery_type'] == 20 && $order['hx_status'] == 10 && count($order['goods']) > 1) {
- continue;
- }
- $goods['order_refund_status_text'] = $order_refund_status_text;
- $goods['order_refund_status'] = 1;
- }
- } else { //不在申请售后时间内
- $order['is_full_refund'] = false;
- if ($goods['refund']) {
- if ($goods['refund']['status'] == RefundStatusEnum::CANCELLED || $goods['refund']['status'] == RefundStatusEnum::CLOSE) {
- $goods['order_refund_status_text'] = '已关闭';
- $goods['order_refund_status'] = 3;
- } elseif($goods['refund']['status'] == RefundStatusEnum::COMPLETED ) {//已完成 不在给第二次申请的机会
- $goods['order_refund_status_text'] = '退款成功';
- $goods['order_refund_status'] = 3;
- } else {
- $goods['order_refund_status_text'] = '退款中';
- $goods['order_refund_status'] = 2;
- }
- }
- }
- }
- }
- //
- if($order['order_source']==OrderSourceEnum::ZA&&$order['pay_type']==OrderPayTypeEnum::ACTIVITY){
- $goods['order_refund_status_text'] = '';
- $goods['order_refund_status'] = 0;
- }
- }
- return $order;
- }
- /**
- * 获取用户订单详情(仅订单记录)
- * @param int $orderId
- * @param array $with
- * @return Order|array|null
- * @throws BaseException
- */
- public static function getDetail(int $orderId, $with = [])
- {
- // var_dump(UserService::getCurrentLoginUserId());
- // die();
- // 查询订单记录
- $order = static::detail([
- 'order_id' => $orderId,
- 'user_id' => UserService::getCurrentLoginUserId(),
- ], $with);
- empty($order) && throwError('订单不存在');
- return $order;
- }
- /**
- * 当前订单是否允许申请售后
- * @param Order $order
- * @return bool
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\DbException
- * @throws \think\db\exception\ModelNotFoundException
- */
- private static function isAllowRefund(self $order)
- {
- // 必须是已发货的订单
- if ($order['delivery_status'] != DeliveryStatusEnum::DELIVERED) {
- return false;
- }
- // 允许申请售后期限(天)
- $refundDays = SettingModel::getItem(SettingEnum::TRADE)['order']['refund_days'];
- // 不允许售后
- if ($refundDays == 0) {
- return false;
- }
- // 当前时间超出允许申请售后期限
- if (
- $order['receipt_status'] == ReceiptStatusEnum::RECEIVED
- && time() > ($order->getData('receipt_time') + ((int)$refundDays * 86400))
- ) {
- return false;
- }
- return true;
- }
- /**
- * 获取当前用户待处理的订单数量
- * @return array
- * @throws BaseException
- */
- public function getTodoCounts()
- {
- return [
- 'payment' => $this->getCount('payment'), // 待付款
- 'delivery' => $this->getCount('received') + $this->getCount('delivery'), // 待收货(包括待发货
- 'comment' => $this->getCount('comment'), // 待评价
- 'refund' => (new OrderRefund())->getCount() // 售后/退款订单数
- ];
- }
- /**
- * 待支付订单倒计时时间戳
- * @param $value
- * @param $data
- * @return int
- * @author: zjwhust
- * @Time: 2021/10/8 17:06
- */
- public function getDjsTimeAttr($value, $data){
- if(isset($data['pay_status']) && $data['pay_status']==10){ //待支付
- $now = time();
- $djs_time = 60 * (int)SettingModel::getItem('order_cancel', $this->storeId)['close_minutes'];
- // $delay_time = 60* (int)$this->getTradeSetting()['close_days'];
- if($now-$data['create_time']<$djs_time){
- return $data['create_time']+$djs_time-$now;
- }
- }
- return 0;
- }
- /**
- * 待收货订单倒计时时间戳
- * @param $value
- * @param $data
- * @return int
- * @author: zjwhust
- * @Time: 2021/10/8 17:06
- */
- public function getDshTimeAttr($value,$data){
- if(isset($data['delivery_status']) && $data['delivery_status']==20&&$data['receipt_status']==10){ //已发货待收货状态
- $now = time();
- $delay_time = 86400 * (int)SettingModel::getItem('refund', $this->storeId)['receive_days'];
- // $delay_time = 60 * (int)$this->getTradeSetting()['receive_days'];
- if(($now-$data['delivery_time'])<$delay_time){ //发货时间15天内
- return $data['delivery_time']+$delay_time-$now;
- }
- }
- return 0;
- }
- /**
- * 设置错误信息
- * @param $error
- */
- protected function setError($error)
- {
- empty($this->error) && $this->error = $error;
- }
- /**
- * 是否存在错误
- * @return bool
- */
- public function hasError()
- {
- return !empty($this->error);
- }
- public function dailySalesTj($shopId,$from,$to){
- //统计前一天的数据
- $res = $this->where('staff_shop_id',$shopId)
- ->where('pay_status',20)
- ->whereBetweenTime('create_time',$from,$to)//mysql 对int类型的 between and包含左右边界
- ->field('sum(total_price + express_price) as total_price,sum(total_price) as total_goods_price,sum(pay_price + rice_card_money) as total_pay_price,sum(coupon_money) as coupon_money,count(order_id) as order_count,sum(express_price) as express_price')
- ->find();
- $res['total_price'] = $res['total_price']?:0;
- $res['total_goods_price'] = $res['total_goods_price']?:0;
- $res['total_pay_price'] = $res['total_pay_price']?:0;
- $res['coupon_money'] = $res['coupon_money']?:0;
- $res['express_price'] = $res['express_price']?:0;
- //店老板基本分佣
- $res['boss_comm_money'] = CommissionsDetailApi::sumUserCommission($shopId,User::SHOP_BOSS,$from,$to);
- //店长基本分佣
- $res['mg_comm_money'] = CommissionsDetailApi::sumUserCommission($shopId,User::SHOP_MG,$from,$to);
- //店员基本分佣
- $res['seller_comm_money'] = CommissionsDetailApi::sumUserCommission($shopId,User::SHOP_SELLER,$from,$to);
- return $res->toArray();
- }
- /**
- * 商城统计时间区间的销售额和订单数
- * @param $from
- * @param $to
- * @return Order|array|\think\Model|null
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\DbException
- * @throws \think\db\exception\ModelNotFoundException
- */
- public function dailyStoreSaleVolumeSt($from,$to){
- $res = $this->whereBetweenTime('create_time',$from,$to)//mysql 对int类型的 between and包含左右边界
- ->where('pay_status',20)
- ->field('sum(pay_price + rice_card_money) as sale_volume,count(order_id) as order_count')
- ->find();
- $res['sale_volume'] = $res['sale_volume']?:0;
- $res['order_count'] = $res['order_count']?:0;
- return $res;
- }
- /**
- * 统计成功支付的订单数1.3.92,2022年5月11日 18:31:31
- * @param $shopId
- * @param $from
- * @param $to
- * @return int
- */
- public static function getUserOrderCount39($shopId,$from,$to,$monthly=false)
- {
- $model = CommissionsDetail::field( 'distinct order_id')
- ->where('shop_id',$shopId)
- ->where('commission_level',1);//6.推荐官直接推广的订单计入奖励金,间接推广的订单不计入。
- if($monthly == true){
- $model->where('clearing_status',1);
- }else{
- $model->where('clearing_status','<',2);
- }
- $orderIds = $model->whereBetweenTime('order_create_time', $from, $to)->column('order_id');
- return count(array_unique($orderIds));
- }
- }
|