|
|
@@ -140,8 +140,16 @@ class StatSaleClass extends BaseClass
|
|
|
$currentStartTime = $currentStartDate . ' 00:00:00';
|
|
|
$currentEndTime = $currentEndDate . ' 23:59:59';
|
|
|
|
|
|
+ // timeType=bill(默认记账 payTime)/ send(发货 sendTime)
|
|
|
+ $timeType = isset($get['timeType']) ? strval($get['timeType']) : 'bill';
|
|
|
+ $saleTimeField = ($timeType === 'send') ? 'sendTime' : 'payTime';
|
|
|
+
|
|
|
$where = ['mainId' => $mainId, 'status' => ['in', [OrderClass::ORDER_STATUS_UN_SEND, OrderClass::ORDER_STATUS_SENDING, OrderClass::ORDER_STATUS_COMPLETE]]];
|
|
|
- $where['payTime'] = ['between', [$currentStartTime, $currentEndTime]];
|
|
|
+ $where[$saleTimeField] = ['between', [$currentStartTime, $currentEndTime]];
|
|
|
+ // sendTime 不代表成交,发货口径只统计已确认付款
|
|
|
+ if ($timeType === 'send') {
|
|
|
+ $where['payStatus'] = 1;
|
|
|
+ }
|
|
|
|
|
|
$customList = CustomClass::getAllByCondition(['ownMainId' => $mainId], null, 'id,name,py', 'id');
|
|
|
|
|
|
@@ -254,6 +262,11 @@ class StatSaleClass extends BaseClass
|
|
|
/**
|
|
|
* 经营利润总表:收入 − 支出。
|
|
|
* 采购跨天售后:不改「花材采购」入库口径;通过日单独「采购隔天退货」(退货并退款+仅退款合计)计入收入。
|
|
|
+ * timeType=bill(默认):销售按 payTime、采购按 entryTime、支出按 payTime;
|
|
|
+ * timeType=send:销售/采购/支出均按 sendTime。
|
|
|
+ * 发货口径须补成功态:xhGhsOrder/xhOrder 加 payStatus=1,xhGhsCgOrder 加 status=4,xhExpend 加 delStatus=0
|
|
|
+ * (sendTime 开单即可写入,不代表成交;payTime/entryTime 本身即成功时间)。
|
|
|
+ * 仅切换 xhGhsOrder / xhOrder / xhGhsCgOrder / xhExpend,其它统计项时间字段不变。
|
|
|
*/
|
|
|
public static function profile($mainId)
|
|
|
{
|
|
|
@@ -277,12 +290,22 @@ class StatSaleClass extends BaseClass
|
|
|
$currentStartTime = $currentStartDate . ' 00:00:00';
|
|
|
$currentEndTime = $currentEndDate . ' 23:59:59';
|
|
|
|
|
|
+ // 记账时间(bill,默认) / 发货时间(send):作用于批发销售、零售销售、供货商采购、支出登记
|
|
|
+ $timeType = isset($get['timeType']) ? strval($get['timeType']) : 'bill';
|
|
|
+ $useSendTime = ($timeType === 'send');
|
|
|
+ // xhGhsOrder / xhOrder
|
|
|
+ $saleTimeField = $useSendTime ? 'sendTime' : 'payTime';
|
|
|
+ // xhGhsCgOrder:账单口径用入库时间 entryTime
|
|
|
+ $cgTimeField = $useSendTime ? 'sendTime' : 'entryTime';
|
|
|
+ // xhExpend:账单口径 payTime,发货口径 sendTime
|
|
|
+ $expendTimeField = $useSendTime ? 'sendTime' : 'payTime';
|
|
|
+
|
|
|
//出库
|
|
|
$stockOut = StatStockOutClass::getSum($where);
|
|
|
|
|
|
- //采购入库
|
|
|
+ //采购入库(xhGhsCgOrder):status=4 已入库;发货口径也必须带,因为 sendTime 不代表已入库
|
|
|
$cgWhere = ['mainId' => $mainId, 'status' => 4];
|
|
|
- $cgWhere['entryTime'] = ['between', [$currentStartTime, $currentEndTime]];
|
|
|
+ $cgWhere[$cgTimeField] = ['between', [$currentStartTime, $currentEndTime]];
|
|
|
$cgList = PurchaseOrderClass::getAllByCondition($cgWhere, null, '*');
|
|
|
$cg = 0;
|
|
|
if (!empty($cgList)) {
|
|
|
@@ -343,12 +366,16 @@ class StatSaleClass extends BaseClass
|
|
|
|
|
|
$totalOrderNum = 0;
|
|
|
|
|
|
- //批发开单
|
|
|
+ //批发开单(xhGhsOrder)
|
|
|
$pfIncome = 0;
|
|
|
$pfSendCost = 0;
|
|
|
$pfPack = 0;
|
|
|
$where = ['mainId' => $mainId, 'status' => ['in', [OrderClass::ORDER_STATUS_UN_SEND, OrderClass::ORDER_STATUS_SENDING, OrderClass::ORDER_STATUS_COMPLETE]]];
|
|
|
- $where['payTime'] = ['between', [$currentStartTime, $currentEndTime]];
|
|
|
+ $where[$saleTimeField] = ['between', [$currentStartTime, $currentEndTime]];
|
|
|
+ // sendTime 不代表成交,发货口径只统计已确认付款
|
|
|
+ if ($useSendTime) {
|
|
|
+ $where['payStatus'] = 1;
|
|
|
+ }
|
|
|
|
|
|
$ghsOrderList = OrderClass::getAllByCondition($where, null, '*');
|
|
|
if (!empty($ghsOrderList)) {
|
|
|
@@ -380,7 +407,7 @@ class StatSaleClass extends BaseClass
|
|
|
$currentEndTime
|
|
|
);
|
|
|
|
|
|
- //零售开单
|
|
|
+ //零售开单(xhOrder)
|
|
|
$payCodeIncome = 0;
|
|
|
$lsAfterSale = 0;
|
|
|
$lsGiveBalance = 0;
|
|
|
@@ -388,7 +415,11 @@ class StatSaleClass extends BaseClass
|
|
|
$lsSendCost = 0;
|
|
|
$lsServiceFee = 0;
|
|
|
$hdWhere = ['mainId' => $mainId, 'status' => ['in', [HdOrderClass::ORDER_STATUS_UN_SEND, HdOrderClass::ORDER_STATUS_SENDING, HdOrderClass::ORDER_STATUS_COMPLETE]]];
|
|
|
- $hdWhere['payTime'] = ['between', [$currentStartTime, $currentEndTime]];
|
|
|
+ $hdWhere[$saleTimeField] = ['between', [$currentStartTime, $currentEndTime]];
|
|
|
+ // sendTime 不代表成交,发货口径只统计已确认付款(xhOrder.payStatus=1)
|
|
|
+ if ($useSendTime) {
|
|
|
+ $hdWhere['payStatus'] = 1;
|
|
|
+ }
|
|
|
$hdOrderList = HdOrderClass::getAllByCondition($hdWhere, null, '*');
|
|
|
foreach ($hdOrderList as $hdKey => $hdOrder) {
|
|
|
$actPrice = $hdOrder['mainPay'] ?? 0;
|
|
|
@@ -437,9 +468,10 @@ class StatSaleClass extends BaseClass
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // 支出:delStatus=0 未删除;发货口径也必须带,因为 sendTime 不代表单据有效
|
|
|
$condition = [
|
|
|
'mainId' => $mainId,
|
|
|
- 'payTime' => ['between', [$currentStartTime, $currentEndTime]],
|
|
|
+ $expendTimeField => ['between', [$currentStartTime, $currentEndTime]],
|
|
|
'delStatus' => 0,
|
|
|
];
|
|
|
$expendList = ExpendClass::getAllByCondition($condition, null, '*', null, true);
|
|
|
@@ -869,6 +901,13 @@ class StatSaleClass extends BaseClass
|
|
|
util::fail('查询时间不能超过三个月,编号780');
|
|
|
}
|
|
|
|
|
|
+ // timeType=bill:销售 payTime、采购 entryTime;send:均按 sendTime
|
|
|
+ // 发货口径销售须补 payStatus=1、采购须 status=4(sendTime 不代表成交/入库)
|
|
|
+ $timeType = isset($get['timeType']) ? strval($get['timeType']) : 'bill';
|
|
|
+ $useSendTime = ($timeType === 'send');
|
|
|
+ $saleTimeField = $useSendTime ? 'sendTime' : 'payTime';
|
|
|
+ $cgTimeField = $useSendTime ? 'sendTime' : 'entryTime';
|
|
|
+
|
|
|
$classList = ItemClassClass::getAllByCondition(['mainId' => $mainId], null, 'id,name', 'id');
|
|
|
if (empty($classList)) {
|
|
|
util::fail('没有找到花材');
|
|
|
@@ -882,11 +921,11 @@ class StatSaleClass extends BaseClass
|
|
|
$totalDiscountAmount = 0;
|
|
|
$totalLabourCost = 0;
|
|
|
|
|
|
- //采购入库
|
|
|
+ //采购入库:status=4 已入库;发货口径也必须带,sendTime 不代表已入库
|
|
|
$tbCgIncome = [];
|
|
|
$tbCgIncomeStaff = [];
|
|
|
$cgWhere = ['mainId' => $mainId, 'status' => 4];
|
|
|
- $cgWhere['entryTime'] = ['between', [$currentStartTime, $currentEndTime]];
|
|
|
+ $cgWhere[$cgTimeField] = ['between', [$currentStartTime, $currentEndTime]];
|
|
|
$cgList = PurchaseOrderClass::getAllByCondition($cgWhere, null, '*');
|
|
|
if (!empty($cgList)) {
|
|
|
foreach ($cgList as $cgKey => $cgItem) {
|
|
|
@@ -1027,7 +1066,11 @@ class StatSaleClass extends BaseClass
|
|
|
$tbSaleIncome = [];
|
|
|
$tbSaleIncomeStaff = [];
|
|
|
$where = ['mainId' => $mainId, 'status' => ['in', [OrderClass::ORDER_STATUS_UN_SEND, OrderClass::ORDER_STATUS_SENDING, OrderClass::ORDER_STATUS_COMPLETE]]];
|
|
|
- $where['payTime'] = ['between', [$currentStartTime, $currentEndTime]];
|
|
|
+ $where[$saleTimeField] = ['between', [$currentStartTime, $currentEndTime]];
|
|
|
+ // sendTime 不代表成交,发货口径只统计已确认付款
|
|
|
+ if ($useSendTime) {
|
|
|
+ $where['payStatus'] = 1;
|
|
|
+ }
|
|
|
$ghsOrderList = OrderClass::getAllByCondition($where, null, '*');
|
|
|
if (!empty($ghsOrderList)) {
|
|
|
foreach ($ghsOrderList as $ghsKey => $ghsOrder) {
|
|
|
@@ -1156,7 +1199,11 @@ class StatSaleClass extends BaseClass
|
|
|
//零售开单
|
|
|
$lsIncome = 0;
|
|
|
$hdWhere = ['mainId' => $mainId, 'status' => ['in', [HdOrderClass::ORDER_STATUS_UN_SEND, HdOrderClass::ORDER_STATUS_SENDING, HdOrderClass::ORDER_STATUS_COMPLETE]]];
|
|
|
- $hdWhere['payTime'] = ['between', [$currentStartTime, $currentEndTime]];
|
|
|
+ $hdWhere[$saleTimeField] = ['between', [$currentStartTime, $currentEndTime]];
|
|
|
+ // sendTime 不代表成交,发货口径只统计已确认付款(xhOrder.payStatus=1)
|
|
|
+ if ($useSendTime) {
|
|
|
+ $hdWhere['payStatus'] = 1;
|
|
|
+ }
|
|
|
$hdOrderList = HdOrderClass::getAllByCondition($hdWhere, null, '*');
|
|
|
foreach ($hdOrderList as $hdKey => $hdOrder) {
|
|
|
$actPrice = $hdOrder['mainPay'] ?? 0;
|
|
|
@@ -1339,7 +1386,9 @@ class StatSaleClass extends BaseClass
|
|
|
$objPHPExcel->getActiveSheet()->getStyle('E' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
|
|
|
$objPHPExcel->getActiveSheet()->getStyle('F' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
|
|
|
}
|
|
|
- $fileName = '收支花材-' . date("m-d");
|
|
|
+ // 文件名带上记账/发货口径,和页面「导出记账时间」对齐
|
|
|
+ $timeTypeName = Yii::$app->request->get('timeType') === 'send' ? '发货时间' : '记账时间';
|
|
|
+ $fileName = '收支花材-' . $timeTypeName . '-' . date("m-d");
|
|
|
$objPHPExcel->getActiveSheet()->setTitle($fileName);
|
|
|
$objPHPExcel->setActiveSheetIndex(0);
|
|
|
$dir = './priceTable/' . $mainId;
|
|
|
@@ -1430,7 +1479,9 @@ class StatSaleClass extends BaseClass
|
|
|
$objPHPExcel->getActiveSheet()->getStyle('E' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
|
|
|
$objPHPExcel->getActiveSheet()->getStyle('F' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_CENTER);
|
|
|
}
|
|
|
- $fileName = '收支分类-' . time();
|
|
|
+ // 文件名带上记账/发货口径,和页面「导出记账时间」对齐
|
|
|
+ $timeTypeName = Yii::$app->request->get('timeType') === 'send' ? '发货时间' : '记账时间';
|
|
|
+ $fileName = '收支分类-' . $timeTypeName . '-' . time();
|
|
|
$objPHPExcel->getActiveSheet()->setTitle($fileName);
|
|
|
$objPHPExcel->setActiveSheetIndex(0);
|
|
|
$dir = './priceTable/' . $mainId;
|
|
|
@@ -1513,7 +1564,10 @@ class StatSaleClass extends BaseClass
|
|
|
$objPHPExcel->getActiveSheet()->getStyle('D' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
|
|
|
$objPHPExcel->getActiveSheet()->getStyle('E' . $i)->getAlignment()->setHorizontal(\PHPExcel_Style_Alignment::HORIZONTAL_LEFT);
|
|
|
}
|
|
|
- $fileName = '花材销量-' . date("m-d");
|
|
|
+ // 文件名带上记账/发货 + 是否含售后历史,避免下载后分不清口径
|
|
|
+ $timeTypeName = Yii::$app->request->get('timeType') === 'send' ? '发货时间' : '记账时间';
|
|
|
+ $afterSaleName = ((int)Yii::$app->request->get('includeNextDay', 1) === 1) ? '含售后历史' : '不含售后历史';
|
|
|
+ $fileName = '花材销量-' . $timeTypeName . '-' . $afterSaleName . '-' . date("m-d");
|
|
|
$objPHPExcel->getActiveSheet()->setTitle($fileName);
|
|
|
$objPHPExcel->setActiveSheetIndex(0);
|
|
|
$dir = './priceTable/' . $mainId;
|
|
|
@@ -1630,8 +1684,16 @@ class StatSaleClass extends BaseClass
|
|
|
$currentStartTime = $currentStartDate . ' 00:00:00';
|
|
|
$currentEndTime = $currentEndDate . ' 23:59:59';
|
|
|
|
|
|
+ // timeType=bill(默认记账 payTime)/ send(发货 sendTime)
|
|
|
+ $timeType = isset($get['timeType']) ? strval($get['timeType']) : 'bill';
|
|
|
+ $saleTimeField = ($timeType === 'send') ? 'sendTime' : 'payTime';
|
|
|
+
|
|
|
$where = ['mainId' => $mainId, 'status' => ['in', [OrderClass::ORDER_STATUS_UN_SEND, OrderClass::ORDER_STATUS_SENDING, OrderClass::ORDER_STATUS_COMPLETE]]];
|
|
|
- $where['payTime'] = ['between', [$currentStartTime, $currentEndTime]];
|
|
|
+ $where[$saleTimeField] = ['between', [$currentStartTime, $currentEndTime]];
|
|
|
+ // sendTime 不代表成交,发货口径只统计已确认付款
|
|
|
+ if ($timeType === 'send') {
|
|
|
+ $where['payStatus'] = 1;
|
|
|
+ }
|
|
|
|
|
|
$customList = CustomClass::getAllByCondition(['ownMainId' => $mainId], null, 'id,name,distId', 'id');
|
|
|
|