$bill_order[$BillOrder::VID], 'merchantid' => $bill_order[$BillOrder::MERCHANT_ID], 'bill_id' => $bill_order[$BillOrder::ID], ); $vip_card = $VipCard->toSelect($map); if (empty($vip_card)) { $res = array( 'status' => 1, 'msg' => '暂无可退还次卡' ); return $res; } $num = 0; //使用次数 foreach ($vip_card as $value) { if ($value['use_num']) { $num += round($value['use_num']); } } if ($num > 0) { $res = array( 'status' => 0, 'msg' => '消费赠送的次卡已经使用,无法退款' ); } else { // 未使用 $res = array( 'status' => 1, 'vip_card' => $vip_card ); } return $res; } /** * 退还次卡 卡包 * @param array $vip_card * @return array */ public function stillSubCard($vip_card) { $VipCard = D('VipCard'); foreach ($vip_card as $key => &$val) { // 删除用户次卡 $vip_card_del = $VipCard->deleteOrder(array('id' => $val['id'])); //删除次卡 if (empty($vip_card_del)) { $res = array( 'status' => 0, 'msg' => '用户次卡退回失败' ); return $res; } // 判断 if ($val['type'] == 1) { // 增加次卡库存 $SubCard = D('SubCard'); $sub_map = array( $SubCard::ID => $val['sub_card_id'], $SubCard::MERCHANT_ID => $val['merchantid'], ); $SubCard->toSetInc($sub_map, $SubCard::SUR_PLUS, 1); } else { // 增加卡包库存 $CardBag = D('CardBag'); $bag_map = array( $CardBag::ID => $val['card_bag_id'], $CardBag::MERCHANT_ID => $val['merchantid'], ); $CardBag->toSetInc($bag_map, $CardBag::SUR_PLUS, 1); } } $res = array( 'status' => 1, 'msg' => '退还成功' ); return $res; } /** * 线上订单退款2020/3/4 */ public function onlineOrderRefund($data) { $store_id = $data['store_id']; // 门店id $merchant_id = $data['merchant_id']; // 商户id $cashier_id = $data['cashier_id'] ? $data['cashier_id'] : 0; // 收银员id $cashier = $data['cashier'] ? $data['cashier'] : array(); // 收银员信息 $order_no = $data['order_no']; // 订单编号 $user_type = $data['user_type']; // 1.收银员 2.店长 3.后台 $username = $data['username'] ? $data['username'] : ''; // 店长账号 $refund_code = $data['refund_code'] ? $data['refund_code'] : ''; // 收银员权限码,或店长密码 $return_delivery_fee = $data['return_delivery_fee'] == 1 ? 1 : 2; // 是否退还配送费 1是 2否 // 查询退款原订单 $BillModel = D('RetailBillOrder'); $bMap = array( $BillModel::ORDER_NO => strval($order_no), $BillModel::STORE_ID => $store_id, $BillModel::MERCHANT_ID => $merchant_id, $BillModel::ORDER_TYPE => 2, // 退款订单 $BillModel::REFUND_STATUS => 1, // 状态 1.申请退款 $BillModel::TYPE => 1, // 订单类型 1.商城订单 ); $billOrder = $BillModel->getFind($bMap); // 判断订单 if (empty($billOrder)) { $result = array('status' => 0, 'msg' => '未查询到该订单'); return $result; } // 获取缓存 $history = S('refund_order_no_' . $order_no); if (!empty($history)) { $result = array('status' => 0, 'msg' => '请勿频繁操作!'); return $result; } // 写入2秒的缓存,防止用户频繁点击 S('refund_order_no_' . $order_no, $billOrder[$BillModel::ORDER_NO], 2); // 判断是否可以退款 $res = $this->verifyRefund($user_type, $cashier, $username, $refund_code, $store_id); if ($res['status'] == 0) { return $res; } // 查询退款订单 $obMap = array( $BillModel::ORDER_NO => strval($billOrder[$BillModel::REFUND_NO]) ); $old_bill = $BillModel->getFind($obMap); // 判断是否送次卡 $vip_card = array(); if (!empty($old_bill[$BillModel::VID])) { $judge_refund = $this->judgeRefund($old_bill); if ($judge_refund['status'] == 0) { $this->ajaxReturn($judge_refund); } else { $vip_card = $judge_refund['vip_card']; } } $OnlineModel = D('RetailBillOnline'); $delivery_fee = 0; if ($return_delivery_fee == 1) { // 退还配送费 $onlineOrder = $OnlineModel->getFind(array($OnlineModel::BILL_ID => $old_bill[$BillModel::ID])); if ($onlineOrder[$OnlineModel::PICKUP_TYPE] == 1) { $result = array('status' => 0, 'msg' => '自提订单没有配送费,请检查参数'); return $result; } $delivery_fee = $onlineOrder[$OnlineModel::DELIVERY_FEE];//配送费 if ($onlineOrder[$OnlineModel::STATUS] == 3) { // 已收货 查找是否已退还配送费 $orbMap = array( $BillModel::REFUND_NO => strval($old_bill[$BillModel::ORDER_NO]), $BillModel::REFUND_STATUS => 3, $BillModel::PAY_STATE => 1, ); $refund_bill_id = $BillModel->getFindField($orbMap, $BillModel::ID, true); if (!empty($refund_bill_id)) { //有退款记录 查询退还配送费 $old_delivery_fee = $OnlineModel->getSum(array($OnlineModel::BILL_ID => array('in', $refund_bill_id)), $OnlineModel::DELIVERY_FEE); if ($old_delivery_fee > 0) { $result = array('status' => 0, 'msg' => '原订单已退还配送费,不可重复退还'); return $result; } } } $billOrder[$BillModel::ALL_MONEY] = round($billOrder[$BillModel::ALL_MONEY] + $delivery_fee, 2); } $refund = A('PayApi/Pay')->onlineRefund_v1($billOrder, $old_bill, $cashier_id); $result['refund'] = $refund; if ($refund['status'] == 1) { //钱退成功 $RetailGuideModel = D('RetailGuideIncome'); $SellModel = D('RetailSell'); $sMap = array( $SellModel::BILL_ID => $billOrder[$BillModel::ID] ); $sellOrder = $SellModel->getSelect($sMap); $guideArr = $RetailGuideModel->getFind(array($RetailGuideModel::BILL_ID => $old_bill[$BillModel::ID])); if ($guideArr) { //退还佣金 $this->refundCommission($guideArr, $sellOrder); } $use_integral = 0; $get_integral = 0; $time = time(); $GoodsModel = D('RetailGoods'); $SkuGoodsModel = D('RetailSkuGoods'); foreach ($sellOrder as $value) { $sku_id = ''; $map = array( $SellModel::ID => $value[$SellModel::ID] ); $save = array( $SellModel::PAY_STATE => 1, $SellModel::PAY_TYPE => $refund['pay_type'] ); $SellModel->updateOrder($map, $save);//修改退款记录 $nMap = array( $SellModel::ID => $value[$SellModel::SELL_ID] ); $use_integral += $value[$SellModel::USE_INTEGRAL];//使用积分累加 $get_integral += $value[$SellModel::GET_INTEGRAL];//获得积分累加 $num = $value[$SellModel::NUM]; /*修改原订单*/ $SellModel->toSetDec($nMap, $SellModel::WAIT_REFUND_NUM, $num);//减少待退款数量 $SellModel->toSetInc($nMap, $SellModel::REFUND_NUM, $num);//增加已退款数量 $SellModel->toSetInc($nMap, $SellModel::REFUND_MONEY, $value[$SellModel::ALL_MONEY]);//增加已退款数量 /*修改库存*/ if (!empty($value[$SellModel::SKU_JSON_INFO])) { //规格商品 $sku = json_decode($value[$SellModel::SKU_JSON_INFO], true); $sku_id = $sku['id']; $SkuGoodsModel->toSetInc(array($SkuGoodsModel::ID => $sku[$SkuGoodsModel::ID]), $SkuGoodsModel::GOODS_NUM, $num); $num = $num * $sku[$SkuGoodsModel::SKU_NUM]; } $gMap = array( $GoodsModel::ID => $value[$SellModel::GOODS_ID], ); $GoodsModel->toSetDec($gMap, $GoodsModel::SELL_NUM, $num);//减少出售数量 // 添加库存记录并且减库存 $this->addRefundQuantityLogs($value[$SellModel::GOODS_ID], $sku_id, $num, $value[$SellModel::ALL_MONEY], $value[$SellModel::TYPE], $value[$SellModel::BILL_ID], $value[$SellModel::PRICE]); } if (!empty($billOrder[$BillModel::VID])) { // 退次卡 $this->stillSubCard($vip_card); //推送退款信息 $VipModel = D('RetailVip'); $vipMap = array( $VipModel::ID => $billOrder[$BillModel::VID], ); A("Vip/Mark")->refundsuccess($billOrder[$BillModel::VID], $billOrder[$BillModel::ORDER_NO], $billOrder[$BillModel::ALL_MONEY], $time, $store_id); $IntegralOrderModel = D('RetailIntegralOrder'); if ($use_integral > 0) { // 退还使用积分 $map = array( $IntegralOrderModel::VID => $billOrder[$BillModel::VID], $IntegralOrderModel::BILL_ID => $old_bill[$BillModel::ID], $IntegralOrderModel::TYPE => 8,//积分抵现 ); $VipModel->toSetInc($vipMap, $VipModel::INTEGRAL, $use_integral); //添加 $integralItem = array( $IntegralOrderModel::VID => $billOrder[$BillModel::VID], $IntegralOrderModel::TYPE => 4, $IntegralOrderModel::INTEGRAL => $use_integral, $IntegralOrderModel::REMARK => '会员退款返回' . $use_integral . '积分', $IntegralOrderModel::STORE_ID => $store_id, $IntegralOrderModel::BILL_ID => $billOrder[$BillModel::ID], $IntegralOrderModel::ADD_TIME => $time, $IntegralOrderModel::REFUND_INTEGRAL => $use_integral, ); $IntegralOrderModel->addOrder($integralItem);// 扣除积分 并添加积分记录 $IntegralOrderModel->toSetInc($map, $IntegralOrderModel::REFUND_INTEGRAL, $use_integral);//原记录的退还积分增加 } if ($get_integral > 0) { // 退还获得积分 $IntegralOrderModel = D('RetailIntegralOrder'); $map = array( $IntegralOrderModel::VID => $billOrder[$BillModel::VID], $IntegralOrderModel::BILL_ID => $old_bill[$BillModel::ID], $IntegralOrderModel::TYPE => 2,//积分抵现 ); $VipModel->toSetDec($vipMap, $VipModel::INTEGRAL, $get_integral); //退还 $VipModel->toSetDec($vipMap, $VipModel::GRADE_INTEGRAL, $get_integral); //退还 $integralItem = array( $IntegralOrderModel::VID => $billOrder[$BillModel::VID], $IntegralOrderModel::TYPE => 5, $IntegralOrderModel::INTEGRAL => $get_integral, $IntegralOrderModel::REMARK => '会员退款扣除' . $get_integral . '积分', $IntegralOrderModel::STORE_ID => $store_id, $IntegralOrderModel::BILL_ID => $billOrder[$BillModel::ID], $IntegralOrderModel::ADD_TIME => $time, $IntegralOrderModel::REFUND_INTEGRAL => $get_integral, ); $IntegralOrderModel->addOrder($integralItem);// 扣除积分 并添加积分记录 $IntegralOrderModel->toSetInc($map, $IntegralOrderModel::REFUND_INTEGRAL, $get_integral);//原记录的退还积分增加 } } // 修改bill_order表 $BillModel->updateOrder($bMap, array($BillModel::REFUND_STATUS => 2, $BillModel::FINISH_TIME => time(), $BillModel::PAY_TYPE => $refund['pay_type'], $BillModel::ALL_MONEY => $billOrder[$BillModel::ALL_MONEY])); // 记录配送费 if ($delivery_fee && $delivery_fee > 0) { $OnlineModel->updateOrder(array($OnlineModel::BILL_ID => $billOrder[$BillModel::ID]), array($OnlineModel::DELIVERY_FEE => $delivery_fee)); } $refund_money = round($billOrder[$BillModel::ALL_MONEY] + $old_bill[$BillModel::REFUND_MONEY], 2);//原订单总退款金额 if (round($old_bill[$BillModel::ALL_MONEY] - $refund_money, 2) > 0) { //部分退款 $BillModel->updateOrder($obMap, array($BillModel::REFUND_STATUS => 3, $BillModel::REFUND_MONEY => $refund_money)); } else { //全部退款 $BillModel->updateOrder($obMap, array($BillModel::REFUND_STATUS => 2, $BillModel::REFUND_MONEY => $refund_money)); } // 退款成功 $result = array('status' => 1, 'msg' => '退款成功'); } else { $result = $refund; } return $result; } /** * 线上订单退款2020/3/9 * @data $store_id * @data $merchant_id * @data $cashier_id * @data platform_type 商户平台类型 1默认系统 2微礼平台 * @data $cashier // 收银员信息 * @data $order_no // // 订单编号 * @data $user_type //1.收银员 2.店长 3.后台 * @data $username // 店长账号 * @data $refund_code //退款权限码或店长密码 * @data $return_delivery_fee // 是否退还配送费 1是 2否 */ public function onlineOrderRefund_v2($data) { $platform_type = $data['platform_type']; $store_id = $data['store_id']; $merchant_id = $data['merchant_id']; $cashier_id = $data['cashier_id'] ? $data['cashier_id'] : 0; $cashier = $data['cashier'] ? $data['cashier'] : array(); $order_no = $data['order_no']; $user_type = $data['user_type']; $username = $data['username'] ? $data['username'] : ''; $refund_code = $data['refund_code'] ? $data['refund_code'] : ''; $return_delivery_fee = $data['return_delivery_fee'] == 1 ? 1 : 2; $BillModel = D('RetailBillOrder'); $AdvanceOrderModel = D("RetailBillAdvance"); $bMap = array( $BillModel::ORDER_NO => strval($order_no), $BillModel::STORE_ID => $store_id, $BillModel::MERCHANT_ID => $merchant_id, $BillModel::ORDER_TYPE => 2, // 退款订单 $BillModel::REFUND_STATUS => 5, // 状态 5.待退款 $BillModel::TYPE => 1, // 订单类型 1.商城订单 ); $billOrder = $BillModel->getFind($bMap); if (empty($billOrder)) { $result = array('status' => 0, 'msg' => '未查询到该订单'); return $result; } // 获取缓存 $history = S('refund_order_no_' . $order_no); if (!empty($history)) { $result = array('status' => 0, 'msg' => '请勿频繁操作!'); return $result; } // 写入2秒的缓存,防止用户频繁点击 S('refund_order_no_' . $order_no, $billOrder[$BillModel::ORDER_NO], 2); // 判断是否可以退款 $res = $this->verifyRefund($user_type, $cashier, $username, $refund_code, $store_id); if ($res['status'] == 0) { return $res; } // 查询原付款订单 $obMap = array( 'order_no' => strval($billOrder[$BillModel::REFUND_NO]), 'type' => 1, 'order_type' => 1 ); $old_bill = $BillModel->getFind($obMap); if (empty($old_bill)) { $res['status'] = 0; $res['msg'] = '原订单状态已改变,请刷新重试'; $this->ajaxReturn($res); } $supplier_type = D("RetailStore")->getFindField(array('id' => $store_id), "supplier_type"); // 判断是否送次卡 $vip_card = array(); if (!empty($old_bill[$BillModel::VID])) { $judge_refund = $this->judgeRefund($old_bill); if ($judge_refund['status'] == 0) { $this->ajaxReturn($judge_refund); } else { $vip_card = $judge_refund['vip_card']; } } $OnlineModel = D('RetailBillOnline'); $onlineOrder = $OnlineModel->getFind(array($OnlineModel::BILL_ID => $old_bill[$BillModel::ID])); $delivery_fee = 0; if ($onlineOrder['order_genre'] == 4) { //预售订单 $advance_info = $AdvanceOrderModel->getFind(array("bill_id" => $old_bill['id'])); } if ($return_delivery_fee == 1) { // 退还配送费 if ($onlineOrder[$OnlineModel::PICKUP_TYPE] == 1) { $result = array('status' => 0, 'msg' => '自提订单没有配送费,请检查参数'); return $result; } $delivery_fee = $onlineOrder[$OnlineModel::DELIVERY_FEE];//配送费 if ($onlineOrder[$OnlineModel::STATUS] == 3) { // 已收货 查找是否已退还配送费 $orbMap = array( $BillModel::REFUND_NO => strval($old_bill[$BillModel::ORDER_NO]), $BillModel::REFUND_STATUS => 2, $BillModel::PAY_STATE => 1, $BillModel::ORDER_TYPE => 2 ); $refund_bill_id = $BillModel->getFindField($orbMap, $BillModel::ID, true); if (!empty($refund_bill_id)) { //有退款记录 查询退还配送费 $old_delivery_fee = $OnlineModel->getSum(array($OnlineModel::BILL_ID => array('in', $refund_bill_id)), $OnlineModel::DELIVERY_FEE); if ($old_delivery_fee > 0) { $result = array('status' => 0, 'msg' => '原订单已退还配送费,不可重复退还'); return $result; } } } if ($onlineOrder['order_genre'] == 4 && $advance_info['state'] == 1) { //退定金 $delivery_fee = 0; } $billOrder[$BillModel::ALL_MONEY] = round($billOrder[$BillModel::ALL_MONEY] + $delivery_fee, 2); } // file_put_contents('./all.txt', json_encode($billOrder) . PHP_EOL, FILE_APPEND); // file_put_contents('./all2.txt', json_encode($old_bill) . PHP_EOL, FILE_APPEND); $refund = A('PayApi/Pay')->onlineRefund_v1($billOrder, $old_bill, $cashier_id); // file_put_contents('./all3.txt', json_encode($refund) . PHP_EOL, FILE_APPEND); $result['refund'] = $refund; if ($refund['status'] == 1) { if ($platform_type == 2) { //第三方平台 $ThirdOrderClass = new Order(); $ThirdOrderClass->orderPayment([ 'merchant_id' => $billOrder['merchant_id'], 'third_order' => $billOrder['third_order'], 'pay_type' => $billOrder['pay_type'] ]); } //钱退成功 $RetailGuideModel = D('RetailGuideIncome'); $SellModel = D('RetailSell'); $sMap = array( $SellModel::BILL_ID => $billOrder[$BillModel::ID] ); $sellOrder = $SellModel->getSelect($sMap); $guideArr = $RetailGuideModel->getFind(array($RetailGuideModel::BILL_ID => $old_bill[$BillModel::ID])); if ($guideArr) { //退还佣金 $this->refundCommission($guideArr, $sellOrder); } $use_integral = 0; $get_integral = 0; $time = time(); $GoodsModel = D('RetailGoods'); $plus_vip_less_money = 0; $old_sell_id = [];//目前分销专用 $new_sell_id = [];//目前分销专用 foreach ($sellOrder as $value) { $sku_id = ''; $new_sell_id[] = $value[$SellModel::ID]; $old_sell_id[] = $value[$SellModel::SELL_ID]; $map = array( $SellModel::ID => $value[$SellModel::ID] ); $save = array( $SellModel::PAY_STATE => 1, $SellModel::PAY_TYPE => $refund['pay_type'] ); $SellModel->updateOrder($map, $save);//修改退款记录 $nMap = array( $SellModel::ID => $value[$SellModel::SELL_ID] ); $use_integral += $value[$SellModel::USE_INTEGRAL];//使用积分累加 $get_integral += $value[$SellModel::GET_INTEGRAL];//获得积分累加 $num = $value[$SellModel::NUM]; /*修改原订单*/ $SellModel->toSetDec($nMap, $SellModel::WAIT_REFUND_NUM, $num);//减少待退款数量 $SellModel->toSetInc($nMap, $SellModel::REFUND_NUM, $num);//增加已退款数量 $SellModel->toSetInc($nMap, $SellModel::REFUND_MONEY, $value[$SellModel::ALL_MONEY]);//退款金额增加 switch ($onlineOrder['order_genre']) { case 1: case 2: case 3: //普通订单拼团订单秒杀订单 if ($onlineOrder['status'] == 1) { //未收到货取消订单退款或者不需要客户发货的退款单 /*修改库存*/ if (!empty($value[$SellModel::SKU_JSON_INFO])) { //规格商品 $sku = json_decode($value[$SellModel::SKU_JSON_INFO], true); $sku_id = $sku['id']; } $gMap = array( $GoodsModel::ID => $value[$SellModel::GOODS_ID], ); $GoodsModel->toSetDec($gMap, $GoodsModel::SELL_NUM, $num);//减少出售数量 // 添加库存记录并且加库存 if ($supplier_type == 2 && !empty($value['supplier_json']) && !empty($value['purchase_id_str'])) { //寄售供货商 $supplier_arr = array( 'supplier_type' => 2, 'supplier_json' => $value['supplier_json'], 'purchase_id_str' => $value['purchase_id_str'] ); } else { $supplier_arr = array(); } $this->addRefundQuantityLogs($value[$SellModel::GOODS_ID], $sku_id, $num, $value[$SellModel::ALL_MONEY], $value[$SellModel::TYPE], $value[$SellModel::BILL_ID], $value[$SellModel::PRICE], $supplier_arr, $value['goods_gifts_id'], $onlineOrder['order_genre']); } break; case 4: if ($advance_info['state'] == 2 && $onlineOrder['status'] == 1) { //支付成功未发货 $parameter = array( 'advance_id' => $advance_info['advance_id'], 'goods_id' => $advance_info['goods_id'], 'num' => $num ); D("AdvanceGoods")->StockSetInc($parameter); if (!empty($advance_info['sku_id'])) { $parameter['sku_id'] = $advance_info['sku_id']; D("AdvanceSkuGoods")->StockSetInc($parameter); } // 添加库存记录并且加库存 // 添加库存记录并且加库存 if ($supplier_type == 2 && !empty($value['supplier_json']) && !empty($value['purchase_id_str'])) { //寄售供货商 $supplier_arr = array( 'supplier_type' => 2, 'supplier_json' => $value['supplier_json'], 'purchase_id_str' => $value['purchase_id_str'] ); } else { $supplier_arr = array(); } $sku_id = $advance_info['sku_id']; $this->addRefundQuantityLogs($value[$SellModel::GOODS_ID], $sku_id, $num, $value[$SellModel::ALL_MONEY], $value[$SellModel::TYPE], $value[$SellModel::BILL_ID], $value[$SellModel::PRICE], $supplier_arr, $value['goods_gifts_id'], $onlineOrder['order_genre']); } else if ($advance_info['state'] == 1 && $advance_info['tail_end_time'] > time()) { if (C('IS_SET_REDIS')) { $ApiRedis = new \Addons\Api\RedisController(); $advance_id = $advance_info['advance_id']; $goods_id = $advance_info['goods_id']; $sku_id = $advance_info['sku_id']; if ($value['attribute_state'] == 2) { $redis_key = 'retail_advance_frozen_goods_' . $advance_id . '_goods_id_' . $goods_id . '_sku_id_' . $sku_id; } else { $redis_key = 'retail_advance_frozen_goods_' . $advance_id . '_goods_id_' . $goods_id; } $redis_time = ($advance_info['tail_end_time'] - time()) * 1; //redis 保存时间秒 $frozen_param = array( 'id' => $advance_id, 'goods_id' => $goods_id, 'sku_id' => $sku_id, 'attribute_state' => $value['attribute_state'] ); $frozen_num = D("AdvanceGoods")->frozen_num($frozen_param); if ($frozen_num >= $num) { $frozen_num = round($frozen_num - $num, 3); $redis_save = array( 'advance_id' => $advance_info['advance_id'], 'num' => $frozen_num ); $ApiRedis::$redis->setex($redis_key, $redis_time, json_encode($redis_save)); } } } break; } //退款更新PLUS优惠金额 if ($value['plus_vip_price'] > 0 && $value['original_price'] > 0) { $plus_vip_less_money = bcadd($plus_vip_less_money, $value['vip_less_money'], 2); } } //退款更新PLUS优惠金额 if ($plus_vip_less_money > 0 && $old_bill['vid']) { $RetailPlusVip = D('RetailPlusVip'); $RetailPlusVip->toSetDec(['vip_id' => $old_bill['vid']], 'total_less_money', $plus_vip_less_money); } if (!empty($billOrder[$BillModel::VID])) { // 退次卡 $this->stillSubCard($vip_card); //推送退款信息 $VipModel = D('RetailVip'); $vipMap = array( $VipModel::ID => $billOrder[$BillModel::VID], ); A("Vip/Mark")->refundsuccess($billOrder[$BillModel::VID], $billOrder[$BillModel::ORDER_NO], $billOrder[$BillModel::ALL_MONEY], $time, $store_id); $IntegralOrderModel = D('RetailIntegralOrder'); if ($use_integral > 0) { // 退还使用积分 $map = array( $IntegralOrderModel::VID => $billOrder[$BillModel::VID], $IntegralOrderModel::BILL_ID => $old_bill[$BillModel::ID], $IntegralOrderModel::TYPE => 8,//积分抵现 ); $VipModel->toSetInc($vipMap, $VipModel::INTEGRAL, $use_integral); //添加 $integralItem = array( $IntegralOrderModel::VID => $billOrder[$BillModel::VID], $IntegralOrderModel::TYPE => 4, $IntegralOrderModel::INTEGRAL => $use_integral, $IntegralOrderModel::REMARK => '会员退款返回' . $use_integral . '积分', $IntegralOrderModel::STORE_ID => $store_id, $IntegralOrderModel::BILL_ID => $billOrder[$BillModel::ID], $IntegralOrderModel::ADD_TIME => $time, $IntegralOrderModel::REFUND_INTEGRAL => $use_integral, ); $IntegralOrderModel->addOrder($integralItem);// 扣除积分 并添加积分记录 $IntegralOrderModel->toSetInc($map, $IntegralOrderModel::REFUND_INTEGRAL, $use_integral);//原记录的退还积分增加 } if ($get_integral > 0) { // 退还获得积分 $IntegralOrderModel = D('RetailIntegralOrder'); $map = array( $IntegralOrderModel::VID => $billOrder[$BillModel::VID], $IntegralOrderModel::BILL_ID => $old_bill[$BillModel::ID], $IntegralOrderModel::TYPE => 2,//积分抵现 ); $VipModel->toSetDec($vipMap, $VipModel::INTEGRAL, $get_integral); //退还 $VipModel->toSetDec($vipMap, $VipModel::GRADE_INTEGRAL, $get_integral); //退还 $integralItem = array( $IntegralOrderModel::VID => $billOrder[$BillModel::VID], $IntegralOrderModel::TYPE => 5, $IntegralOrderModel::INTEGRAL => $get_integral, $IntegralOrderModel::REMARK => '会员退款扣除' . $get_integral . '积分', $IntegralOrderModel::STORE_ID => $store_id, $IntegralOrderModel::BILL_ID => $billOrder[$BillModel::ID], $IntegralOrderModel::ADD_TIME => $time, $IntegralOrderModel::REFUND_INTEGRAL => $get_integral, ); $IntegralOrderModel->addOrder($integralItem);// 扣除积分 并添加积分记录 $IntegralOrderModel->toSetInc($map, $IntegralOrderModel::REFUND_INTEGRAL, $get_integral);//原记录的退还积分增加 } } // 分销订单退款金额 $calculate = [ 'old_bill_id' => $old_bill['id'], 'new_bill_id' => $billOrder['id'], 'new_sell_id' => $new_sell_id, ]; Hook::listen('refund_commission', $calculate); // 修改bill_order表 if (!empty($refund['pay_coupon_info'])) { //使用了代金券 $billOrder[$BillModel::ALL_MONEY] = round($billOrder[$BillModel::ALL_MONEY] - $refund['pay_coupon_info']['refund_coupon_fee'], 2); $BillDisModel = new RetailBillDiscountModel(); $BillDisModel->updateOrder([ 'bill_id' => $billOrder['id'] ], [ 'pay_coupon_id_str' => $refund['pay_coupon_info']['pay_coupon_id_str'], 'pay_coupon_fee' => $refund['pay_coupon_info']['refund_coupon_fee'] ]); } $BillModel->updateOrder($bMap, array($BillModel::REFUND_STATUS => 2, $BillModel::FINISH_TIME => time(), $BillModel::PAY_TYPE => $refund['pay_type'], $BillModel::ALL_MONEY => $billOrder[$BillModel::ALL_MONEY], 'refund_money' => $billOrder[$BillModel::ALL_MONEY])); // 记录配送费 $OnlineModel->updateOrder(array($OnlineModel::BILL_ID => $billOrder[$BillModel::ID]), array($OnlineModel::DELIVERY_FEE => $delivery_fee)); $refund_money = round($billOrder[$BillModel::ALL_MONEY] + $old_bill[$BillModel::REFUND_MONEY], 2);//原订单总退款金额 $BillModel->updateOrder($obMap, array($BillModel::REFUND_STATUS => 1, $BillModel::REFUND_MONEY => $refund_money)); // 退款成功后,取消关联的骑手订单 $riderOrderModel = M('rider_order'); $riderOrder = $riderOrderModel->where(array('bill_id' => $old_bill[$BillModel::ID]))->find(); if ($riderOrder && $riderOrder['order_status'] != 6 && $riderOrder['order_status'] != 8) { // 如果骑手订单存在且未送达、未取消,则将其状态改为已取消 $riderOrderModel->where(array('id' => $riderOrder['id']))->save(array( 'order_status' => 8, // 已取消 'cancel_reason' => '售后订单退款', 'cancel_time' => date('Y-m-d H:i:s'), 'update_time' => date('Y-m-d H:i:s') )); // 如果骑手已接单,恢复骑手为在线状态 if ($riderOrder['rider_id'] > 0 && $riderOrder['order_status'] > 0) { $riderInfoModel = M('rider_info'); $riderInfoModel->where(array('id' => $riderOrder['rider_id']))->save(array('work_status' => 1)); // 发送取消通知给骑手(重要:实时通知) $this->notifyRiderOrderCancelled($riderOrder['rider_id'], $riderOrder['id'], $order_no); } } // 退款成功 $result = array('status' => 1, 'msg' => '退款成功'); } else { $result = $refund; } return $result; } /** * 通知骑手订单已取消 * @param int $riderId 骑手ID * @param int $riderOrderId 骑手订单ID * @param string $orderNo 订单号 */ private function notifyRiderOrderCancelled($riderId, $riderOrderId, $orderNo) { try { // 1. 记录系统消息 $messageModel = M('rider_message'); if ($messageModel) { $messageData = array( 'rider_id' => $riderId, 'type' => 'order_cancelled', 'title' => '订单已取消', 'content' => "订单 {$orderNo} 因售后退款已被取消,请留意", 'related_id' => $riderOrderId, 'status' => 0, // 未读 'add_time' => date('Y-m-d H:i:s') ); $messageModel->add($messageData); } // 2. 如果有推送服务,可以在这里发送推送通知 // 例如:极光推送、个推等 // $this->sendPushNotification($riderId, '订单已取消', "订单 {$orderNo} 因售后退款已被取消"); } catch (\Exception $e) { // 记录日志但不影响退款流程 \Think\Log::record('通知骑手订单取消失败:' . $e->getMessage(), \Think\Log::WARN); } } /**导购员佣金退还 * @param $guideArr 佣金记录 * @param $sell_list 退款商品 */ public function refundCommission($guideArr, $sell_list) { $RetailGuideModel = D('RetailGuideIncome'); $SellModel = D('RetailSell'); if (empty($guideArr) || empty($sell_list)) { return; } $income = 0; //扣除的佣金 foreach ($sell_list as $value) { $income += $value['guide_royalty']; } $income = round($income, 2); if ($guideArr['income'] > $income) { $RetailGuideModel->toSetDec(array('id' => $guideArr['id']), "income", $income); } else { $RetailGuideModel->updateOrder(array('id' => $guideArr['id']), array('income' => 0)); } } /** * 验证可否退款 * @param $user_type int 操作人员类型 1.收银员 2.店长 3.后台 * @param $cashier array 收银员信息 * @param $username int 店长账号 * @param $refund_code int 收银端输入的退款码,店长密码 * @param $store_id int 门店id * @return mixed */ public function verifyRefund($user_type, $cashier, $username, $refund_code, $store_id) { // 判断类型 switch ($user_type) { case 1: // 判断收银员信息 $CashierModel = D('RetailCashier'); if (empty($cashier)) { $res = array('status' => 0, 'msg' => '未知收银员,请重新登录'); } // 判断退款权限 if ($cashier[$CashierModel::REFUND_STATE] != 2) { $res = array('status' => 0, 'msg' => '对不起,你无权退款'); } // 判断权限码 if ($cashier[$CashierModel::REFUND_CODE] != $refund_code) { $res = array('status' => 0, 'msg' => '退款密码错误'); } break; case 2: // 判断店长登陆 $ManagerModel = D('RetailManager'); // 查询店长信息 $map = array( $ManagerModel::MOBILE => $username, $ManagerModel::STATUS => 1, $ManagerModel::STORE_ID => $store_id ); $manager = $ManagerModel->getFind($map); if (empty($manager)) { $res = array('status' => 0, 'msg' => '店长账号异常,请联系商户'); } // 判断密码 if (!checkPassword($manager[$ManagerModel::PASSWORD], $refund_code, $manager[$ManagerModel::ADD_TIME])) { $res = array('status' => 0, 'msg' => '店长密码错误'); } break; case 3: // 后台退款 $res = array('status' => 1, 'msg' => '可以退款'); break; default: // 未知操作人员 $res = array('status' => 0, 'msg' => '未知操作人员,请重新登录'); } if (!empty($res) && $res['status'] == 0) { return $res; } $res = array('status' => 1, 'msg' => '可以退款'); return $res; } /* * @param $goods_id 商品id * @param $sku_id 规格id * @param $num 退货数量 * @param $all_money 退款金额 * @param $type 1 商城 2店内 * @param $bill_id 订单id * @param $supplier_arr 寄售供货商 * @param $goods_gifts_id 赠品 * @$order_genre 1.普通订单 2.拼团订单 3.秒杀订单 4预售订单 */ protected function addRefundQuantityLogs($goods_id, $sku_id, $num, $all_money, $type, $bill_id, $price, $supplier_arr, $goods_gifts_id = 0, $order_genre = 1) { $where = array(); if (!empty($sku_id)) { $where['sku_id'] = $sku_id; } $where['goods_id'] = $goods_id; if (!empty($goods_gifts_id)) { $gifts = new \GoodsGifts\Model\GoodsGiftsModel(); $gifts->refundGoodsGifts($goods_gifts_id, $num); } else if (empty($goods_gifts_id) && ($type == 2 || ($type == 1 && $order_genre == 1))) { //非赠品的商品库存增加 D('SSaleMGoods')->updateSetInc($where, "goods_num", $num); } switch ($type) { case 1: //商城 $onlineOrder = D('RetailBillOnline'); $order_genre = $onlineOrder->getFindField(array($onlineOrder::BILL_ID => $bill_id), $onlineOrder::ORDER_GENRE); switch ($order_genre) { case 1: if (!empty($goods_gifts_id)) { //赠品 $warehouseType = 20; $price = 0; $all_money = 0; } else { //正常商品 $warehouseType = 12; } break; case 2: $warehouseType = 8; break; case 3: $warehouseType = 9; break; case 4: $warehouseType = 17; break; } break; case 2: //店内 if (!empty($goods_gifts_id)) { //赠品 $warehouseType = 19; $price = 0; $all_money = 0; } else { $warehouseType = 11; } break; } $data = [ 'goods_id' => $goods_id, 'sku_id' => $sku_id, 'num' => $num, 'price' => $price, 'type' => $warehouseType, 'all_money' => $all_money, 'supplier_arr' => $supplier_arr, ]; $res = A('Api/Inventory')->goodsNumRise($data); return $res; } }