purchaseId ?? 0); if (!empty($purchaseId)) { $hdPurchaseIds[] = $purchaseId; } } $cgMap = []; if (!empty($hdPurchaseIds)) { $cgList = PurchaseClass::getByIds(array_unique($hdPurchaseIds)); if (!empty($cgList)) { $cgMap = array_column($cgList, null, 'id'); } } $pairs = []; foreach ($orderList as $order) { $orderId = is_array($order) ? ($order['id'] ?? 0) : ($order->id ?? 0); $orderSn = is_array($order) ? ($order['orderSn'] ?? '') : ($order->orderSn ?? ''); $amount = self::resolveDebtAmount($order); $cgId = intval(is_array($order) ? ($order['purchaseId'] ?? 0) : ($order->purchaseId ?? 0)); $cgSn = ''; if ($cgId > 0 && isset($cgMap[$cgId])) { $cgSn = $cgMap[$cgId]['orderSn'] ?? ''; } $pairs[] = [ 'orderId' => intval($orderId), 'orderSn' => $orderSn, 'cgId' => $cgId, 'cgSn' => $cgSn, 'amount' => $amount, ]; } return $pairs; } public static function buildPairsFromPurchases($purchaseList) { if (empty($purchaseList)) { return []; } $ghsOrderIds = []; foreach ($purchaseList as $purchase) { $saleId = is_array($purchase) ? ($purchase['saleId'] ?? 0) : ($purchase->saleId ?? 0); if (!empty($saleId)) { $ghsOrderIds[] = $saleId; } } $orderMap = []; if (!empty($ghsOrderIds)) { $orderList = OrderClass::getByIds(array_unique($ghsOrderIds)); if (!empty($orderList)) { $orderMap = array_column($orderList, null, 'id'); } } $pairs = []; foreach ($purchaseList as $purchase) { $cgId = is_array($purchase) ? ($purchase['id'] ?? 0) : ($purchase->id ?? 0); $cgSn = is_array($purchase) ? ($purchase['orderSn'] ?? '') : ($purchase->orderSn ?? ''); $amount = self::resolveDebtAmount($purchase); $orderId = intval(is_array($purchase) ? ($purchase['saleId'] ?? 0) : ($purchase->saleId ?? 0)); $orderSn = ''; if ($orderId > 0 && isset($orderMap[$orderId])) { $orderSn = $orderMap[$orderId]['orderSn'] ?? ''; } $pairs[] = [ 'orderId' => $orderId, 'orderSn' => $orderSn, 'cgId' => intval($cgId), 'cgSn' => $cgSn, 'amount' => $amount, ]; } return $pairs; } /** * gys2KmGys:cgId 存 xhGhsCgOrder.id,orderId=0 */ public static function buildPairsFromGhsCgOrders($cgList) { if (empty($cgList)) { return []; } $pairs = []; foreach ($cgList as $cg) { $cgId = intval(is_array($cg) ? ($cg['id'] ?? 0) : ($cg->id ?? 0)); if ($cgId <= 0) { continue; } $cgSn = is_array($cg) ? ($cg['orderSn'] ?? '') : ($cg->orderSn ?? ''); $pairs[] = [ 'orderId' => 0, 'orderSn' => '', 'cgId' => $cgId, 'cgSn' => $cgSn, 'amount' => self::resolveDebtAmount($cg), ]; } return $pairs; } public static function bindRelations($clear, $pairs, $status = self::STATUS_AWAIT_PAY) { $clearId = is_object($clear) ? ($clear->id ?? 0) : ($clear['id'] ?? 0); $clearSn = is_object($clear) ? ($clear->orderSn ?? '') : ($clear['orderSn'] ?? ''); if (empty($clearId) || empty($pairs)) { return; } foreach ($pairs as $pair) { $orderId = intval($pair['orderId'] ?? 0); $cgId = intval($pair['cgId'] ?? 0); if ($orderId <= 0 && $cgId <= 0) { continue; } $exists = self::getByCondition([ 'clearId' => $clearId, 'orderId' => $orderId, 'cgId' => $cgId, ], true); $newAmount = self::normalizeAmount($pair['amount'] ?? 0); if (!empty($exists)) { self::patchAmountIfEmpty($exists, $newAmount); continue; } self::add([ 'clearId' => $clearId, 'clearSn' => $clearSn, 'orderId' => $orderId, 'orderSn' => $pair['orderSn'] ?? '', 'cgId' => $cgId, 'cgSn' => $pair['cgSn'] ?? '', 'amount' => $newAmount, 'status' => $status, ]); } } public static function markDoneByClearId($clearId) { self::markStatusByClearId($clearId, self::STATUS_HAS_PAY); } public static function markExpireByClearId($clearId) { self::markStatusByClearId($clearId, self::STATUS_EXPIRE); } public static function markStatusByClearId($clearId, $status) { $clearId = intval($clearId); $status = intval($status); if ($clearId <= 0) { return; } $list = self::getAllByCondition(['clearId' => $clearId], null, '*', null, true); if (empty($list)) { return; } foreach ($list as $item) { $item->status = $status; $item->save(); } } /** * 销售单已销账的结账单列表(部分销、多次销均含,对齐 hd orderSettleList) * * @return array */ public static function listPaidClearRecordsForOrder($orderId) { $orderId = intval($orderId); if ($orderId <= 0) { return []; } $list = self::getAllByCondition([ 'orderId' => $orderId, 'status' => self::STATUS_HAS_PAY, ], 'id asc', '*', null, true); return self::mapPaidClearRecordRows($list); } /** * 采购单关联的已销结账单(仅本采购单在结账单中的销账额,勿与 saleId 查询合并以免重复累加) */ public static function listPaidClearRecordsForPurchase($purchaseId, $saleOrderId = 0) { $purchaseId = intval($purchaseId); $saleOrderId = intval($saleOrderId); if ($purchaseId > 0) { $cgList = self::getAllByCondition([ 'cgId' => $purchaseId, 'status' => self::STATUS_HAS_PAY, ], 'id asc', '*', null, true); if (!empty($cgList)) { return self::mapPaidClearRecordRows($cgList); } } // 旧数据可能只有 orderId、未写 cgId if ($saleOrderId > 0) { return self::listPaidClearRecordsForOrder($saleOrderId); } return []; } protected static function mapPaidClearRecordRows($list) { if (empty($list)) { return []; } $rows = []; foreach ($list as $item) { $clearId = intval(is_object($item) ? ($item->clearId ?? 0) : ($item['clearId'] ?? 0)); if ($clearId <= 0) { continue; } $rows[] = [ 'clearId' => $clearId, 'clearSn' => (string)(is_object($item) ? ($item->clearSn ?? '') : ($item['clearSn'] ?? '')), 'amount' => self::normalizeAmount(is_object($item) ? ($item->amount ?? 0) : ($item['amount'] ?? 0)), ]; } return $rows; } public static function getOrderIdsByClearId($clearId) { $clearId = intval($clearId); if ($clearId <= 0) { return []; } $list = self::getAllByCondition(['clearId' => $clearId, 'orderId>' => 0], null, 'orderId', null); return array_values(array_unique(array_filter(array_map('intval', array_column($list, 'orderId'))))); } public static function getCgIdsByClearId($clearId) { $clearId = intval($clearId); if ($clearId <= 0) { return []; } $list = self::getAllByCondition(['clearId' => $clearId, 'cgId>' => 0], null, 'cgId', null); return array_values(array_unique(array_filter(array_map('intval', array_column($list, 'cgId'))))); } public static function getPendingClearIdByOrderId($orderId, $customId) { $orderId = intval($orderId); $customId = intval($customId); if ($orderId <= 0) { return 0; } $list = self::getAllByCondition([ 'orderId' => $orderId, 'status' => self::STATUS_AWAIT_PAY, ], null, 'clearId', null); if (empty($list)) { return 0; } $clearIds = array_unique(array_map('intval', array_column($list, 'clearId'))); $now = date("Y-m-d H:i:s"); foreach ($clearIds as $clearId) { $clear = ClearClass::getById($clearId, true); if (empty($clear)) { continue; } if (($clear->status ?? 0) != PurchaseClearClass::STATUS_AWAIT_PAY) { continue; } if ($customId > 0 && ($clear->customId ?? 0) != $customId) { continue; } $deadline = $clear->deadline ?? ''; if (!empty($deadline) && $deadline < $now) { continue; } return intval($clearId); } return 0; } /** * 待结金额:销售单/采购单用 remainDebtPrice(与 hd 充值销账 FIFO 一致),勿用 actPrice(实付会小于待结) */ protected static function resolveDebtAmount($entity) { $remain = self::readField($entity, 'remainDebtPrice'); if ($remain !== '' && $remain !== null && bccomp(self::normalizeAmount($remain), '0', 2) > 0) { return self::normalizeAmount($remain); } return self::normalizeAmount(self::readField($entity, 'actPrice')); } protected static function readField($entity, $key) { return is_array($entity) ? ($entity[$key] ?? 0) : ($entity->$key ?? 0); } protected static function normalizeAmount($amount) { if ($amount === '' || $amount === null) { return '0.00'; } return bcadd((string)$amount, '0', 2); } protected static function patchAmountIfEmpty($row, $amount) { $amount = self::normalizeAmount($amount); if (bccomp($amount, '0', 2) <= 0) { return false; } $current = self::normalizeAmount(is_object($row) ? ($row->amount ?? 0) : ($row['amount'] ?? 0)); if (bccomp($current, '0', 2) > 0) { return false; } if (is_object($row)) { $row->amount = $amount; return $row->save(false); } return false; } }