|
|
@@ -585,7 +585,12 @@ class StatSaleClass extends BaseClass
|
|
|
$name = $orderItem->name ?? '';
|
|
|
$productId = $orderItem->productId ?? 0;
|
|
|
$num = $orderItem->xhNum ?? 0;
|
|
|
- $remainNum = bcsub($num, $refundNum);
|
|
|
+ // 支付日净销量:当天已退=refundNum-nextRefundNum
|
|
|
+ $remainNum = NextDayRefundService::payDayRemainNum(
|
|
|
+ $num,
|
|
|
+ $refundNum,
|
|
|
+ $orderItem->nextRefundNum ?? 0
|
|
|
+ );
|
|
|
|
|
|
$xhUnitPrice = $orderItem->xhUnitPrice ?? 0;
|
|
|
$amount = bcmul($remainNum, $xhUnitPrice, 2);
|
|
|
@@ -628,6 +633,10 @@ class StatSaleClass extends BaseClass
|
|
|
if ($refund->refundType == 1) {
|
|
|
//退货退款前面已经考虑,这里不再处理 OK
|
|
|
} else {
|
|
|
+ // 隔天仅退款记在通过日,这里跳过避免与下方 sumMoneyOnly 重复
|
|
|
+ if (intval($refund->sameDay ?? RefundOrderClass::SAME_DAY_YES) === RefundOrderClass::SAME_DAY_NO) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
$onlyRefund = bcadd($onlyRefund, $refund->refundPrice, 2);
|
|
|
}
|
|
|
}
|
|
|
@@ -638,6 +647,20 @@ class StatSaleClass extends BaseClass
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // 隔天售后:支付日已用 nextRefundNum;通过日再扣数量/金额;仅退款并入销售仅退款
|
|
|
+ $onlyRefund = bcadd(
|
|
|
+ (string)$onlyRefund,
|
|
|
+ self::applyNextDayAdjustToProductIncomeRows(
|
|
|
+ $arr,
|
|
|
+ $tbSaleIncome,
|
|
|
+ $productList,
|
|
|
+ $mainId,
|
|
|
+ $currentStartTime,
|
|
|
+ $currentEndTime
|
|
|
+ ),
|
|
|
+ 2
|
|
|
+ );
|
|
|
+
|
|
|
//零售开单
|
|
|
$lsIncome = 0;
|
|
|
$hdWhere = ['mainId' => $mainId, 'status' => ['in', [HdOrderClass::ORDER_STATUS_UN_SEND, HdOrderClass::ORDER_STATUS_SENDING, HdOrderClass::ORDER_STATUS_COMPLETE]]];
|
|
|
@@ -911,7 +934,11 @@ class StatSaleClass extends BaseClass
|
|
|
$name = $orderItem->name ?? '';
|
|
|
$productId = $orderItem->productId ?? 0;
|
|
|
$num = $orderItem->xhNum ?? 0;
|
|
|
- $remainNum = bcsub($num, $refundNum);
|
|
|
+ $remainNum = NextDayRefundService::payDayRemainNum(
|
|
|
+ $num,
|
|
|
+ $refundNum,
|
|
|
+ $orderItem->nextRefundNum ?? 0
|
|
|
+ );
|
|
|
$classId = $orderItem->classId ?? 0;
|
|
|
$className = $classList[$classId]['name'] ?? '已删除';
|
|
|
$xhUnitPrice = $orderItem->xhUnitPrice ?? 0;
|
|
|
@@ -952,6 +979,10 @@ class StatSaleClass extends BaseClass
|
|
|
if ($refund->refundType == 1) {
|
|
|
//退货退款前面已经考虑,这里不再处理 OK
|
|
|
} else {
|
|
|
+ // 隔天仅退款记在通过日,这里跳过避免与下方 sumMoneyOnly 重复
|
|
|
+ if (intval($refund->sameDay ?? RefundOrderClass::SAME_DAY_YES) === RefundOrderClass::SAME_DAY_NO) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
$onlyRefund = bcadd($onlyRefund, $refund->refundPrice, 2);
|
|
|
}
|
|
|
}
|
|
|
@@ -962,26 +993,7 @@ class StatSaleClass extends BaseClass
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- // 隔天售后:与花材销量同口径——加回原单 refundNum 中的隔天退货,再按通过日扣分类收入;仅退款进「销售仅退款」
|
|
|
- $classRelateSns = [];
|
|
|
- if (!empty($ghsOrderList)) {
|
|
|
- foreach ($ghsOrderList as $ghsOrder) {
|
|
|
- $book = $ghsOrder['book'] ?? 0;
|
|
|
- $status = $ghsOrder['status'] ?? 0;
|
|
|
- if ($book == 1 && $status == 2) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- if ($status == 0 || $status == 5) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- if (($ghsOrder['actPrice'] ?? 0) <= 0) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- if (!empty($ghsOrder['orderSn'])) {
|
|
|
- $classRelateSns[] = $ghsOrder['orderSn'];
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ // 隔天售后:支付日已用 nextRefundNum;通过日再按售后单扣分类收入;仅退款进「销售仅退款」
|
|
|
$productClassMap = ProductClass::getAllByCondition(['mainId' => $mainId], null, 'id,classId', 'id');
|
|
|
$applyClassDelta = function ($pidMap, $sign) use (&$arr, &$classList, $productClassMap) {
|
|
|
foreach ($pidMap as $pid => $row) {
|
|
|
@@ -1005,10 +1017,6 @@ class StatSaleClass extends BaseClass
|
|
|
$arr[$classId]['saleNum'] = bcadd((string)($arr[$classId]['saleNum'] ?? 0), $deltaNum, 2);
|
|
|
}
|
|
|
};
|
|
|
- $applyClassDelta(
|
|
|
- NextDayRefundService::sumItemByProductForRelateOrderSns($mainId, $classRelateSns),
|
|
|
- 1
|
|
|
- );
|
|
|
$applyClassDelta(
|
|
|
NextDayRefundService::sumItemByProduct($mainId, $currentStartTime, $currentEndTime),
|
|
|
-1
|
|
|
@@ -1454,14 +1462,23 @@ class StatSaleClass extends BaseClass
|
|
|
$orderItemList = OrderItemClass::getAllByCondition(['orderSn' => $orderSn], null, '*', null, true);
|
|
|
if (!empty($orderItemList)) {
|
|
|
foreach ($orderItemList as $orderItem) {
|
|
|
- $refundNum = $orderItem->refundNum ?? 0;
|
|
|
- $num = $orderItem->xhNum ?? 0;
|
|
|
- $remainNum = bcsub($num, $refundNum);
|
|
|
+ $remainNum = NextDayRefundService::payDayRemainNum(
|
|
|
+ $orderItem->xhNum ?? 0,
|
|
|
+ $orderItem->refundNum ?? 0,
|
|
|
+ $orderItem->nextRefundNum ?? 0
|
|
|
+ );
|
|
|
$arr[$sendStaffId]['itemNum'] = bcadd($arr[$sendStaffId]['itemNum'], $remainNum);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // 隔天售后:数量已用 nextRefundNum;通过日再扣数量/金额
|
|
|
+ self::applyNextDayAdjustToSendStaffRows(
|
|
|
+ $arr,
|
|
|
+ $mainId,
|
|
|
+ $currentStartTime,
|
|
|
+ $currentEndTime
|
|
|
+ );
|
|
|
}
|
|
|
if (!empty($arr)) {
|
|
|
$arr = array_values($arr);
|
|
|
@@ -1571,4 +1588,100 @@ class StatSaleClass extends BaseClass
|
|
|
return ['list' => $arr, 'totalAmount' => $totalAmount, 'totalNum' => $totalNum, 'totalCost' => $totalCost, 'totalProfit' => $totalProfit];
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 花材收支明细:支付日已用 nextRefundNum;此处按通过日扣退货数量/金额,并返回隔天仅退款合计。
|
|
|
+ *
|
|
|
+ * @param array $arr 产品收支行(引用修改 income/inNum)
|
|
|
+ * @param array $tbSaleIncome 归属成本花材销售明细(引用同步加减)
|
|
|
+ * @param array $productList 花材字典
|
|
|
+ * @param int $mainId
|
|
|
+ * @param string $startTime
|
|
|
+ * @param string $endTime
|
|
|
+ * @return string 通过日隔天「仅退款」合计,需加到 onlyRefund
|
|
|
+ */
|
|
|
+ private static function applyNextDayAdjustToProductIncomeRows(
|
|
|
+ &$arr,
|
|
|
+ &$tbSaleIncome,
|
|
|
+ $productList,
|
|
|
+ $mainId,
|
|
|
+ $startTime,
|
|
|
+ $endTime
|
|
|
+ ) {
|
|
|
+ $applyDelta = function ($pidMap, $sign) use (&$arr, &$tbSaleIncome, $productList) {
|
|
|
+ foreach ($pidMap as $pid => $row) {
|
|
|
+ $deltaNum = bcmul((string)($row['num'] ?? '0'), (string)$sign, 2);
|
|
|
+ $deltaAmt = bcmul((string)($row['amount'] ?? '0'), (string)$sign, 2);
|
|
|
+ if (bccomp($deltaAmt, '0', 2) == 0 && bccomp($deltaNum, '0', 2) == 0) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ // 通过日扣减时:当日无该花材开单则不新建行(与花材销量一致)
|
|
|
+ if ($sign < 0 && !isset($arr[$pid])) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ if (!isset($arr[$pid])) {
|
|
|
+ $arr[$pid] = [
|
|
|
+ 'name' => $productList[$pid]['name'] ?? '已删除',
|
|
|
+ 'id' => $pid,
|
|
|
+ 'expend' => 0,
|
|
|
+ 'outNum' => 0,
|
|
|
+ 'inNum' => '0.00',
|
|
|
+ 'income' => '0.00',
|
|
|
+ ];
|
|
|
+ }
|
|
|
+ $arr[$pid]['income'] = bcadd((string)($arr[$pid]['income'] ?? 0), $deltaAmt, 2);
|
|
|
+ $arr[$pid]['inNum'] = bcadd((string)($arr[$pid]['inNum'] ?? 0), $deltaNum, 2);
|
|
|
+ if (isset($tbSaleIncome[$pid])) {
|
|
|
+ $tbSaleIncome[$pid]['price'] = bcadd((string)($tbSaleIncome[$pid]['price'] ?? 0), $deltaAmt, 2);
|
|
|
+ $tbSaleIncome[$pid]['num'] = bcadd((string)($tbSaleIncome[$pid]['num'] ?? 0), $deltaNum, 2);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ // 通过日:扣退货数量+金额
|
|
|
+ $applyDelta(
|
|
|
+ NextDayRefundService::sumItemByProduct($mainId, $startTime, $endTime),
|
|
|
+ -1
|
|
|
+ );
|
|
|
+
|
|
|
+ return NextDayRefundService::sumMoneyOnlyAmountByMainAndTime($mainId, $startTime, $endTime);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 配送业绩:支付日数量已用 nextRefundNum;通过日再扣数量/金额(仅退款只减金额)。
|
|
|
+ * 仅调整当日已有配送员行,不因纯售后新建行。
|
|
|
+ *
|
|
|
+ * @param array $arr sendStaffId => 业绩行(引用修改 itemNum/amount)
|
|
|
+ * @param int $mainId
|
|
|
+ * @param string $startTime
|
|
|
+ * @param string $endTime
|
|
|
+ */
|
|
|
+ private static function applyNextDayAdjustToSendStaffRows(
|
|
|
+ &$arr,
|
|
|
+ $mainId,
|
|
|
+ $startTime,
|
|
|
+ $endTime
|
|
|
+ ) {
|
|
|
+ $applyDelta = function ($staffMap, $sign) use (&$arr) {
|
|
|
+ foreach ($staffMap as $sid => $row) {
|
|
|
+ if (!isset($arr[$sid])) {
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ $deltaNum = bcmul((string)($row['num'] ?? '0'), (string)$sign, 2);
|
|
|
+ $deltaAmt = bcmul((string)($row['amount'] ?? '0'), (string)$sign, 2);
|
|
|
+ $arr[$sid]['itemNum'] = bcadd((string)($arr[$sid]['itemNum'] ?? 0), $deltaNum, 2);
|
|
|
+ $arr[$sid]['amount'] = bcadd((string)($arr[$sid]['amount'] ?? 0), $deltaAmt, 2);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ $applyDelta(
|
|
|
+ NextDayRefundService::sumItemBySendStaff($mainId, $startTime, $endTime),
|
|
|
+ -1
|
|
|
+ );
|
|
|
+ // 仅退款只减金额
|
|
|
+ $applyDelta(
|
|
|
+ NextDayRefundService::sumMoneyOnlyAmountBySendStaff($mainId, $startTime, $endTime),
|
|
|
+ -1
|
|
|
+ );
|
|
|
+ }
|
|
|
+
|
|
|
}
|