| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523 |
- <?php
- namespace addons\Happiness\common\service;
- use addons\Happiness\common\enums\HappinessVoucherEnum;
- use addons\Happiness\common\logic\voucher\WalletLogic;
- use addons\Happiness\common\models\HappinessCashierOrder;
- use addons\Happiness\common\models\HappinessGoods;
- use addons\Happiness\common\models\HappinessOrder;
- use addons\Happiness\common\models\HappinessStore;
- use addons\Happiness\common\models\HappinessStoreGoods;
- use addons\Happiness\common\models\HappinessStoreGoodsAttr;
- use addons\Happiness\common\models\HappinessVoucherExpress;
- use addons\Happiness\common\models\HappinessVoucherExpressGoods;
- use addons\Happiness\common\models\HappinessVoucherGoods;
- use addons\Happiness\common\models\HappinessVoucherOrder;
- use addons\Happiness\common\models\HappinessVoucherWallet;
- use addons\Happiness\common\service\BaseService;
- use common\enums\StatusEnum;
- use common\models\common\CapitalLog;
- use common\models\common\Region;
- use Yii;
- class VoucherService extends BaseService
- {
- //添加提货单
- public function addVoucher($attr_param,$mall_id,$store_id)
- {
- $order_no=$this->generateOrderNo();
- $total_num=0;
- $total_price=0;
- $goods_save_data=[];
- foreach ($attr_param as $goods_param)
- {
- $total_num+=$goods_param['buy_num'];
- $total_price=bcadd($goods_param['voucher'],$total_price,2);
- $goods_save_data[]=[
- 'goods_id'=>$goods_param['goods_id'],
- 'attr_id'=>$goods_param['attr_id'],
- 'num'=>$goods_param['buy_num'],
- 'leave_num'=>$goods_param['buy_num'],
- 'mall_id'=>$mall_id,
- 'voucher'=>$goods_param['voucher'],
- 'label_id'=>$goods_param['label_id'],
- ];
- }
- //获取商家的地址用户名手机号
- $one=HappinessStore::find()->where(['id'=>$store_id])->one();
- if(!$one)
- {
- $this->error='商家不存在';
- return false;
- }
- //拼接地址
- $region=Region::find()->where(['id'=>[$one['district_id'],$one['city_id'],$one['province_id']]])->asArray()
- ->indexBy('id')->all();
- $address=$region[$one['province_id']]['name'].$region[$one['city_id']]['name'].$region[$one['district_id']]['name'].$one['address'];
- $mobile=$one['shop_mobile'];
- $user_name=$one['shop_owner'];
- $orderData=[
- 'order_no'=>$order_no,
- 'status'=>StatusEnum::ENABLED,
- 'total_num'=>$total_num,
- 'leave_num'=>$total_num,
- 'price'=>$total_price,
- 'mall_id'=>$mall_id,
- 'store_id'=>$store_id,
- 'user_name'=>$user_name,
- 'mobile'=>$mobile,
- 'address'=>$address,
- 'order_status'=>HappinessVoucherEnum::ORDER_STATUS_NO_AUDIT,
- ];
- $res=HappinessVoucherOrder::setData($orderData);
- if($res===false)
- {
- $this->error=HappinessVoucherOrder::getStaticError();
- return false;
- }
- $order_id=$res->id;
- //添加商品
- foreach ($goods_save_data as $goods_param)
- {
- $goods_param['order_id']=$order_id;
- $res=HappinessVoucherGoods::setData($goods_param);
- if($res===false)
- {
- $this->error=HappinessVoucherGoods::getStaticError();
- return false;
- }
- }
- return true;
- }
- /**
- * 生成订单号 202001011400000011
- * @return string
- */
- private function generateOrderNo()
- {
- $date = date('Ymd'); // 当前日期 YYYYMMDD
- $key = 'happiness_voucher_order_no_' . $date; // Redis键名
- $serialNumber = Yii::$app->redis->incr($key);
- // 设置过期时间到明天
- Yii::$app->redis->expireat($key, strtotime(date('Y-m-d 23:59:59')) + 1);
- // 格式化为10位数字,不足补0
- $serial = str_pad($serialNumber, 10, '0', STR_PAD_LEFT);
- return $date . $serial;
- }
- public function returnVoucher($id)
- {
- //返还提货券
- $model=HappinessVoucherOrder::find()->with(['goods'])->where(['id'=>$id])->asArray()->one();
- if(!$model)
- {
- $this->error='数据不存在';
- return false;
- }
- $total_voucher=[];
- foreach ($model['goods'] as $goods_model)
- {
- if(isset($total_voucher[$goods_model['label_id']]))
- {
- $total_voucher[$goods_model['label_id']]=bcadd($total_voucher[$goods_model['label_id']],$goods_model['voucher'],2);
- }
- else
- {
- $total_voucher[$goods_model['label_id']]=$goods_model['voucher'];
- }
- }
- foreach ($total_voucher as $label_id=>$voucher)
- {
- $wallet_log[] = [
- 'mall_id' => $model['mall_id'],
- 'store_id' =>$model['store_id'],
- 'level' => $label_id,
- 'change_type' => CapitalLog::CHANGE_TYPE_ADD,
- 'change_num' => $voucher,
- 'desc' => '平台拒绝小店提货',
- 'source_table' => HappinessVoucherWallet::tableName(),
- 'source_table_id' => $model['store_id'],
- 'from_type' => HappinessVoucherEnum::FROM_REFUSE_STORE_BUY,
- 'wallet_type' => HappinessVoucherEnum::WALLET_VALUE,
- 'status' => 1,
- 'order_no' => ''
- ];
- }
- if(!empty($wallet_log))
- {
- $tran=Yii::$app->db->beginTransaction();
- try {
- foreach ($wallet_log as $item)
- {
- if($item['change_num']>0)
- {
- $res=WalletLogic::handle($item);
- if (!$res)
- {
- throw new \Exception(WalletLogic::getStaticError());
- }
- }
- }
- $tran->commit();
- return true;
- }catch (\Exception $e)
- {
- $tran->rollBack();
- $this->error=$e->getMessage();
- return false;
- }
- }
- return true;
- }
- //订单完成返还提货券
- public function returnOrderVoucher($order_id)
- {
- //返还提货券
- $model=HappinessOrder::find()->with(['orderDetail'])->where(['order_id'=>$order_id])->asArray()->one();
- if(!$model)
- {
- $this->error='数据不存在';
- return false;
- }
- $total_voucher=[];
- $goods_ids=array_column($model['orderDetail'],'goods_id');
- $happinessGoodsList=HappinessGoods::find()->where(['goods_id'=>$goods_ids,'status'=>StatusEnum::ENABLED,'mall_id'=>$model['mall_id']])
- ->asArray()->indexBy('goods_id')
- ->all();
- foreach ($model['orderDetail'] as $goods_model)
- {
- if(!isset($happinessGoodsList[$goods_model['goods_id']]))
- {
- continue;
- }
- $goods_label=$happinessGoodsList[$goods_model['goods_id']]['label_id'];
- if(isset($total_voucher[$goods_model['label_id']]))
- {
- $total_voucher[$goods_label]=bcadd($total_voucher[$goods_label],$goods_model['goods_price'],2);
- }
- else
- {
- $total_voucher[$goods_label]=$goods_model['goods_price'];
- }
- }
- foreach ($total_voucher as $label_id=>$voucher)
- {
- $wallet_log[] = [
- 'mall_id' => $model['mall_id'],
- 'store_id' =>$model['store_id'],
- 'level' => $label_id,
- 'change_type' => CapitalLog::CHANGE_TYPE_ADD,
- 'change_num' => $voucher,
- 'desc' => '订单返还',
- 'source_table' => HappinessVoucherWallet::tableName(),
- 'source_table_id' => $model['store_id'],
- 'from_type' => HappinessVoucherEnum::FROM_SALE,
- 'wallet_type' => HappinessVoucherEnum::WALLET_VALUE,
- 'status' => 1,
- 'order_no' => ''
- ];
- }
- if(!empty($wallet_log))
- {
- $tran=Yii::$app->db->beginTransaction();
- try {
- foreach ($wallet_log as $item)
- {
- if($item['change_num']>0)
- {
- $res=WalletLogic::handle($item);
- if (!$res)
- {
- throw new \Exception(WalletLogic::getStaticError());
- }
- }
- }
- $tran->commit();
- return true;
- }catch (\Exception $e)
- {
- $tran->rollBack();
- $this->error=$e->getMessage();
- return false;
- }
- }
- return true;
- }
-
- public function returnOrderVoucherCashier($order_id)
- {
- //返还提货券
- $model=HappinessCashierOrder::find()->with(['detail'])->where(['id'=>$order_id])->asArray()->one();
- if(!$model)
- {
- $this->error='数据不存在';
- return false;
- }
- $total_voucher=[];
- $goods_ids=array_column($model['detail'],'goods_id');
- $happinessGoodsList=HappinessGoods::find()->where(['goods_id'=>$goods_ids,'status'=>StatusEnum::ENABLED,'mall_id'=>$model['mall_id']])
- ->asArray()->indexBy('goods_id')
- ->all();
-
-
- foreach ($model['detail'] as $goods_model)
- {
- if(!isset($happinessGoodsList[$goods_model['goods_id']]))
- {
- continue;
- }
- $goods_label=$happinessGoodsList[$goods_model['goods_id']]['label_id'];
- if(isset($total_voucher[$goods_model['label_id']]))
- {
- $total_voucher[$goods_label]=bcadd($total_voucher[$goods_label],$goods_model['goods_price'],2);
- }
- else
- {
- $total_voucher[$goods_label]=$goods_model['goods_price'];
- }
-
- }
- foreach ($total_voucher as $label_id=>$voucher)
- {
- $wallet_log[] = [
- 'mall_id' => $model['mall_id'],
- 'store_id' =>$model['store_id'],
- 'level' => $label_id,
- 'change_type' => CapitalLog::CHANGE_TYPE_ADD,
- 'change_num' => $voucher,
- 'desc' => '订单返还',
- 'source_table' => HappinessVoucherWallet::tableName(),
- 'source_table_id' => $model['store_id'],
- 'from_type' => HappinessVoucherEnum::FROM_SALE,
- 'wallet_type' => HappinessVoucherEnum::WALLET_VALUE,
- 'status' => 1,
- 'order_no' => ''
- ];
- }
- if(!empty($wallet_log))
- {
- $tran=Yii::$app->db->beginTransaction();
- try {
- foreach ($wallet_log as $item)
- {
- if($item['change_num']>0)
- {
- $res=WalletLogic::handle($item);
- if (!$res)
- {
- throw new \Exception(WalletLogic::getStaticError());
- }
- }
- }
- $tran->commit();
- return true;
- }catch (\Exception $e)
- {
- $tran->rollBack();
- $this->error=$e->getMessage();
- return false;
- }
- }
- return true;
- }
-
-
- public function send($param)
- {
- $model = HappinessVoucherOrder::find()->where(['id' => $param['id'],'mall_id' =>
- $this->mall_id])->one();
- if (!$model) {
- $this->error='数据不存在';
- return false;
- }
- $goods=$param['goods'];
- $total_num=0;
- if(empty($param['express_no']))
- {
- $this->error='请填写快递单号';
- return false;
- }
- if(empty($param['express_company']))
- {
- $this->error='请填写快递公司';
- return false;
- }
- $voucherGoods=HappinessVoucherGoods::find()->where(['id' => array_column($goods,'id'),'mall_id' =>
- $this->mall_id])->asArray()->indexBy('id')->all();
- foreach ($goods as $goods_item)
- {
- if($voucherGoods[$goods_item['id']]['leave_num']<$goods_item['send_num'])
- {
- $this->error='发货数量不能大于剩余发货数量';
- return false;
- }
- if($goods_item['send_num']==0)
- {
- $this->error='请输入发货数量';
- return false;
- }
- if($goods_item['expire_date']=='')
- {
- $this->error='请输入过期时间';
- return false;
- }
- if($goods_item['save_day']=='')
- {
- $this->error='请输入保质时间';
- return false;
- }
- if($goods_item['create_date']=='')
- {
- $this->error='请输入生产日期';
- return false;
- }
- $total_num+=$goods_item['send_num'];
- }
- $tran=Yii::$app->db->beginTransaction();
- try {
- $leave_num=bcsub($model->leave_num,$total_num);
- $order_status=$leave_num==0?HappinessVoucherEnum::ORDER_STATUS_ALL_SHIPMENT:HappinessVoucherEnum::ORDER_STATUS_PART_SHIPMENT;
- $res=HappinessVoucherOrder::setData([
- 'id' => $model->id,
- 'leave_num' => bcsub($model->leave_num,$total_num),
- 'order_status' => $order_status
- ]);
- if($res===false)
- {
- return $this->error(HappinessVoucherOrder::getStaticError());
- }
- foreach ($goods as $goods_item)
- {
- $res=HappinessVoucherGoods::setData([
- 'id' => $goods_item['id'],
- 'leave_num' => bcsub($voucherGoods[$goods_item['id']]['leave_num'],$goods_item['send_num']),
- ]);
- if($res===false)
- {
- throw new \Exception(HappinessVoucherGoods::getStaticError());
- }
- }
- //保存物流单
- $express=HappinessVoucherExpress::setData([
- 'order_id' => $model->id,
- 'order_no' => $model->order_no,
- 'express_company' => $param['express_company'],
- 'express_no' => $param['express_no'],
- 'get_status' =>StatusEnum::DISABLED,
- 'mall_id' => $this->mall_id,
- ]);
- if($express===false)
- {
- throw new \Exception(HappinessVoucherExpress::getStaticError());
- }
- foreach ($goods as $goods_item)
- {
- $res=HappinessVoucherExpressGoods::setData([
- 'order_id' => $model->id,
- 'order_no' => $model->order_no,
- 'goods_id' => $goods_item['goods_id'],
- 'attr_id' => $goods_item['attr_id'],
- 'num' =>$goods_item['send_num'],
- 'create_date'=>strtotime($goods_item['create_date']),
- 'expire_date' => strtotime($goods_item['expire_date']),
- 'save_day'=> $goods_item['save_day'],
- 'express_id'=>$express->id,
- 'mall_id' => $this->mall_id,
- ]);
- if($res===false)
- {
- throw new \Exception(HappinessVoucherExpressGoods::getStaticError());
- }
- }
- $tran->commit();
- return true;
- }catch (\Exception $e)
- {
- $tran->rollBack();
- $this->error=$e->getMessage().$e->getFile();
- return false;
- }
- }
- public function confirm($model)
- {
- $express_list=HappinessVoucherExpress::find()->with(['goods'])->where(['order_id' => $model->id,'mall_id' =>
- $this->mall_id,'get_status' => StatusEnum::DISABLED])->asArray()->all();
- if(empty($express_list))
- {
- $this->error='没有未收货的发货单';
- return false;
- }
- $order_status=$model->leave_num==0?HappinessVoucherEnum::ORDER_STATUS_CONFIRM:$model->order_status;
- $tran=Yii::$app->db->beginTransaction();
- try {
- $res=HappinessVoucherOrder::setData([
- 'id' => $model->id,
- 'order_status' => $order_status,
- ]);
- if($res===false)
- {
- throw new \Exception(HappinessVoucherOrder::getStaticError());
- }
- foreach ($express_list as $express_item)
- {
- $goods_ids=array_column($express_item['goods'],'goods_id');
- $goods_list=HappinessGoods::find()->where(['goods_id' => $goods_ids,'mall_id' => $this->mall_id,'status'=>StatusEnum::ENABLED])
- ->asArray()->indexBy('goods_id')->all();
- $res=HappinessVoucherExpress::setData([
- 'id' => $express_item['id'],
- 'get_status' => StatusEnum::ENABLED,
- ]);
- if($res===false)
- {
- throw new \Exception(HappinessVoucherExpress::getStaticError());
- }
- foreach ($express_item['goods'] as $goods_item)
- {
- $storeGoods=HappinessStoreGoods::setData([
- 'goods_id' => $goods_item['goods_id'],
- 'stock' => $goods_item['num'],
- 'mall_id' => $this->mall_id,
- 'store_id' => $this->store_id
- ]);
- if($storeGoods===false)
- {
- throw new \Exception(HappinessStoreGoods::getStaticError());
- }
- $res=HappinessStoreGoodsAttr::setData( [
- 'attr_id' => $goods_item['attr_id'],
- 'stock' => $goods_item['num'],
- 'mall_id' => $this->mall_id,
- 'goods_id'=> $goods_item['goods_id'],
- 'store_id' => $this->store_id,
- 'yun_goods_id' => $storeGoods->id,
- ]);
- if($res===false)
- {
- throw new \Exception(HappinessStoreGoodsAttr::getStaticError());
- }
- }
- }
- $tran->commit();
- return true;
- }
- catch (\Exception $e)
- {
- $tran->rollBack();
- $this->error=$e->getMessage().$e->getFile();
- return false;
- }
- }
- }
|