123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317 |
- <?php
- namespace app\common\model;
- use think\Db;
- use EasyWeChat\Factory;
- class GOrders extends Base
- {
- public function add($cart_Id,$addressId,$userId,$orgId,$delivery_type,$delivery_date){
- $addressInfo=Db::name('shop_address')->where('id',$addressId)->find();
- if(!$addressInfo){
- $this->error = "未选择地址";
- return false;
- }
- $newDate = strtotime(date('Y-m-d H:i:s'))-60*5;
- if($delivery_type==1){
- if(empty($delivery_date)){
- $this->error = "送货时间不能为空";
- return false;
- }
- if($delivery_date < date('Y-m-d H:i:s',$newDate)){
- $this->error = "送货时间不能小于当前时间";
- return false;
- }
- }
- $map[]=['c.user_id','=',$userId];
- $map[]=['c.id','in',$cart_Id];
- $map[]=['g.enable','=',1];
- $map[]=['g.del','=',0];
- $goodsInfo=Db::name('g_cart')
- ->alias('c')
- ->join('g_goods g','c.goods_id=g.id')
- ->field('c.nums,g.id,g.title,g.price,g.sale_price,g.type,g.stock')
- ->where($map)
- ->select();
- if(!$goodsInfo){
- $this->error = "未选择商品";
- return false;
- }
- foreach ($goodsInfo as $k=>$v){
- if($v['type'] == 1){
- $goodsInfo[$k]['price']=$v['sale_price'];
- }
- if($v['stock'] < $v['nums']){
- $this->error = "库存不足";
- return false;
- }
- }
- $totalPrice=0;
- foreach ($goodsInfo as $k=>$v){
- $sum=$v['nums'] * $v['price'];
- $totalPrice+=$sum;
- }
- Db::startTrans();
- try {
- $data=[
- 'order_sn'=>get_unique_id(),
- 'org_id'=>$orgId,
- 'user_id'=>$userId,
- 'amount'=>round($totalPrice,2),
- 'status'=>0,
- 'create_time'=>date('Y-m-d H:i:s'),
- 'name'=>$addressInfo['name'],
- 'phone'=>$addressInfo['phone'],
- 'delivery_type'=>$delivery_type,
- 'delivery_date'=>$delivery_date,
- 'address'=>$addressInfo['content'],
- 'aid' => $addressId
- ];
- if($delivery_type==0){
- unset($data['delivery_date']);
- }
- $addOrder=Db::name('g_orders')->insertGetId($data);
- if(!$addOrder){
- exception('操作失败');
- }
- foreach ($goodsInfo as $kay=>$val){
- $gdata=[
- 'order_id'=>$addOrder,
- 'goods_id'=>$val['id'],
- 'nums'=>$val['nums'],
- 'price'=>$val['price'],
- 'type'=>$val['type'],
- ];
- $addOrderGoods=Db::name('g_order_goods')->insert($gdata);
- if(!$addOrderGoods){
- exception('操作失败');
- }
- //减少库存
- $dec= Db::name('g_goods')
- ->where('id',$val['id'])
- ->dec('stock', $val['nums'])
- ->update();
- if(!$dec){
- exception('操作失败');
- }
- }
- //删除用户购物车信息
- $delCart=Db::name('g_cart')->where('user_id',$userId)->whereIn('id',$cart_Id)->delete();
- if(!$delCart){
- exception('操作失败');
- }
- Db::commit();
- return $addOrder;
- } catch (\Exception $e) {
- // 回滚事务
- $this->error = $e->getMessage();
- Db::rollback();
- return false;
- }
- }
- public function addOne($goodsId,$addressId,$nums,$userId,$orgId,$delivery_type,$delivery_date){
- $addressInfo=Db::name('shop_address')->where('id',$addressId)->find();
- if(!$addressInfo){
- $this->error = "未选择地址";
- return false;
- }
- $newDate = strtotime(date('Y-m-d H:i:s'))-60*5;
- if($delivery_type==1){
- if(empty($delivery_date)){
- $this->error = "送货时间不能为空";
- return false;
- }
- if($delivery_date < date('Y-m-d H:i:s',$newDate)){
- $this->error = "送货时间不能小于当前时间";
- return false;
- }
- }
- $map[]=['id','=',$goodsId];
- $map[]=['enable','=',1];
- $map[]=['del','=',0];
- $goodsInfo=Db::name('g_goods')->where($map)->find();
- if(!$goodsInfo){
- $this->error = "未选择商品";
- return false;
- }
- if($goodsInfo['stock'] < $nums){
- $this->error = "库存不足";
- return false;
- }
- if($goodsInfo['type']==1){
- $goodsInfo['price']=$goodsInfo['sale_price'];
- }
- unset($goodsInfo['sale_price']);
- Db::startTrans();
- try {
- $data=[
- 'order_sn'=>get_unique_id(),
- 'org_id'=>$orgId,
- 'user_id'=>$userId,
- 'amount'=>round($goodsInfo['price'] * $nums,2),
- 'status'=>0,
- 'create_time'=>date('Y-m-d H:i:s'),
- 'name'=>$addressInfo['name'],
- 'phone'=>$addressInfo['phone'],
- 'address'=>$addressInfo['content'],
- 'aid' => $addressId,
- 'delivery_type'=>$delivery_type,
- 'delivery_date'=>$delivery_date,
- ];
- if($delivery_type==0){
- unset($data['delivery_date']);
- }
- $addOrder=Db::name('g_orders')->insertGetId($data);
- if(!$addOrder){
- exception('操作失败');
- }
- $gdata=[
- 'order_id'=>$addOrder,
- 'goods_id'=>$goodsInfo['id'],
- 'nums'=>$nums,
- 'price'=>$goodsInfo['price'],
- 'type'=>$goodsInfo['type'],
- ];
- $addOrderGoods=Db::name('g_order_goods')->insert($gdata);
- if(!$addOrderGoods){
- exception('操作失败');
- }
- //减少库存
- $dec = Db::name('g_goods')
- ->where('id',$goodsInfo['id'])
- ->dec('stock', $nums)
- ->update();
- if(!$dec){
- exception('操作失败');
- }
- Db::commit();
- return $addOrder;
- } catch (\Exception $e) {
- // 回滚事务
- $this->error = $e->getMessage();
- Db::rollback();
- return false;
- }
- }
- public function lists($page,$size,$userId,$orgId){
- $map[]=['user_id','=',$userId];
- $map[]=['org_id','=',$orgId];
- $ret=Db::name('g_orders')
- ->field('id,status,amount')
- ->where($map)
- ->order('id','desc')
- ->page($page,$size)
- ->select();
- foreach ($ret as $k=>$v){
- $orderGoods=Db::name('g_order_goods')
- ->alias('og')
- ->field('og.nums,og.price,og.goods_id,g.title,g.img')
- ->join('g_goods g','g.id=og.goods_id')
- ->where('og.order_id',$v['id'])
- ->select();
- $nums=0;
- foreach ($orderGoods as $kk=>$vv){
- $nums+=$vv['nums'];
- }
- $ret[$k]['num']=$nums;
- $ret[$k]['order_goods']=$orderGoods;
- }
- return $ret?$ret:[];
- }
- public function details($ordersId){
- $ret = Db::name('g_orders')->where('id', $ordersId)->find();
- $ret['goods'] = Db::name('g_order_goods')
- ->alias('og')
- ->field('og.nums,og.price,og.goods_id,g.title,g.img')
- ->join('g_goods g', 'g.id=og.goods_id')
- ->where('og.order_id', $ret['id'])
- ->select();
- $nums=0;
- foreach ($ret['goods'] as $k=>$v){
- $nums+=$v['nums'];
- }
- $ret['sum']=$nums;
- return $ret;
- }
- public function accomplish($ordersId){
- $data=[
- 'status'=>2,
- 'finish_time'=>date('Y-m-d H:i:s'),
- ];
- $ret = Db::name('g_orders')->where('id', $ordersId)->update($data);
- return $ret;
- }
- public function refundOrder($userId){
- $data = [
- 'money' => input('money/f',0),
- 'order_id' => input('id/d',0),
- 'user_id' => $userId,
- 'remark' => input('remark','','trim'),
- 'create_time' => date('Y-m-d H:i:s'),
- ];
- if($data['money'] <= 0){
- $this->error = '金额必须大于0';
- return false;
- }
- $pay = Db::name('g_orders')
- ->where('id',$data['order_id'])->find();
- if(!$pay||$pay['status'] != 1){
- $this->error = '订单不存在';
- return false;
- }
- $data['sn'] = get_unique_id('TPH');
- $data['org_id'] = $pay['org_id'];
- if($data['money'] > $pay['amount']){
- $this->error = '退款金额过大';
- return false;
- }
- Db::startTrans();
- try{
- $ret = Db::name('g_order_refund')->insert($data);
- if(!$ret){
- \exception('操作失败');
- }
- $order = Db::name('g_orders')
- ->where('id',$pay['id'])
- ->lock(true)
- ->find();
- if(!$order){
- \exception('订单不存在');
- }
- $ret = Db::name('g_orders')
- ->where('id',$pay['id'])->update([
- 'refund_money' => $data['money'],
- 'status' => 4
- ]);
- if(!$ret){
- \exception('操作失败');
- }
- $config = config('app.wx_config');
- $app = \EasyWeChat\Factory::payment($config);
- $ret = $app->refund->byOutTradeNumber($pay['order_sn'], $data['sn'], $pay['amount']*100, $data['money']*100);
- if($ret['return_code'] != 'SUCCESS' || $ret['result_code'] != 'SUCCESS'){
- \exception('退款申请提交失败');
- }
- Db::commit();
- return true;
- }catch (\Exception $e){
- Db::rollback();
- trace($e->getMessage());
- $this->error = $e->getMessage();
- return false;
- }
- }
- }
|