actPrice ?? 0; $orderSn = $clear->orderSn ?? ''; $refundFee = bcmul($refundPrice, 100); $merchantPrivateKeyPath = Yii::getAlias("@vendor/lakala") . '/production/api_private_key.pem'; $lklCertificatePath = Yii::getAlias("@vendor/lakala") . '/production/lkl-apigw-v1.cer'; $params = [ 'appid' => 'OP00002119', 'serial_no' => '018b08cfddbd', 'merchant_no' => $shop->lklSjNo, 'term_no' => $shop->lklScanTermNo, 'merchantPrivateKeyPath' => $merchantPrivateKeyPath, 'lklCertificatePath' => $lklCertificatePath, ]; $laResource = new Lakala($params); $refundReason = ''; $thirdNo = $clear->thirdNo ?? ''; $backParams = [ 'refundSn' => $refundOrderSn, 'thirdNo' => $thirdNo, 'refundAmount' => $refundFee, 'refundReason' => $refundReason, ]; $response = $laResource->refund($backParams); if (!isset($response['code']) || $response['code'] != 'BBS00000') { $errMsg = $response['msg'] ?? ''; return ['status' => 0, 'msg' => $errMsg]; } else { $sjName = $shop->merchantName; $shopName = $shop->shopName; $name = $shopName == '首店' ? $sjName : $sjName . '-' . $shopName; noticeUtil::push("取消的结账单,客户的钱已原路退回 success {$orderSn} {$name}", '15280215347'); return ['status' => 1, 'msg' => '退款成功']; } } public static function addOrder($data) { $orderSn = orderSn::getPurchaseClearSn(); $idJson = $data['id']; $idArr = json_decode($idJson, true); $arr = array_column($idArr, 'id'); if (empty($arr)) { util::fail('请选择采购单'); } $purchaseList = PurchaseOrderClass::getAllByCondition(['id' => ['in', $arr]], null, ['id', 'orderSn', 'actPrice', 'realPrice', 'debt', 'ghsId'], null, true); if (empty($purchaseList)) { util::fail('请选择采购单'); } $totalPrice = 0; $currentGhsId = $data['ghsId'] ?? 0; foreach ($purchaseList as $purchase) { if ($purchase->debt != PurchaseOrderClass::DEBT_YES) { util::fail('请选择有欠款的采购单'); } if ($purchase->ghsId != $currentGhsId) { util::fail('请选择同个供货商的订单'); } $totalPrice = bcadd($totalPrice, $purchase->actPrice, 2); } $ghs = GhsClass::getById($currentGhsId, true); if (empty($ghs)) { util::fail('没有找到供货商'); } GhsClass::valid($ghs, $data['shopId']); $ghsName = $ghs->name ?? ''; $ghsAvatar = $ghs->avatar ?? ''; $ghsMobile = $ghs->mobile ?? ''; $customId = $ghs->customId ?? 0; $custom = CustomClass::getById($customId, true); $customName = $custom->name ?? ''; $customAvatar = $custom->avatar ?? ''; $customMobile = $custom->mobile ?? ''; $data['ghsName'] = $ghsName; $data['ghsAvatar'] = $ghsAvatar; $data['ghsMobile'] = $ghsMobile; $data['customName'] = $customName; $data['customAvatar'] = $customAvatar; $data['customMobile'] = $customMobile; $data['prePrice'] = $totalPrice; $realPrice = $totalPrice; if (isset($data['modifyPrice']) && !empty($data['modifyPrice'])) { if (is_numeric($data['modifyPrice']) == false) { util::fail('实收金额错误'); } $modifyPrice = $data['modifyPrice'] ?? 0.00; if ($modifyPrice > $totalPrice) { util::fail('实收金额不能大于订单金额'); } if ($modifyPrice < $totalPrice) { $data['discountAmount'] = bcsub($totalPrice, $modifyPrice, 2); $data['discountType'] = dict::getDict('discountType', 'discount'); } $realPrice = $modifyPrice; } $data['actPrice'] = $realPrice; $data['realPrice'] = $realPrice; $data['orderSn'] = $orderSn; // 生成并保存 salt 字段,用于结账单的验签和防篡改分享链接 $data['salt'] = $data['salt'] ?? \common\components\stringUtil::charsShuffleLowerCase(10); $deadTime = time() + 120; $data['deadline'] = date("Y-m-d H:i:s", $deadTime); $data['status'] = self::STATUS_AWAIT_PAY; $order = self::add($data, true); $pairs = OrderCgClearClass::buildPairsFromGhsCgOrders($purchaseList); OrderCgClearClass::bindRelations($order, $pairs); $payWay = $data['payWay'] ?? dict::getDict('payWay', 'wxPay'); self::complete($order, $payWay); OrderCgClearClass::markDoneByClearId($order->id); return $order; } //支付成功后的流程 ssh 2021.4.28 public static function complete($order, $payWay) { if (empty($order)) { util::fail('没有找到订单'); } if (isset($order->status) == false || $order->status != self::STATUS_AWAIT_PAY) { util::fail('订单不是待付款状态'); } $order->status = self::STATUS_HAS_PAY; $order->save(); $clearId = $order->id; $arr = OrderCgClearClass::getCgIdsByClearId($clearId); if (empty($arr)) { $msg = "没有找到采购订单"; util::fail($msg); } $list = PurchaseOrderClass::getAllByCondition(['id' => ['in', $arr]], null, '*', null, true); if (empty($list)) { $msg = "没有找到采购订单!"; util::fail($msg); } //供货商欠款变更 $ghsId = $order->ghsId; $ghs = GhsClass::getLockById($ghsId); if (empty($ghs)) { util::fail('没有找到供货商信息'); } $ghsAddDebtKey = 'ghs_change_debt_' . $ghsId; $lock = util::lock($ghsAddDebtKey); if (!$lock) { util::fail("系统繁忙,请重试"); } PurchaseOrderClass::applyPurchaseClearOnBuyerGhs($ghs, $order->prePrice, $order, count($arr)); util::unlock($ghsAddDebtKey); $shopId = $ghs->shopId; $shop = ShopClass::getLockById($shopId); if (empty($shop)) { util::fail('没有找到供货商门店'); } $mainId = $shop->mainId ?? 0; $main = MainClass::getLockById($mainId); if (empty($main)) { util::fail('没有main信息19'); } //门店应收客户款减少 $currentGathering = bcsub($main->mayGathering, $order->actPrice, 2); $main->mayGathering = $currentGathering; $main->save(); //采购单状态变更 foreach ($list as $purchase) { $purchase->debt = PurchaseOrderClass::DEBT_NO; $purchase->payWay = $payWay; $purchase->clearId = $clearId; $purchase->save(); } $custom = PurchaseOrderClass::applyPurchaseClearOnSupplierCustom($ghs, $order->actPrice, count($arr), $main); //应付供货商款减少 $customShopId = $custom->shopId; $customShop = ShopClass::getLockById($customShopId); if (empty($customShop)) { util::fail('没有找到客户门店'); } $customMainId = $customShop->mainId ?? 0; $customMain = MainClass::getLockById($customMainId); if (empty($customMain)) { util::fail('没有main信息20'); } $currentMayPay = bcsub($customMain->mayPay, $order->actPrice, 2); $customMain->mayPay = $currentMayPay; if ($ghs->debtNum == 0) { $customMain->mayPayNum -= 1; } $customMain->save(); //扣除现金 if ($payWay == dict::getDict('payWay', 'cash')) { $balance = bcsub($customMain->money, $order->actPrice, 2); if ($balance < 0) { util::fail('现金不足'); } $customMain->money = $balance; $customMain->save(); $staffId = $order->customShopAdminId ?? 0; $staffName = $order->customShopAdminName ?? ''; $event = $staffName . '买花结账支出' . $order->actPrice . '元,单号:' . $order->orderSn; $capitalType = dict::getDict('capitalType', 'ghsClearExpend', 'id'); $data = []; $data['balance'] = $balance; $data['mainId'] = $customMainId; $data['sjId'] = 0; $data['amount'] = $order->actPrice ?? 0; $data['staffId'] = $staffId; $data['staffName'] = $staffName; $data['ptStyle'] = dict::getDict('ptStyle', 'ghs'); $data['capitalType'] = $capitalType; $data['event'] = $event; $data['remark'] = ''; ShopMoneyClass::addData($data); } } //供货商的采购信息 ssh 20210625 public static function getGhsCgInfo($info) { $clearId = intval($info['id'] ?? 0); $cgArr = OrderCgClearClass::getCgIdsByClearId($clearId); $cgList = empty($cgArr) ? [] : PurchaseOrderClass::getAllByCondition(['id' => ['in', $cgArr]], null, 'id,orderSn,bigNum,smallNum,realPrice,addTime', null); $info['orderList'] = $cgList; $info['orderNum'] = count($cgArr); $clearStyle = $info['clearStyle'] ?? dict::getDict('clearStyle', 'gys2KmGys'); $operator = $info['customShopAdminName'] ?? ''; if ($clearStyle == dict::getDict('clearStyle', 'kmGys2gys')) { $operator = '商家'; } $info['operator'] = $operator; return $info; } //零售的采购信息 ssh 20210625 public static function getCgInfo($info) { $id = $info['id'] ?? 0; $deadline = $info['deadline'] ?? ''; $deadTime = strtotime($deadline); $current = time(); // 仅待结清且已过期时才取消,避免已结清账单被误改状态 if ($current >= $deadTime && ($info['status'] ?? 0) == PurchaseClearClass::STATUS_AWAIT_PAY) { $n = date("Y-m-d H:i:s"); $info['status'] = PurchaseClearClass::STATUS_EXPIRE; self::updateById($id, [ 'status' => PurchaseClearClass::STATUS_EXPIRE, 'remark' => "账单过期,已自动取消,参数:{$deadline} {$n}", ]); } $clearId = intval($info['id'] ?? 0); $cgArr = OrderCgClearClass::getCgIdsByClearId($clearId); $cgList = empty($cgArr) ? [] : PurchaseClass::getAllByCondition(['id' => ['in', $cgArr]], null, '*', null); $info['orderList'] = self::buildPartialClearLinksForPurchaseOrders($cgList); $info['orderNum'] = count($cgArr); $clearStyle = $info['clearStyle'] ?? dict::getDict('clearStyle', 'hd2Gys'); $operator = $info['customShopAdminName'] ?? ''; if ($clearStyle == dict::getDict('clearStyle', 'gys2Hd')) { $operator = '商家'; } $info['operator'] = $operator; return $info; } //完整信息 ssh 20210625 public static function getSaleInfo($info) { $clearId = intval($info['id'] ?? 0); $saleArr = OrderCgClearClass::getOrderIdsByClearId($clearId); $saleList = empty($saleArr) ? [] : OrderClass::getAllByCondition(['id' => ['in', $saleArr]], null, '*', null); $info['orderList'] = self::buildPartialClearLinksForSaleOrders($saleList); $info['orderNum'] = count($saleArr); $type = $info['clearStyle'] ?? dict::getDict('clearStyle', 'gys2KmGys'); $operator = $info['ghsShopAdminName'] ?? ''; if ($type == dict::getDict('clearStyle', 'hd2Gys')) { $operator = '客户'; } $info['operator'] = $operator; return $info; } /** * 结账单详情(供货商销售单):附加 orderClearList,与订单详情 OrderService 一致。 */ protected static function buildPartialClearLinksForSaleOrders($saleList) { if (empty($saleList)) { return []; } $out = []; foreach ($saleList as $order) { $row = self::normalizeOrderRow($order); $orderId = intval($row['id'] ?? 0); $row['remainDebtPrice'] = bcadd((string)($row['remainDebtPrice'] ?? '0'), '0', 2); $row['orderClearList'] = $orderId > 0 ? OrderCgClearClass::listPaidClearRecordsForOrder($orderId) : []; $out[] = $row; } return $out; } /** * 结账单详情(花店采购单):附加 orderClearList;待结以批发销售单为准(采购单可能滞后)。 */ protected static function buildPartialClearLinksForPurchaseOrders($cgList) { if (empty($cgList)) { return []; } $out = []; foreach ($cgList as $purchase) { $row = self::normalizeOrderRow($purchase); $cgId = intval($row['id'] ?? 0); $saleId = intval($row['saleId'] ?? 0); $row['remainDebtPrice'] = self::resolvePurchaseRemainDebtPrice($row); $row['orderClearList'] = OrderCgClearClass::listPaidClearRecordsForPurchase($cgId, $saleId); $out[] = $row; } return $out; } /** 采购单待结:优先对齐 xhOrder.remainDebtPrice */ protected static function resolvePurchaseRemainDebtPrice(array $row) { $remain = bcadd((string)($row['remainDebtPrice'] ?? '0'), '0', 2); $saleId = intval($row['saleId'] ?? 0); if ($saleId <= 0) { return $remain; } $sale = OrderClass::getById($saleId, true); if (empty($sale)) { return $remain; } return bcadd((string)($sale->remainDebtPrice ?? '0'), '0', 2); } /** 统一订单行为数组,便于前端附加 orderClearList */ protected static function normalizeOrderRow($row) { if (is_array($row)) { return $row; } if (is_object($row) && method_exists($row, 'getAttributes')) { return $row->getAttributes(); } return (array)$row; } }