This commit is contained in:
dzc committed 2025-10-27 10:52:30 +08:00
commit 6ad6ebafb2
11 files changed
+212 -105

No files matched your search

@@ -1,4 +1,4 @@
package com.bsd.pjcloud.supermarket.dto;
package com.bsd.pjcloud.supermarket.dto.stockwarn;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@@ -6,37 +6,37 @@ import lombok.Data;
/**
* 库存预警查询DTO
*
* @author zjf
* @date 2025-01-27
* @author pjcloud
* @date 2025-10-26
*/
@Data
@Schema(description = "库存预警查询DTO")
public class StockWarnQueryDTO {
/**
* 商品货号
* 预警类型:1-库存不足,2-库存超额
*/
@Schema(description = "商品货号")
private String productCode;
@Schema(description = "预警类型:1-库存不足,2-库存超额")
private String warnType;
/**
* 商品条码
* 条码
*/
@Schema(description = "商品条码")
@Schema(description = "条码")
private String barcode;
/**
* 商品编码
*/
@Schema(description = "商品编码")
private String productCode;
/**
* 商品名称
*/
@Schema(description = "商品名称")
private String productName;
/**
* 预警类型:1=库存不足 2=库存超额
*/
@Schema(description = "预警类型:1=库存不足 2=库存超额")
private String warnType;
/**
* 分类ID
*/
@@ -70,3 +70,4 @@ public class MallProductSkuAppVo {
private String status;
}
@@ -12,7 +12,7 @@ import com.bsd.pjcloud.common.excel.annotation.RequestExcel;
import com.bsd.pjcloud.common.idempotent.annotation.Idempotent;
import com.bsd.pjcloud.common.log.annotation.SysLog;
import com.bsd.pjcloud.common.security.util.SecurityUtils;
import com.bsd.pjcloud.supermarket.dto.StockWarnQueryDTO;
import com.bsd.pjcloud.supermarket.dto.SupermarketSpuAppQueryDTO;
import com.bsd.pjcloud.supermarket.dto.SupermarketSpuQueryDTO;
import com.bsd.pjcloud.supermarket.dto.SupermarketSpuUpdateStockByCodeReqDTO;
@@ -22,6 +22,7 @@ import com.bsd.pjcloud.supermarket.dto.erpspu.SmErpSpuImportPDNewDto;
import com.bsd.pjcloud.supermarket.dto.erpspu.SmErpSpuPageDto;
import com.bsd.pjcloud.supermarket.dto.erpspu.SmErpSpuImportNewDto;
import com.bsd.pjcloud.supermarket.dto.inventoryrecords.*;
import com.bsd.pjcloud.supermarket.dto.stockwarn.StockWarnQueryDTO;
import com.bsd.pjcloud.supermarket.entity.*;
import com.bsd.pjcloud.supermarket.service.*;
import com.bsd.pjcloud.supermarket.vo.ad.SmErpSpuDetailsVo;
@@ -3,7 +3,7 @@ package com.bsd.pjcloud.supermarket.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper;
import com.bsd.pjcloud.supermarket.dto.StockWarnQueryDTO;
import com.bsd.pjcloud.supermarket.dto.stockwarn.StockWarnQueryDTO;
import com.bsd.pjcloud.supermarket.entity.SmErpStockEntity;
import com.bsd.pjcloud.supermarket.vo.stockwarn.StockWarnVO;
import org.apache.ibatis.annotations.Param;
@@ -3,8 +3,8 @@ package com.bsd.pjcloud.supermarket.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bsd.pjcloud.supermarket.dto.StockWarnQueryDTO;
import com.bsd.pjcloud.supermarket.dto.inventoryrecords.UpdateStockDTO;
import com.bsd.pjcloud.supermarket.dto.stockwarn.StockWarnQueryDTO;
import com.bsd.pjcloud.supermarket.entity.SmErpStockEntity;
import com.bsd.pjcloud.supermarket.vo.stockwarn.StockWarnVO;
import com.github.houbb.heaven.annotation.reflect.Param;
@@ -12,6 +12,8 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;
/**
@@ -30,23 +32,61 @@ public class ProfitReportServiceImpl implements ProfitReportService {
@Override
public Page<ProfitReportVO> page(Page<?> page, ProfitReportQueryDTO queryDTO) {
log.info("分页查询毛利报表,查询条件:{}", queryDTO);
return profitReportMapper.selectProfitReportPage(page, queryDTO, DataScope.of());
Page<ProfitReportVO> result = profitReportMapper.selectProfitReportPage(page, queryDTO, DataScope.of());
// 确保所有 BigDecimal 字段保留两位小数
result.getRecords().forEach(this::formatProfitReportVO);
return result;
}
@Override
public List<ProfitReportVO> list(ProfitReportQueryDTO queryDTO) {
log.info("列表查询毛利报表,查询条件:{}", queryDTO);
return profitReportMapper.selectProfitReportList(queryDTO, DataScope.of());
List<ProfitReportVO> result = profitReportMapper.selectProfitReportList(queryDTO, DataScope.of());
// 确保所有 BigDecimal 字段保留两位小数
result.forEach(this::formatProfitReportVO);
return result;
}
@Override
public List<ProfitReportExcelDTO> exportExcel(ProfitReportQueryDTO queryDTO) {
log.info("导出毛利报表,查询条件:{}", queryDTO);
List<ProfitReportVO> list = profitReportMapper.selectProfitReportList(queryDTO, DataScope.of());
// 确保所有 BigDecimal 字段保留两位小数
list.forEach(this::formatProfitReportVO);
List<ProfitReportExcelDTO> excelList = BeanUtils.toBean(list, ProfitReportExcelDTO.class);
log.info("导出毛利报表成功,导出记录数:{}", excelList.size());
return excelList;
}
/**
* 格式化毛利报表VO的所有BigDecimal字段,保留两位小数
*/
private void formatProfitReportVO(ProfitReportVO vo) {
if (vo.getSalesPrice() != null) {
vo.setSalesPrice(vo.getSalesPrice().setScale(2, RoundingMode.HALF_UP));
}
if (vo.getCostPrice() != null) {
vo.setCostPrice(vo.getCostPrice().setScale(2, RoundingMode.HALF_UP));
}
if (vo.getSalesAmount() != null) {
vo.setSalesAmount(vo.getSalesAmount().setScale(2, RoundingMode.HALF_UP));
}
if (vo.getSalesCost() != null) {
vo.setSalesCost(vo.getSalesCost().setScale(2, RoundingMode.HALF_UP));
}
if (vo.getGrossProfit() != null) {
vo.setGrossProfit(vo.getGrossProfit().setScale(2, RoundingMode.HALF_UP));
}
if (vo.getProfitMargin() != null) {
vo.setProfitMargin(vo.getProfitMargin().setScale(2, RoundingMode.HALF_UP));
}
}
}
@@ -12,6 +12,8 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;
/**
@@ -29,20 +31,84 @@ public class SalesReportServiceImpl implements SalesReportService {
@Override
public Page<SalesReportVO> page(Page<?> page, SalesReportQueryDTO queryDTO) {
log.info("分页查询销售报表,查询条件:{}", queryDTO);
return salesReportMapper.selectSalesReportPage(page, queryDTO, DataScope.of());
log.info("========== 销售报表查询参数 ==========");
log.info("分页参数 - current: {}, size: {}", page.getCurrent(), page.getSize());
log.info("查询条件 - productName: {}", queryDTO != null ? queryDTO.getProductName() : null);
log.info("查询条件 - productCode: {}", queryDTO != null ? queryDTO.getProductCode() : null);
log.info("查询条件 - categoryId: {}", queryDTO != null ? queryDTO.getCategoryId() : null);
log.info("查询条件 - startDate: {}", queryDTO != null ? queryDTO.getStartDate() : null);
log.info("查询条件 - endDate: {}", queryDTO != null ? queryDTO.getEndDate() : null);
log.info("查询条件 - sortBy: {}", queryDTO != null ? queryDTO.getSortBy() : null);
Page<SalesReportVO> result = salesReportMapper.selectSalesReportPage(page, queryDTO, DataScope.of());
// 确保所有 BigDecimal 字段保留两位小数
result.getRecords().forEach(vo -> {
if (vo.getSalesPrice() != null) {
vo.setSalesPrice(vo.getSalesPrice().setScale(2, RoundingMode.HALF_UP));
}
if (vo.getSalesAmount() != null) {
vo.setSalesAmount(vo.getSalesAmount().setScale(2, RoundingMode.HALF_UP));
}
if (vo.getReturnAmount() != null) {
vo.setReturnAmount(vo.getReturnAmount().setScale(2, RoundingMode.HALF_UP));
}
if (vo.getActualSalesAmount() != null) {
vo.setActualSalesAmount(vo.getActualSalesAmount().setScale(2, RoundingMode.HALF_UP));
}
});
log.info("查询结果数量: {} / 总数: {}", result.getRecords().size(), result.getTotal());
log.info("======================================");
return result;
}
@Override
public List<SalesReportVO> list(SalesReportQueryDTO queryDTO) {
log.info("列表查询销售报表,查询条件:{}", queryDTO);
return salesReportMapper.selectSalesReportList(queryDTO, DataScope.of());
List<SalesReportVO> result = salesReportMapper.selectSalesReportList(queryDTO, DataScope.of());
// 确保所有 BigDecimal 字段保留两位小数
result.forEach(vo -> {
if (vo.getSalesPrice() != null) {
vo.setSalesPrice(vo.getSalesPrice().setScale(2, RoundingMode.HALF_UP));
}
if (vo.getSalesAmount() != null) {
vo.setSalesAmount(vo.getSalesAmount().setScale(2, RoundingMode.HALF_UP));
}
if (vo.getReturnAmount() != null) {
vo.setReturnAmount(vo.getReturnAmount().setScale(2, RoundingMode.HALF_UP));
}
if (vo.getActualSalesAmount() != null) {
vo.setActualSalesAmount(vo.getActualSalesAmount().setScale(2, RoundingMode.HALF_UP));
}
});
return result;
}
@Override
public List<SalesReportExcelDTO> exportExcel(SalesReportQueryDTO queryDTO) {
log.info("导出销售报表,查询条件:{}", queryDTO);
List<SalesReportVO> list = salesReportMapper.selectSalesReportList(queryDTO, DataScope.of());
// 确保所有 BigDecimal 字段保留两位小数
list.forEach(vo -> {
if (vo.getSalesPrice() != null) {
vo.setSalesPrice(vo.getSalesPrice().setScale(2, RoundingMode.HALF_UP));
}
if (vo.getSalesAmount() != null) {
vo.setSalesAmount(vo.getSalesAmount().setScale(2, RoundingMode.HALF_UP));
}
if (vo.getReturnAmount() != null) {
vo.setReturnAmount(vo.getReturnAmount().setScale(2, RoundingMode.HALF_UP));
}
if (vo.getActualSalesAmount() != null) {
vo.setActualSalesAmount(vo.getActualSalesAmount().setScale(2, RoundingMode.HALF_UP));
}
});
List<SalesReportExcelDTO> excelList = BeanUtils.toBean(list, SalesReportExcelDTO.class);
log.info("导出销售报表成功,导出记录数:{}", excelList.size());
return excelList;
@@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bsd.pjcloud.supermarket.dto.StockWarnQueryDTO;
import com.bsd.pjcloud.supermarket.dto.inventoryrecords.InventoryRecordSaveItemDTO;
import com.bsd.pjcloud.supermarket.dto.inventoryrecords.UpdateStockDTO;
import com.bsd.pjcloud.supermarket.entity.SmErpStockEntity;
@@ -18,7 +17,7 @@ import com.bsd.pjcloud.supermarket.vo.stockwarn.StockWarnVO;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.bsd.pjcloud.supermarket.dto.stockwarn.StockWarnQueryDTO;
import java.util.List;
/**
@@ -57,82 +57,82 @@
base.purchase_price / 100.0 AS purchase_price,
base.retail_price / 100.0 AS retail_price,
COALESCE(SUM(CASE WHEN r.inventory_type = '3' THEN
CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END)
END), 0) AS purchase_in_qty,
COALESCE(SUM(CASE WHEN r.inventory_type = '3' THEN item.total_amount END), 0) / 100.0 AS purchase_in_amount,
ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '3' THEN item.total_amount END), 0)) / 100.0 AS purchase_in_amount,
COALESCE(SUM(CASE WHEN r.inventory_type = '4' THEN
CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END)
END), 0) AS purchase_return_qty,
COALESCE(SUM(CASE WHEN r.inventory_type = '4' THEN item.total_amount END), 0) / 100.0 AS purchase_return_amount,
ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '4' THEN item.total_amount END), 0)) / 100.0 AS purchase_return_amount,
COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN
CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END)
END), 0) AS sales_qty,
COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0) / 100.0 AS sales_amount,
ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0)) / 100.0 AS sales_amount,
COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN
CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END)
END), 0) AS sales_return_qty,
COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0) / 100.0 AS sales_return_amount,
ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0)) / 100.0 AS sales_return_amount,
COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN
CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END)
END), 0) - COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN
CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END)
END), 0) AS actual_sales_qty,
COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0) / 100.0
- COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0) / 100.0 AS actual_sales_amount,
ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0)) / 100.0
- ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0)) / 100.0 AS actual_sales_amount,
(COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN
CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END)
END), 0) - COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN
CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END)
END), 0)) * COALESCE(base.purchase_price / 100.0, 0) AS sales_cost,
COALESCE(stock.current_stock, 0) AS closing_qty,
COALESCE(stock.current_stock, 0) * COALESCE(base.purchase_price / 100.0, 0) AS closing_amount,
COALESCE(stock.current_stock, 0) * COALESCE(base.retail_price / 100.0, 0) AS closing_retail_amount,
(COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0) / 100.0
- COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0) / 100.0)
(ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0)) / 100.0
- ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0)) / 100.0)
- ((COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN
CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END)
END), 0) - COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN
CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END)
END), 0)) * COALESCE(base.purchase_price / 100.0, 0)) AS gross_profit,
MIN(CASE WHEN r.inventory_type = '3' THEN r.inventory_date END) AS first_purchase_date,
COALESCE(stock.base_stock, 0) AS opening_qty,
@@ -39,98 +39,98 @@
base.spec AS spec,
base.unit AS unit,
COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN
CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END)
END), 0) - COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN
CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END)
END), 0) AS sales_qty,
COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0) / 100.0
- COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0) / 100.0 AS sales_amount,
ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0)) / 100.0
- ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0)) / 100.0 AS sales_amount,
COALESCE(base.purchase_price / 100.0, 0) AS cost_price,
CASE WHEN (COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN
CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END)
END), 0) - COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN
CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END)
END), 0)) > 0
THEN (COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0) / 100.0
- COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0) / 100.0)
THEN (ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0)) / 100.0
- ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0)) / 100.0)
/ (COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN
CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END)
END), 0) - COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN
CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END)
END), 0))
ELSE 0
END AS sales_price,
(COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN
CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END)
END), 0) - COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN
CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END)
END), 0)) * COALESCE(base.purchase_price / 100.0, 0) AS sales_cost,
(COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0) / 100.0
- COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0) / 100.0)
(ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0)) / 100.0
- ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0)) / 100.0)
- ((COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN
CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END)
END), 0) - COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN
CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END)
END), 0)) * COALESCE(base.purchase_price / 100.0, 0)) AS gross_profit,
CASE WHEN (COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0) / 100.0
- COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0) / 100.0) > 0
THEN ((COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0) / 100.0
- COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0) / 100.0)
CASE WHEN (ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0)) / 100.0
- ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0)) / 100.0) > 0
THEN ((ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0)) / 100.0
- ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0)) / 100.0)
- ((COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN
CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END)
END), 0) - COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN
CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END)
END), 0)) * COALESCE(base.purchase_price / 100.0, 0)))
/ (COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0) / 100.0
- COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0) / 100.0) * 100
/ (ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0)) / 100.0
- ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0)) / 100.0) * 100
ELSE 0
END AS profit_margin,
COUNT(DISTINCT CASE WHEN r.inventory_type IN ('5', '6') THEN r.id END) AS sales_count
@@ -36,50 +36,50 @@
base.spec AS spec,
base.unit AS unit,
COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN
CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END)
END), 0) AS sales_qty,
COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0) / 100.0 AS sales_amount,
ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0)) / 100.0 AS sales_amount,
COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN
CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END)
END), 0) AS return_qty,
COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0) / 100.0 AS return_amount,
ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0)) / 100.0 AS return_amount,
COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN
CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END)
END), 0) - COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN
CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END)
END), 0) AS actual_sales_qty,
COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0) / 100.0
- COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0) / 100.0 AS actual_sales_amount,
ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0)) / 100.0
- ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '6' THEN item.total_amount END), 0)) / 100.0 AS actual_sales_amount,
CASE WHEN COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN
CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END)
END), 0) > 0
THEN COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0) / 100.0
THEN ABS(COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN item.total_amount END), 0)) / 100.0
/ COALESCE(SUM(CASE WHEN r.inventory_type = '5' THEN
CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
ABS(CASE WHEN u.id IS NOT NULL AND base.id IS NOT NULL AND u.id != base.id
AND u.package_num IS NOT NULL AND u.package_num > 0
THEN item.quantity * u.package_num
ELSE item.quantity
END
END)
END), 0)
ELSE 0
END AS sales_price,