strval($order_no), $PayOrderModel::ORDER_STATE => 'SUCCESS' ); $payOrder = $PayOrderModel->getFind($map); $BillModel = D('RetailBillOrder'); $fields = array( $BillModel::ID, $BillModel::ORDER_NO, $BillModel::AMOUNT_RECEIVED, $BillModel::FINISH_TIME, 'settlement_type', ); if (empty($payOrder)) { $map = array( $BillModel::ORDER_NO => strval($order_no), $BillModel::PAY_STATE => 1, $BillModel::ORDER_TYPE => 1, $BillModel::TYPE => 2 ); $billOrder = $BillModel->getFind($map, $fields); } else { $map = array( $BillModel::ID => $payOrder[$PayOrderModel::BILL_ID], $BillModel::PAY_STATE => 1, $BillModel::TYPE => 2 ); $billOrder = $BillModel->getFind($map, $fields); } if (empty($billOrder)) { $res['status'] = 0; $res['msg'] = '订单不存在'; $this->ajaxReturn($res); } //查询出订单信息 $SellModel = D('RetailSell'); $map = array( $SellModel::BILL_ID => $billOrder[$BillModel::ID] ); $fields = array( $SellModel::ID, $SellModel::GOODS_TYPE, $SellModel::PRICING_METHOD, $SellModel::GOODS_ID, $SellModel::PRICE, $SellModel::ORIGINAL_PRICE, $SellModel::NUM, $SellModel::ALL_MONEY, $SellModel::GOODS_NAME, $SellModel::REFUND_NUM, $SellModel::GOODS_IMG_ID, $SellModel::ATTRIBUTE_STATE, $SellModel::SKU_JSON_INFO, $SellModel::INTEGRAL_DIS_MONEY, //积分抵扣的金额 "supplier_json", "purchase_id_str", "company", "goods_gifts_id", "goods_gifts_type", 'serial_number_state', ); $sellOrder = $SellModel->getSelect($map, $fields); $temp = array(); $count = 0; $SerialClass = new SerialNumberGoods(); foreach ($sellOrder as $key => &$value) { $value['goods_img'] = $this->getGoodsImage($value[$SellModel::GOODS_IMG_ID], ''); if ($value[$SellModel::GOODS_TYPE] == 2) { $value[$SellModel::GOODS_NAME] = $value[$SellModel::GOODS_NAME] ? $value[$SellModel::GOODS_NAME] : '无码商品'; } $value['goods_count'] = 0; //退款数量 //退款数量 $surplus = round($value[$SellModel::NUM] - $value['refund_num'], 3); //退款后剩余有效可退款数量大于0 if ($surplus > 0) { $value['now_num'] = $surplus; $value['goods_count'] = $surplus; $sku = array( 'name' => '' ); if (!empty($value[$SellModel::SKU_JSON_INFO])) { $temp1 = json_decode($value[$SellModel::SKU_JSON_INFO], true); $sku['name'] = $temp1['name']; } $value[$SellModel::SKU_JSON_INFO] = $sku; $value[$SellModel::NUM] = round($value[$SellModel::NUM], 3); $value[$SellModel::REFUND_NUM] = round($value[$SellModel::REFUND_NUM], 3); if (floatval($value['refund_num']) > 0) { $map = array( $SellModel::SELL_ID => $value[$SellModel::ID], $SellModel::PAY_STATE => 1, //支付状态为支付 ); $value['refund_money'] = floatval($SellModel->getSum($map, $SellModel::ALL_MONEY)); //获取已退款总金额 } else { $value['refund_money'] = 0; } if ($value['serial_number_state'] == 1) { $value['refund_serial_list'] = $SerialClass->sellSerialList([ 'id' => $value['id'], 'files' => 'id,main_serial_number,auxiliary_serial_number_one,auxiliary_serial_number_two', 'type' => 2 ])['data']['list']; } unset($value[$SellModel::GOODS_IMG_ID]); unset($value[$SellModel::GOODS_ID]); $temp[] = $value; $count = $count + $surplus; } } if ($count > 0) { $billOrder['goods_info'] = $temp; $res['status'] = 1; $res['msg'] = '查询成功'; unset($billOrder[$BillModel::ID]); $res['data'] = $billOrder; } else { $res['status'] = 0; $res['msg'] = '该订单已全部退款'; } } $this->ajaxReturn($res); } /** * 收银员退款线下 */ public function orderRefund_v1() { $order_no = I('post.order_no'); //订单编号 $goods_info = $_POST['goods_info']; //退款数组 sell表数据 $refund_code = I('post.refund_code'); //收银员退款密码 $user_type = I('post.user_type'); //登录类型 1收银员 2店长登录退款 $username = I('post.username'); //店长账号 if (empty($order_no) || empty($goods_info) || empty($refund_code) || empty($user_type)) { $result['status'] = 0; $result['msg'] = '缺少参数1'; $this->ajaxReturn($result); } if ($user_type == 2) { if (empty($username)) { $result['status'] = 0; $result['msg'] = '缺少参数'; $this->ajaxReturn($result); } } else if ($user_type != 1) { $result['status'] = 0; $result['msg'] = '参数有误'; $this->ajaxReturn($result); } $tempGoods = json_decode($goods_info, true); if (!is_array($tempGoods)) { $result['status'] = 0; $result['msg'] = '商品信息有误'; $this->ajaxReturn($result); } $BillModel = new RetailBillOrderModel(); $map = array( 'order_no' => $order_no, 'pay_state' => 1, 'order_type' => 1 ); $billOrder = $BillModel->getFind($map); // bill订单 if (empty($billOrder)) { $result['status'] = 0; $result['msg'] = '未查询到该订单'; $this->ajaxReturn($result); } if ($billOrder['type'] != 2) { $result['status'] = 0; $result['msg'] = '该接口只支持线下退款'; $this->ajaxReturn($result); } if (!in_array($billOrder['settlement_type'], [1, 2])) { $this->ajaxReturn(['status' => 0, 'msg' => '退单类型有误!']); } // 判断是否为购买次卡 $CardOrder = D('RetailCardOrder'); $co_map = array( $CardOrder::MERCHANT_ID => $billOrder['merchant_id'], $CardOrder::STORE_ID => $billOrder['store_id'], $CardOrder::VIP_ID => $billOrder['vid'], $CardOrder::BILL_ID => $billOrder['id'], ); $card_order = $CardOrder->getFind($co_map); if (!empty($card_order)) { $result['status'] = 0; $result['msg'] = '该订单为购买次卡活动订单,无法退款'; $this->ajaxReturn($result); } // 判断是否送次卡 $vip_card = array(); if (!empty($billOrder['vid'])) { $judge_refund = A('PayApi/Refund')->judgeRefund($billOrder); if ($judge_refund['status'] == 0) { $this->ajaxReturn($judge_refund); } else { $vip_card = $judge_refund['vip_card']; } } $refund_time_limit = self::$store['cashier_refund_time']; $time = time(); if ($billOrder['finish_time'] + $refund_time_limit * 86400 - $time < 0) { $result['status'] = 0; $result['msg'] = '该订单已超过退款时间限制范围'; $this->ajaxReturn($result); } /** * 验证退款密码 */ $res = $this->verifyRefund($user_type, $refund_code, $username); if ($res['status'] != 1) { $this->ajaxReturn($res); } if ($user_type == 1) { //收银员退款 $cashier = self::$cashier; $CashierModel = D('RetailCashier'); if ($cashier[$CashierModel::REFUND_STATE] == 2) { if ($refund_code != $cashier[$CashierModel::REFUND_CODE]) { $result['status'] = 0; $result['msg'] = '退款密码有误'; $this->ajaxReturn($result); } } else { $result['status'] = 0; $result['msg'] = '对不起,你无权退款'; $this->ajaxReturn($result); } } else { //店长退款 $ManagerModel = D('RetailManager'); $map = array( $ManagerModel::MOBILE => $username, $ManagerModel::STATUS => 1, $ManagerModel::STORE_ID => self::$store_id ); $manager = $ManagerModel->getFind($map); if (empty($manager)) { $result['status'] = 0; $result['msg'] = '未找到该店长'; $this->ajaxReturn($result); } if (!checkPassword($manager[$ManagerModel::PASSWORD], $refund_code, $manager[$ManagerModel::ADD_TIME])) { $result['status'] = 0; $result['msg'] = '店长密码错误'; $this->ajaxReturn($result); } } //普通退款 $supplier_type = D("RetailStore")->getFindField(array('id' => $billOrder['store_id']), 'supplier_type'); $SellModel = new RetailSellModel(); $sell_id = array(); foreach ($tempGoods as $v) { if (empty($v[$SellModel::ID]) || empty($v['goods_count'])) { $result['status'] = 0; $result['msg'] = '退款商品参数有误'; $this->ajaxReturn($result); } $sell_id[] = intval($v[$SellModel::ID]); } $tempGoods = ascSortByFields($tempGoods, 'id'); //退款数据按id排序 $map = [ 'id' => ['in', $sell_id], 'bill_id' => $billOrder['id'] ]; $sellGoods = $SellModel->getSelect($map, '*', 'id asc'); //按照id升序获取商品 if (count($sellGoods) != count($sell_id)) { $result['status'] = 0; $result['msg'] = '退款商品参数有误1'; $this->ajaxReturn($result); } $refundData = getRefundList($tempGoods, $billOrder['id']); if ($refundData['status'] == 0) { $this->ajaxReturn($refundData); } //串号验证 $data = [ 'merchant_id' => self::$merchant_id, 'store_id' => self::$store_id, 'type' => 2, 'goods_list' => $refundData['refundSellList'] ]; $SellClass = new Sell(); $verifyResult = $SellClass->sellGoodsSerialVerify($data); if ($verifyResult['status'] != 1) { $verifyResult['msg'] = $verifyResult['message']; $this->ajaxReturn($verifyResult); } $refundSellList = $refundData['refundSellList']; //存储退款商品sell数据 $allMoney = $refundData['allMoney']; //总退款金额 $new_discount = $refundData['new_discount']; //新优惠表 if (!$allMoney) { $result['status'] = 0; $result['msg'] = '商品退款信息错误'; $this->ajaxReturn($result); } //验证是否使用代金券指定商品不支持部分退款 //验证指定商品代金券不能部分退款 $PlugClass = new Plug(); $payCouponResult = $PlugClass->PlugPermissions([ 'merchant_id' => self::$merchant_id, 'identification_arr' => [ 'wxpaycoupon' ] ]); if ($allMoney != $billOrder['all_money'] && !empty($payCouponResult['data']['plug']['wxpaycoupon'])) { $PayCouponClass = new PayCoupon(); $verifyResult = $PayCouponClass->payCouponRefundVerify([ 'bill_id' => $billOrder['id'], 'refund_all_money' => $allMoney, 'all_money' => $billOrder['all_money'] ]); if ($verifyResult['status'] != 1) { $verifyResult['msg'] = $verifyResult['message']; $this->ajaxReturn($verifyResult); } } $history = S('refund_order_no_' . $billOrder['order_no']); //获取缓存 if (!empty($history)) { $result['status'] = 0; $result['msg'] = '请勿频繁操作!'; $this->ajaxReturn($result); } S('refund_order_no_' . $billOrder['order_no'], $billOrder['order_no'], 2); //写入2秒的缓存,防止用户频繁点击 $SerialClass = new SerialNumberGoods(); //插入bill退款数据 $newBill = $billOrder; $newBill['add_time'] = time(); $newBill['refund_no'] = $billOrder['order_no']; $newBill['order_type'] = 2; $newBill['refund_status'] = 2; $newBill['cashier_id'] = self::$cashier_id; $newBill['refund_money'] = $allMoney; $newBill['all_money'] = $allMoney; $newBill['pay_state'] = 0; unset($newBill['id']); $new_bill = $BillModel->addBillOrder($newBill); //添加新的退款记录 if ($new_bill) { //添加新的优惠记录 $BillDisModel = new RetailBillDiscountModel(); $new_discount['bill_id'] = $new_bill['id']; $new_discount = $BillDisModel->addOrder($new_discount); if (!$new_discount) { $result['status'] = 0; $result['msg'] = '数据库发生错误'; S('refund_order_no_' . $billOrder['order_no'], null); $this->ajaxReturn($result); } } else { $result['status'] = 0; $result['msg'] = '创建退款订单失败'; S('refund_order_no_' . $billOrder['order_no'], null); $this->ajaxReturn($result); } //添加退款数据 foreach ($refundSellList as &$sVal) { if ($sVal['serial_number_state'] == 1) { $serial_list = $sVal['serial_list']; } unset($sVal['id']); //删除出售记录id unset($sVal['serial_list']); $sVal['sku_id'] = $sVal['sku_id'] ? $sVal['sku_id'] : 0; $sVal['sell_type'] = 2; //退款 $sVal['pay_state'] = 0; //退款 $sVal['bill_id'] = $new_bill['id']; //插入新的bill_id $sVal['add_time'] = time(); //插入新的bill_id $add = $SellModel->addOrder($sVal); if ($add) { $sVal['id'] = $add; if ($sVal['serial_number_state'] == 1) { $sVal['serial_list'] = $serial_list; $SerialClass->sellSerialAdd([ 'merchant_id' => self::$merchant_id, 'store_id' => self::$store_id, 'sell_list' => [$sVal], 'type' => 2 ]); } } else { $result['status'] = 0; $result['msg'] = '添加商品退款明细失败'; S('refund_order_no_' . $billOrder['order_no'], null); $this->ajaxReturn($result); } } if ($billOrder['settlement_type'] == 1) { //获取退款顺序 $RefundOrderModel = new RefundOrderModel(); $refundOrder = $RefundOrderModel->getFindOrderAsc(self::$merchant_id); $refundRes = array(); //存储所有退款结果 $refundAllMoney = 0; $PayOrderModel = D('RetailPayOrder'); $pay_type = 8; $RetailPaySet = new RetailPaySetModel(); $paySet = $RetailPaySet->getFindMerchantPaySet(self::$merchant_id); foreach ($refundOrder as $key => $value) { $map = array( $PayOrderModel::BILL_ID => $billOrder['id'], $PayOrderModel::ORDER_STATE => 'SUCCESS', $PayOrderModel::ORDER_TYPE => 1, ); $payOrderList = array(); switch ($key) { case 'cash_refund_order': //现金 $map[$PayOrderModel::PAY_TYPE] = 3; $pay_type = 1; $payOrderList = $PayOrderModel->getSelect($map); break; case 'vip_refund_order': //会员余额 $map[$PayOrderModel::PAY_TYPE] = 6; $pay_type = 5; $payOrderList = $PayOrderModel->getSelect($map); break; case 'other_refund_order': //其他支付 $map[$PayOrderModel::PAY_TYPE] = 5; $pay_type = 7; $payOrderList = $PayOrderModel->getSelect($map); break; case 'al_refund_order': //支付宝 $map[$PayOrderModel::PAY_TYPE] = 2; $pay_type = 4; $payOrderList = $PayOrderModel->getSelect($map); break; case 'wx_refund_order': //微信 $map[$PayOrderModel::PAY_TYPE] = 1; $pay_type = 3; $payOrderList = $PayOrderModel->getSelect($map); break; case 'mec_refund_order': //德育币 $map[$PayOrderModel::PAY_TYPE] = 8; $pay_type = 9; $payOrderList = $PayOrderModel->getSelect($map); break; } if (!empty($payOrderList)) { foreach ($payOrderList as $val) { if ($val['pay_type'] == 1 && $val['pay_coupon_fee'] > 0) { //微信支付 $val[$PayOrderModel::TRADE_AMOUNT] = bcadd($val[$PayOrderModel::TRADE_AMOUNT], $val['pay_coupon_fee'], 2); $val[$PayOrderModel::REFUND_MONEY] = bcadd($val[$PayOrderModel::REFUND_MONEY], $val['refund_coupon_fee'], 2); } $tempMoney = bcsub($val[$PayOrderModel::TRADE_AMOUNT], $val[$PayOrderModel::REFUND_MONEY], 2); if ($tempMoney && bcadd($refundAllMoney, $tempMoney, 2) > $allMoney) { $tempMoney = bcsub($allMoney, $refundAllMoney, 2); } $tempMoney = floatval($tempMoney);//钱数转换类型 if (!empty($tempMoney)) { $val[$PayOrderModel::BILL_ID] = $new_bill['id']; $val['cashier_id'] = self::$cashier_id; $refundRes[] = $this->refundMoney($billOrder, $val, $tempMoney, $paySet['config']); //去退款 } $refundAllMoney = bcadd($refundAllMoney, $tempMoney, 2); } } if (bcsub($allMoney, $refundAllMoney, 2) <= 0) { break; } } if (empty($refundRes)) { S('refund_order_no_' . $billOrder['order_no'], null); $this->ajaxReturn(['status' => 0, 'msg' => '退款失败']); } $status = 0; $msg = ''; $success = '退款失败'; $is_fail = empty($refundRes) ? true : false; //判断是否有失败的退款 $is_success = false; //判断是否有成功的退款 $is_error = false; //判断是否有数据库更新失败的退款 $pay_coupon_fee = 0; //代金券总金额 foreach ($refundRes as $v) { if ($v['pay_coupon_fee'] > 0 && !empty($v['pay_coupon_fee'])) { $pay_coupon_fee += $v['pay_coupon_fee']; } if ($v['status'] === 0) { //退款失败 $is_fail = true; $msg .= ',' . $v['msg']; } else if ($v['status'] == 1) { $status = 1; $success = '退款成功'; $is_success = true; } else { //数据库更新失败 $is_error = true; $msg .= ',' . $v['msg']; } } if ($is_fail && ($is_success && !$is_error || count($refundRes) == 1)) { //有部分退款失败或数据库更新失败 $result = array( 'status' => $status, 'msg' => $success . $msg ); $save = array( 'refund_status' => -1 ); $BillModel->updateOrder(['id' => $new_bill['id']], $save); //存储为退款失败订单 } else { //全部退款成功 if (count($refundRes) != 1) { $pay_type = 8; } $item = array( 'sell' => $refundSellList, 'old_bill' => $billOrder, 'new_bill' => $new_bill, 'pay_type' => $pay_type, 'supplier_type' => $supplier_type, 'pay_coupon_fee' => $pay_coupon_fee ); // 退次卡 A('PayApi/Refund')->stillSubCard($vip_card); $result = $this->refundGoods_v1($item); if ($is_error) { $result['msg'] .= ',' . $msg; } } $result['refundRes'] = $refundRes; } else { //赊账订单 $CreditRefund = new \Credit\Business\CreditRefund(); $refundCreateRes = $CreditRefund->refundCreate([ 'refund_order' => $new_bill, 'old_bill_id' => $billOrder['id'], ]); if ($refundCreateRes['status'] != 1) { S('refund_order_no_' . $billOrder['order_no'], null); $this->ajaxReturn($refundCreateRes); } $item = [ 'sell' => $refundSellList, 'old_bill' => $billOrder, 'new_bill' => $new_bill, 'pay_type' => $refundCreateRes['pay_type'], 'supplier_type' => $supplier_type ]; $result = $this->refundGoods_v1($item); } S('refund_order_no_' . $billOrder['order_no'], null); $this->ajaxReturn($result); } /** * 验证可否退款 * @param $user_type * @param $refund_code * @param $username * @return mixed */ public function verifyRefund($user_type, $refund_code, $username) { if ($user_type == 1) { //收银员退款 $cashier = self::$cashier; $CashierModel = D('RetailCashier'); if ($cashier[$CashierModel::REFUND_STATE] == 2) { if ($refund_code != $cashier[$CashierModel::REFUND_CODE]) { $result['status'] = 0; $result['msg'] = '退款密码有误'; return $result; } } else { $result['status'] = 0; $result['msg'] = '对不起,你无权退款'; return $result; } } else { //店长退款 $ManagerModel = D('RetailManager'); $map = array( $ManagerModel::MOBILE => $username, $ManagerModel::STATUS => 1, $ManagerModel::STORE_ID => self::$store_id ); $manager = $ManagerModel->getFind($map); if (empty($manager)) { $result['status'] = 0; $result['msg'] = '未找到该店长'; return $result; } if (!checkPassword($manager[$ManagerModel::PASSWORD], $refund_code, $manager[$ManagerModel::ADD_TIME])) { $result['status'] = 0; $result['msg'] = '店长密码错误'; return $result; } } $result['status'] = 1; $result['msg'] = '可以退款'; return $result; } /** * 退钱 * @param $billOrder 原bill的id * @param $payOrder 新pay_order * @param $money 退款金额 * @param $config 支付配置 * @return mixed */ protected function refundMoney($billOrder, $payOrder, $money, $config) { $PayOrderModel = new RetailPayOrderModel(); $item = array( $PayOrderModel::PAY_ORDER_ID => $payOrder[$PayOrderModel::ID], //'退款原订单id', $PayOrderModel::SCENE_TYPE => 2, //'1付款 2退款', $PayOrderModel::ORDER_TYPE => 1, //'1购买商品', $PayOrderModel::PAY_TYPE => $payOrder[$PayOrderModel::PAY_TYPE], //'1微信 2支付宝 3现金 4小程序微信 5其他支付方式 6会员余额', $PayOrderModel::TRADE_AMOUNT => $money, //'订单金额', $PayOrderModel::STORE_ID => $payOrder[$PayOrderModel::STORE_ID], //'门店id', $PayOrderModel::MERCHANT_ID => $payOrder[$PayOrderModel::MERCHANT_ID], //'商户id', $PayOrderModel::CASHIER_ID => $payOrder[$PayOrderModel::CASHIER_ID], //'收银员id', $PayOrderModel::VID => $payOrder[$PayOrderModel::VID], //'会员id', $PayOrderModel::TRADE_NO => $payOrder[$PayOrderModel::TRADE_NO], //'订单微信支付宝流水号', $PayOrderModel::ADD_TIME => time(), //'订单创建时间', $PayOrderModel::M_PAY_TYPE => $payOrder[$PayOrderModel::M_PAY_TYPE], //'订单支付类型 1普通商户模式 2服务商模式 3新大陆模式', $PayOrderModel::BILL_ID => $payOrder[$PayOrderModel::BILL_ID], //'bill表id', $PayOrderModel::OTHER_PAY_ID => $payOrder[$PayOrderModel::OTHER_PAY_ID], //'其他支付id', 'pay_coupon_fee' => $payOrder['pay_coupon_fee'], //代金券总优惠金额, ); $new_pay_order = $PayOrderModel->addPayOrder($item); if ($new_pay_order) { switch ($item[$PayOrderModel::PAY_TYPE]) { case '1': case '2': //微信 //支付宝 $new_pay_order['before_amount'] = $payOrder[$PayOrderModel::TRADE_AMOUNT]; $new_pay_order['before_trade_no'] = $payOrder[$PayOrderModel::OUT_TRADE_NO]; if ($new_pay_order[$PayOrderModel::M_PAY_TYPE] == 4) { //云闪付 $payObj = new CloudPayController(); $res = $payObj->cloudRefund($new_pay_order, $config, $new_pay_order[$PayOrderModel::PAY_TYPE]); } else if ($new_pay_order[$PayOrderModel::M_PAY_TYPE] == 3) { //新大陆 $res = A('Pay/PayContinent')->toOrderRefund_v3($new_pay_order); } else if ($new_pay_order[$PayOrderModel::M_PAY_TYPE] == 5) { //乐返 $happyPay = new \HappyPay\Business\HappyPay(); $res = $happyPay->happyMoneyHandle($new_pay_order, $config); if ($res['status'] == 1) { A('Pay/Base')->doRefundRate($new_pay_order['trade_no'], $new_pay_order['trade_amount'], 4);//乐返分润 } } else if ($new_pay_order[$PayOrderModel::M_PAY_TYPE] == 6) { //拉卡拉 $happyPay = new \LaKaLaPay\Business\LaKaLaMis(); $res = $happyPay->LaKaLaMoneyHandle($new_pay_order, $config); if ($res['status'] == 1) { A('Pay/Base')->doRefundRate($new_pay_order['trade_no'], $new_pay_order['trade_amount'], 5);//拉卡拉分润 } } else if ($new_pay_order[$PayOrderModel::M_PAY_TYPE] == 7) { //钱客云 $moneyGuest = new \MoneyGuestPay\Business\MoneyGuest(); $res = $moneyGuest->moneyGuestRefund($new_pay_order, $config); if ($res['status'] == 1) { //退款成功之后,走退款分润 A('Pay/Base')->doRefundRate($new_pay_order['trade_no'], $new_pay_order['trade_amount'], 6);//钱客云分润 } } else if ($new_pay_order[$PayOrderModel::PAY_TYPE] == 1) { //微信 $res = A('Pay/NewWxPay')->toWxRefund_v2($new_pay_order, $config); } else { //支付宝 $res = A('Pay/NewAliPay')->toAliRefund_v2($new_pay_order, $config); } break; case '3': case '5': //现金 //其他支付 $res = array( 'status' => 1 ); break; case '6': //会员余额 $res = A('PayApi/VipPay')->refundForVip_v1($item, 1, 5); break; case '8': //德育币 $MoralEducationCoinPay = new \MoralEducationCoin\Business\Pay(); $res = $MoralEducationCoinPay->refund([ 'store_third_code' => self::$store['third_code'], 'amount' => $item['trade_amount'], 'third_vip_code' => $billOrder['third_vip_code'], ]); break; default: $res = array( 'status' => 0, 'msg' => '数据库发生错误' ); } if ($res['status'] == 1) { $BillModel = new RetailBillOrderModel(); //支付流水修改 $save = array( $PayOrderModel::ORDER_STATE => 'REFUND', $PayOrderModel::EXTEND_CONTENT => $res['response'] ? json_encode($res['response']) : '', $PayOrderModel::TRADE_DATE => time(), ); //微信支付判断是否使用代金券 if ($res['response']['coupon_refund_count'] > 0 && $item[$PayOrderModel::PAY_TYPE] == 1) { //使用了代金券修改代金券状态且记录退款的代金券信息 $PaymentRefundClass = new PaymentRefund(); $couponResult = $PaymentRefundClass->paymentRefund(json_encode([ 'merchant_id' => $item['merchant_id'], 'type' => 2, 'refund_info' => $res['response'], 'old_pay_order_id' => $item[$PayOrderModel::PAY_ORDER_ID] ])); if ($couponResult['status'] == 1) { $couponData = $couponResult['data']; //减去代金券的金额 $BillModel->toSetDec([ 'id' => $item['bill_id'] ], 'all_money', $couponData['pay_coupon_fee']); $BillModel->toSetDec([ 'id' => $item['bill_id'] ], 'refund_money', $couponData['pay_coupon_fee']); $DisCountModel = new RetailBillDiscountModel(); $DisCountModel->updateOrder([ 'bill_id' => $item['bill_id'] ], [ 'pay_coupon_id_str' => $couponData['pay_coupon_id_str'], 'pay_coupon_fee' => $couponData['pay_coupon_fee'] ]); $PayOrderModel->toSetInc(array($PayOrderModel::ID => $item[$PayOrderModel::PAY_ORDER_ID]), 'refund_coupon_fee', $couponData['pay_coupon_fee']); //增加原退款代金券金额 $save['pay_coupon_id_str'] = $couponData['pay_coupon_id_str'];//代金券id ,字符串拼接 $save['refund_coupon_fee'] = $couponData['pay_coupon_fee']; //代金券优惠总金额 $save['trade_amount'] = $couponData['cash_fee']; //微信退款的现金金额 $money = round($money - $couponData['pay_coupon_fee'], 2); $result['pay_coupon_fee'] = $couponData['pay_coupon_fee']; } } $PayOrderModel->updateOrder(array($PayOrderModel::ID => $new_pay_order[$PayOrderModel::ID]), $save); //更新新的pay_order数据 $PayOrderModel->toSetInc(array($PayOrderModel::ID => $item[$PayOrderModel::PAY_ORDER_ID]), $PayOrderModel::REFUND_MONEY, $money); //增加原pay_order的退款金额 $BillModel->toSetInc(array($BillModel::ID => $billOrder['id']), $BillModel::REFUND_MONEY, $money); //增加bill_order表的退款金额 $result['status'] = 1; $result['msg'] = '退款成功'; } else { $result['res'] = $res; $result['status'] = 0; $result['msg'] = $res['msg']; } } else { $result['status'] = 0; $result['msg'] = '退款订单创建失败'; } return $result; } /** * 退款提交 * @param $item * @return mixed */ protected function refundGoods_v1($item) { $BillModel = D('RetailBillOrder'); $refundSellGoods = $item['sell']; $money = $item['new_bill'][$BillModel::ALL_MONEY]; $new_bill = $item['new_bill']; //新bill $old_bill = $item['old_bill']; //旧bill $supplier_type = $item['supplier_type'] ? $item['supplier_type'] : 1; $time = time(); $all_integral = 0; //总退还积分 $all_get_integral = 0; //总扣除积分 $SellModel = D('RetailSell'); $royaltyMoney = 0; $plus_vip_less_money = 0; foreach ($refundSellGoods as $key => &$value) { $sku_id = ''; //规格id $map = array( $SellModel::ID => $value[$SellModel::SELL_ID] ); $SellModel->toSetInc($map, $SellModel::REFUND_NUM, $value[$SellModel::NUM]); //修改旧sell退款数量 $SellModel->toSetInc($map, $SellModel::REFUND_MONEY, $value[$SellModel::ALL_MONEY]); //修改旧sell退款数量 //退款更新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); } $all_integral += $value[$SellModel::USE_INTEGRAL]; //退还积分累加 $all_get_integral += $value[$SellModel::GET_INTEGRAL]; //扣除积分累加 $num = $value[$SellModel::NUM]; if ($value[$SellModel::ATTRIBUTE_STATE] == 2) { //规格商品 if (!empty($value[$SellModel::SKU_JSON_INFO])) { $sku = json_decode($value[$SellModel::SKU_JSON_INFO], true); $sku_id = $sku['id']; $num = round($value[$SellModel::NUM], 3); } } $save = array( $SellModel::SELL_NUMBER => $num, $SellModel::PAY_STATE => 1 ); $map = array($SellModel::ID => $value[$SellModel::ID]); $SellModel->updateOrder($map, $save); //更新退款记录的状态 // 添加库存记录并且加库存 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(); } $refund_arr = [ 'goods_id' => $value[$SellModel::GOODS_ID], 'sku_id' => $sku_id, 'num' => $num, 'refund_money' => $value[$SellModel::ALL_MONEY], 'price' => $value[$SellModel::PRICE], 'supplier_arr' => $supplier_arr, 'goods_gifts_id' => $value['goods_gifts_id'], 'serial_list' => $value['serial_list'] ]; $this->refundGoodsQuantityLogs_v1($refund_arr); //添加入库记录 $royaltyMoney += $value[$SellModel::GUIDE_ROYALTY]; } //退款更新PLUS优惠金额 if ($plus_vip_less_money > 0) { $RetailPlusVip = D('RetailPlusVip'); $RetailPlusVip->toSetDec(['vip_id' => $old_bill['vid']], 'total_less_money', $plus_vip_less_money); } //修改导购员总金额 if (!empty($old_bill[$BillModel::GUIDE_ID])) { $GuideIncomeModel = D('RetailGuideIncome'); $guideIncome = $GuideIncomeModel->getFind(array($GuideIncomeModel::BILL_ID => $old_bill[$BillModel::ID])); if (!empty($guideIncome)) { if ($guideIncome['income'] > $royaltyMoney) { $GuideIncomeModel->toSetDec(array('id' => $guideIncome['id']), "income", $royaltyMoney); } else { $GuideIncomeModel->updateOrder(array('id' => $guideIncome['id']), array('income' => 0)); } } } //会员积分 if (!empty($old_bill[$BillModel::VID])) { //推送退款信息 A("Vip/Mark")->refundsuccess($old_bill[$BillModel::VID], $old_bill[$BillModel::ORDER_NO], $money, $time, self::$store_id); //扣除消费获得的积分 $VipModel = D('RetailVip'); $IntegralOrderModel = D('RetailIntegralOrder'); $vipMap = array( $VipModel::ID => $old_bill[$BillModel::VID] ); if ($all_get_integral > 0) { $VipModel->toSetDec($vipMap, $VipModel::INTEGRAL, $all_get_integral); //扣除积分 $VipModel->toSetDec($vipMap, $VipModel::GRADE_INTEGRAL, $all_get_integral); //扣除等级积分 $map = array( $IntegralOrderModel::VID => $old_bill[$BillModel::VID], $IntegralOrderModel::BILL_ID => $old_bill[$BillModel::ID], $IntegralOrderModel::TYPE => 2, //消费获取 ); $integralItem[$IntegralOrderModel::VID] = $old_bill[$BillModel::VID]; $integralItem[$IntegralOrderModel::TYPE] = 5; $integralItem[$IntegralOrderModel::INTEGRAL] = $all_get_integral; $integralItem[$IntegralOrderModel::REMARK] = '会员退款扣除' . $all_get_integral . '积分'; $integralItem[$IntegralOrderModel::STORE_ID] = self::$store_id; $integralItem[$IntegralOrderModel::BILL_ID] = $new_bill[$BillModel::ID]; $integralItem[$IntegralOrderModel::ADD_TIME] = $time; $integralItem[$IntegralOrderModel::REFUND_INTEGRAL] = $all_get_integral; $IntegralOrderModel->addOrder($integralItem); // 扣除积分 并添加积分记录 $IntegralOrderModel->toSetInc($map, $IntegralOrderModel::REFUND_INTEGRAL, $all_get_integral); //原记录的退还积分增加 } //返回抵现扣除的积分 if ($all_integral > 0) { $map = array( $IntegralOrderModel::VID => $old_bill[$BillModel::VID], $IntegralOrderModel::BILL_ID => $old_bill[$BillModel::ID], $IntegralOrderModel::TYPE => 8, //积分抵现 ); $VipModel->toSetInc($vipMap, $VipModel::INTEGRAL, $all_integral); //添加 $integralItem[$IntegralOrderModel::VID] = $old_bill[$BillModel::VID]; $integralItem[$IntegralOrderModel::TYPE] = 4; $integralItem[$IntegralOrderModel::INTEGRAL] = $all_integral; $integralItem[$IntegralOrderModel::REMARK] = '会员退款返回' . $all_integral . '积分'; $integralItem[$IntegralOrderModel::STORE_ID] = self::$store_id; $integralItem[$IntegralOrderModel::BILL_ID] = $new_bill[$BillModel::ID]; $integralItem[$IntegralOrderModel::ADD_TIME] = $time; $integralItem[$IntegralOrderModel::REFUND_INTEGRAL] = $all_integral; $IntegralOrderModel->addOrder($integralItem); // 扣除积分 并添加积分记录 $IntegralOrderModel->toSetInc($map, $IntegralOrderModel::REFUND_INTEGRAL, $all_integral); //原记录的退还积分增加 } } $newBillSave = array( $BillModel::PAY_STATE => 1, $BillModel::PAY_TYPE => $item['pay_type'], ); $upNewBill = $BillModel->updateOrder(array($BillModel::ID => $new_bill[$BillModel::ID]), $newBillSave); if (!$upNewBill) { $result['status'] = 0; $result['msg'] = '退款订单更新失败'; return $result; } $new_bill['pay_coupon_fee'] = $item['pay_coupon_fee']; //代金券金额 $result['data'] = $this->getRefundDetail($new_bill, $refundSellGoods); $result['status'] = 1; $result['msg'] = '退款原单更新成功,新单据添加成功'; return $result; } /* 获取退款打印参数 */ protected function getRefundDetail($bill, $sellOrder) { $BillModel = D('RetailBillOrder'); $res['refund_list'] = getPayTypeList($bill[$BillModel::PAY_TYPE], $bill[$BillModel::ALL_MONEY], $bill[$BillModel::ID]); /* 商品 */ $refundArr = []; foreach ($sellOrder as $key => $val) { $refundArr[] = [ 'code_price_state' => $val['code_price_state'], 'price' => $val['price'], 'num' => round($val['num'], 3), 'goods_name' => $val['goods_name'] . ($val['attribute_state'] == 2 && $val['sku_json_info'] ? ('(' . json_decode($val['sku_json_info'], true)['name'] . ')') : ''), 'pricing_method' => $val['pricing_method'], 'all_money' => $val['all_money'], 'before_all_money' => $val['code_price_state'] == 1 ? round($val['all_money'] + $val['vip_dis_money'] + $val['cashier_manual_discount_money'] + $val['cashier_dis_money'] + $val['coupon_money'] + $val['small_changes_money'] + ($val['integral_marketing'] == 1 ? $val['integral_dis_money'] : 0), 2) : round($val['price'] * $val['num'], 2), ]; //扫码价: 总价+会员折扣优惠的金额+收银员单品打折的金额+收银员整单折扣的金额+优惠券优惠的金额+抹零的金额+积分抵扣的金额 //非扫码价:身份价格*数量 } $res['goods_info'] = $refundArr; $StoreModel = D('RetailStore'); $CashierModel = D('RetailCashier'); $res['store_name'] = self::$store[$StoreModel::STORE_NAME]; $res['refund_time'] = date('Y/m/d H:i:s', $bill[$BillModel::ADD_TIME]); $res['order_no'] = $bill[$BillModel::ORDER_NO]; $res['all_money'] = round($bill[$BillModel::ALL_MONEY] - ($bill['pay_coupon_fee'] ? $bill['pay_coupon_fee'] : 0), 2); $res['job_num'] = self::$cashier[$CashierModel::JOB_NUM]; $res['pay_coupon_fee'] = $bill['pay_coupon_fee'] ? floatval($bill['pay_coupon_fee']) : 0; if ($bill[$BillModel::VID]) { $VipModel = D('RetailVip'); $fields = array( $VipModel::BALANCE, //余额 $VipModel::INTEGRAL, //积分 ); $vip_data = $VipModel->getFind(array($VipModel::ID => $bill[$BillModel::VID]), $fields); $res['vip_data'] = $vip_data; } $res['end_time'] = time(); return $res; } /** * 退款入库 * @param $param * [ * goods_id * sku_id * num 数量 * refund_money 退货总价 * price 退货价 * supplier_arr 寄售供货商商品详情 * goods_gifts_id 赠品 * ] * @return mixed */ public function refundGoodsQuantityLogs_v1($param) { $goods_id = $param['goods_id']; $sku_id = $param['sku_id']; $num = $param['num']; $refund_money = $param['refund_money']; $price = $param['price']; $supplier_arr = $param['supplier_arr'] ? $param['supplier_arr'] : []; $goods_gifts_id = $param['goods_gifts_id'] ? $param['goods_gifts_id'] : null; $serial_list = $param['serial_list'] ? $param['serial_list'] : []; if (!empty($goods_gifts_id)) { //赠品 $price = 0; $refund_money = 0; $type = 19; $GoodsGiftModel = new RetailGoodsGiftsModel(); $GoodsGiftModel->toSetInc(['id' => $goods_gifts_id], 'remain_inventory', $num); // 以下写法是错误的 做赠品活动的时候再修改 // $gifts = new \GoodsGifts\Model\GoodsGiftsModel(); // $gifts->refundGoodsGifts($goods_gifts_id, $num); } else { //普通商品 A('Api/Inventory')->Inventory(1, $num, $goods_id, $sku_id); $type = 11; } $data = [ 'goods_id' => $goods_id, 'sku_id' => $sku_id, 'num' => $num, 'price' => $price, 'type' => $type, 'all_money' => $refund_money, 'supplier_arr' => $supplier_arr, 'serial_list' => $serial_list ]; $result = A('Api/Inventory')->goodsNumRise($data); return $result; } /** * 线上订单退款 */ public function onlineOrderRefund_v1() { $order_no = I('post.order_no'); // 订单编号 $user_type = I('post.user_type'); // 1.收银员退款 2.店长登录 $refund_code = I('post.refund_code'); // 密码 $username = I('post.username'); // 店长账号 $return_delivery_fee = I('post.return_delivery_fee') == 1 ? 1 : 2; //是否退还配送费 1是 2否 if (empty($order_no) || empty($return_delivery_fee) || empty($refund_code) || empty($user_type) || ($user_type == 2 && empty($username))) { $result['status'] = 0; $result['msg'] = '缺少参数'; $this->ajaxReturn($result); } $data = array( 'store_id' => self::$store_id, 'merchant_id' => self::$merchant_id, 'cashier_id' => self::$cashier_id, 'cashier' => self::$cashier, 'order_no' => $order_no, 'user_type' => $user_type, 'username' => $username, 'refund_code' => $refund_code, 'return_delivery_fee' => $return_delivery_fee, ); // 退款 $res = A('PayApi/Refund')->onlineOrderRefund($data); $this->ajaxReturn($res); } /** * 线上订单退款2020-3-9 * @param order_no订单号 * @param user_type 1.收银员退款 2.店长登录 3后台 * @param refund_code 密码 * @param username 店长账号 * @param return_delivery_fee 是否退还配送费 1是 2否 */ public function onlineOrderRefund_v2() { $order_no = I('post.order_no'); $user_type = I('post.user_type'); $refund_code = I('post.refund_code'); $username = I('post.username'); $return_delivery_fee = I('post.return_delivery_fee') == 1 ? 1 : 2; if (empty($order_no) || empty($return_delivery_fee) || empty($refund_code) || empty($user_type) || ($user_type == 2 && empty($username))) { $result['status'] = 0; $result['msg'] = '缺少参数'; $this->ajaxReturn($result); } $data = array( 'store_id' => self::$store_id, 'merchant_id' => self::$merchant_id, 'cashier_id' => self::$cashier_id, 'cashier' => self::$cashier, 'order_no' => $order_no, 'user_type' => $user_type, 'username' => $username, 'refund_code' => $refund_code, 'return_delivery_fee' => $return_delivery_fee, 'platform_type' => self::$merchant['platform_type'] ); // 退款 if (C('IS_SET_REDIS')) { $ApiRedis = new \Addons\Api\RedisController(); $redis_key = "customer_" . $data['order_no']; if ($ApiRedis::$redis->exists($redis_key)) { $res['status'] = 0; $res['msg'] = "正在操作该订单,请勿重复操作"; $this->ajaxReturn($res); } $ApiRedis::$redis->setex($redis_key, 10, $data['order_no']); } $res = A('PayApi/Refund')->onlineOrderRefund_v2($data); if (C('IS_SET_REDIS')) { $ApiRedis::$redis->delete($redis_key); } $this->ajaxReturn($res); } }