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; } } }