feat:食堂菜品购买统计(按月统计)
This commit is contained in:
1 parent
f1d6e2f2f6
commit
e1527c5bd0
8 files changed
+240
-13
No files matched your search
+6
@@ -11,6 +11,12 @@ public class HardCarDto extends HardCarEntity {
|
||||
|
||||
private Long orderId;
|
||||
|
||||
/**
|
||||
* 0 yyyy-MM-dd
|
||||
* 1 yyyy-MM
|
||||
*/
|
||||
private String createTimeType = "0";
|
||||
|
||||
private String createTimeStr;
|
||||
|
||||
private LocalDate[] createTimeList;
|
||||
|
||||
+3
@@ -27,6 +27,9 @@ public class HardCanteenProductTotalVo {
|
||||
@Schema(description = "购买日期(年月日)")
|
||||
private LocalDateTime createTime;
|
||||
|
||||
@Schema(description = "购买日期自定义格式")
|
||||
private String createTimeStr;
|
||||
|
||||
@Schema(description = "用餐时间段(早中晚)")
|
||||
private String hourType;
|
||||
|
||||
|
||||
+24
-2
@@ -4,6 +4,7 @@ import cn.hutool.core.util.ObjectUtil;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.bsd.pjcloud.common.core.util.R;
|
||||
import com.bsd.pjcloud.common.data.datascope.DataScope;
|
||||
import com.bsd.pjcloud.common.log.annotation.SysLog;
|
||||
import com.bsd.pjcloud.common.security.annotation.Inner;
|
||||
import com.bsd.pjcloud.common.security.service.PjcloudUser;
|
||||
import com.bsd.pjcloud.common.security.util.SecurityUtils;
|
||||
@@ -21,6 +22,7 @@ import com.bsd.pjcloud.hard.service.HardCanteenTotalService;
|
||||
import io.swagger.v3.oas.annotations.Operation;
|
||||
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.springdoc.core.annotations.ParameterObject;
|
||||
import org.springframework.http.HttpHeaders;
|
||||
@@ -82,7 +84,7 @@ public class HardCanteenTotalController {
|
||||
return R.ok(canteenTotalService.productLikeTop(dto));
|
||||
}
|
||||
|
||||
/* ************************************* start app start ************************************* */
|
||||
/* ************************************* end app end ************************************* */
|
||||
@Operation(summary = "根据部门 食堂菜品购买统计", description = "根据部门 食堂菜品购买统计")
|
||||
@PostMapping("/proudct-total-by-dept")
|
||||
public R<List<HardCanteenProductTotalVo>> productTotalByDept(@ParameterObject Page page, @RequestBody HardOrderDto dto) {
|
||||
@@ -90,17 +92,37 @@ public class HardCanteenTotalController {
|
||||
return R.ok(canteenTotalService.productTotalByDept(page, dto, dataScope));
|
||||
}
|
||||
|
||||
@Operation(summary = "食堂菜品购买统计", description = "食堂菜品购买统计")
|
||||
@Operation(summary = "食堂菜品购买统计(按天统计)", description = "食堂菜品购买统计(按天统计)")
|
||||
@PostMapping("/proudct-total")
|
||||
public R<Page<HardCanteenProductTotalVo>> productTotal(@ParameterObject Page page, @RequestBody HardOrderDto dto) {
|
||||
DataScope dataScope = null;
|
||||
return R.ok(canteenTotalService.productTotal(page, dto, dataScope));
|
||||
}
|
||||
|
||||
@Operation(summary = "食堂菜品购买统计(按月统计)", description = "食堂菜品购买统计(按月统计)")
|
||||
@PostMapping("/proudct-total-by-month")
|
||||
public R<Page<HardCanteenProductTotalVo>> productTotalByMonth(@ParameterObject Page page, @RequestBody HardOrderDto dto) {
|
||||
DataScope dataScope = null;
|
||||
return R.ok(canteenTotalService.productTotalByMonth(page, dto, dataScope));
|
||||
}
|
||||
|
||||
@Operation(summary = "菜品出售统计", description = "菜品出售统计")
|
||||
@PostMapping("/proudct-query")
|
||||
public R<Page<HardCarVo>> proudctQuery(@ParameterObject Page page, @RequestBody HardCarDto dto) {
|
||||
return R.ok(canteenTotalService.proudctQuery(page, dto));
|
||||
}
|
||||
|
||||
@Operation(summary = "食堂菜品购买统计导出(按天统计)", description = "食堂菜品购买统计导出(按天统计)")
|
||||
@PostMapping("/proudct-total-export-by-day")
|
||||
@SysLog("食堂菜品购买统计导出(按天统计)")
|
||||
public void productTotalExportByDay(HttpServletResponse response, @RequestBody HardOrderDto dto) {
|
||||
canteenTotalService.productTotalExportByDay(response, dto);
|
||||
}
|
||||
|
||||
@Operation(summary = "食堂菜品购买统计导出(按月统计)", description = "食堂菜品购买统计导出(按月统计)")
|
||||
@PostMapping("/proudct-total-export-by-month")
|
||||
@SysLog("食堂菜品购买统计导出(按月统计)")
|
||||
public void productTotalExportByMonth(HttpServletResponse response, @RequestBody HardOrderDto dto) {
|
||||
canteenTotalService.productTotalExportByMonth(response, dto);
|
||||
}
|
||||
}
|
||||
+2
@@ -34,6 +34,8 @@ public interface HardCarMapper extends PjcloudBaseMapper<HardCarEntity> {
|
||||
|
||||
Page<HardCanteenProductTotalVo> productTotal(Page page, @Param("dto") HardOrderDto dto, DataScope dataScope);
|
||||
|
||||
Page<HardCanteenProductTotalVo> productTotalByMonth(Page page, @Param("dto") HardOrderDto dto, DataScope dataScope);
|
||||
|
||||
Page<HardCarVo> proudctQuery(Page page, @Param("dto") HardCarDto dto);
|
||||
|
||||
List<HardCanteenProductTotalVo> listByDept(@Param("dto") HardOrderDto dto, DataScope dataScope);
|
||||
|
||||
+17
-1
@@ -13,6 +13,7 @@ import com.bsd.pjcloud.hard.api.vo.order.HardCarVo;
|
||||
import com.bsd.pjcloud.hard.api.vo.order.app.HardAppProductByCanteenVo;
|
||||
import com.bsd.pjcloud.hard.api.vo.order.app.HardAppProductByClassifyVo;
|
||||
import com.bsd.pjcloud.hard.api.vo.order.app.HardAppProductLikeTopVo;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
@@ -40,10 +41,15 @@ public interface HardCanteenTotalService {
|
||||
List<HardCanteenProductTotalVo> productTotalByDept(Page page, HardOrderDto dto, DataScope dataScope);
|
||||
|
||||
/**
|
||||
* 食堂菜品购买统计
|
||||
* 食堂菜品购买统计(按天统计)
|
||||
*/
|
||||
Page<HardCanteenProductTotalVo> productTotal(Page page, HardOrderDto dto, DataScope dataScope);
|
||||
|
||||
/**
|
||||
* 食堂菜品购买部门统计(按月统计)
|
||||
*/
|
||||
Page<HardCanteenProductTotalVo> productTotalByMonth(Page page, HardOrderDto dto, DataScope dataScope);
|
||||
|
||||
/**
|
||||
* 菜品出售统计
|
||||
*/
|
||||
@@ -53,4 +59,14 @@ public interface HardCanteenTotalService {
|
||||
* 食堂菜品购买部门统计
|
||||
*/
|
||||
List<HardCanteenProductTotalVo> listByDept(HardOrderDto dto, DataScope dataScope);
|
||||
|
||||
/**
|
||||
* 食堂菜品购买统计导出(按天统计)
|
||||
*/
|
||||
void productTotalExportByDay(HttpServletResponse response, HardOrderDto dto);
|
||||
|
||||
/**
|
||||
* 食堂菜品购买统计导出(按月统计)
|
||||
*/
|
||||
void productTotalExportByMonth(HttpServletResponse response, HardOrderDto dto);
|
||||
}
|
||||
+100
-6
@@ -1,9 +1,15 @@
|
||||
package com.bsd.pjcloud.hard.service.impl.order;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.date.DatePattern;
|
||||
import cn.hutool.core.date.LocalDateTimeUtil;
|
||||
import cn.hutool.core.io.resource.ResourceUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import com.alibaba.excel.EasyExcel;
|
||||
import com.alibaba.excel.ExcelWriter;
|
||||
import com.alibaba.excel.enums.WriteDirectionEnum;
|
||||
import com.alibaba.excel.write.metadata.WriteSheet;
|
||||
import com.alibaba.excel.write.metadata.fill.FillConfig;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.bsd.pjcloud.admin.api.entity.SysDept;
|
||||
import com.bsd.pjcloud.admin.api.feign.RemoteDeptService;
|
||||
@@ -13,6 +19,7 @@ import com.bsd.pjcloud.common.core.constant.enums.MerchantTypeEnum;
|
||||
import com.bsd.pjcloud.common.core.constant.enums.YesNoEnum;
|
||||
import com.bsd.pjcloud.common.core.util.CollectionUtils;
|
||||
import com.bsd.pjcloud.common.data.datascope.DataScope;
|
||||
import com.bsd.pjcloud.hard.api.constant.order.HardHourTypeEnum;
|
||||
import com.bsd.pjcloud.hard.api.constant.order.HardOrderStatusEnum;
|
||||
import com.bsd.pjcloud.hard.api.constant.total.DateRangeTypeEnum;
|
||||
import com.bsd.pjcloud.hard.api.dto.order.HardCarDto;
|
||||
@@ -30,20 +37,19 @@ import com.bsd.pjcloud.hard.mapper.order.HardOrderMapper;
|
||||
import com.bsd.pjcloud.hard.service.HardCanteenTotalService;
|
||||
import com.bsd.pjcloud.wallet.api.feign.RemoteMchService;
|
||||
import com.bsd.pjcloud.wallet.api.vo.MchManageVo;
|
||||
import jakarta.servlet.http.HttpServletResponse;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.stereotype.Service;
|
||||
import org.springframework.validation.annotation.Validated;
|
||||
|
||||
import java.math.BigDecimal;
|
||||
import java.math.RoundingMode;
|
||||
import java.time.DayOfWeek;
|
||||
import java.time.LocalDate;
|
||||
import java.time.LocalDateTime;
|
||||
import java.time.temporal.TemporalAdjusters;
|
||||
import java.util.ArrayList;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.*;
|
||||
import java.util.concurrent.CompletableFuture;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
@@ -168,7 +174,7 @@ public class HardCanteenTotalServiceImpl implements HardCanteenTotalService {
|
||||
}
|
||||
|
||||
/**
|
||||
* 食堂菜品购买统计
|
||||
* 食堂菜品购买统计(按天统计)
|
||||
*/
|
||||
@Override
|
||||
public Page<HardCanteenProductTotalVo> productTotal(Page page, HardOrderDto dto, DataScope dataScope) {
|
||||
@@ -183,6 +189,25 @@ public class HardCanteenTotalServiceImpl implements HardCanteenTotalService {
|
||||
return pageList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 食堂菜品购买部门统计(按月统计)
|
||||
*/
|
||||
@Override
|
||||
public Page<HardCanteenProductTotalVo> productTotalByMonth(Page page, HardOrderDto dto, DataScope dataScope) {
|
||||
dto.setOrderStatusCodes(HardOrderStatusEnum.getPaySuccessCodes());
|
||||
Page<HardCanteenProductTotalVo> pageList = hardCarMapper.productTotalByMonth(page, dto, dataScope);
|
||||
if (ObjectUtil.isNotEmpty(pageList)) {
|
||||
for (HardCanteenProductTotalVo v : pageList.getRecords()) {
|
||||
if (ObjectUtil.isEmpty(v.getCreateTime()) && ObjectUtil.isNotEmpty(v.getCreateTimeStr())) {
|
||||
v.setCreateTime(LocalDateTimeUtil.parse(v.getCreateTimeStr() + "-01", DatePattern.NORM_DATE_PATTERN));
|
||||
}
|
||||
LocalDate localDate = v.getCreateTime().toLocalDate();
|
||||
v.setUniqueCode(localDate + "_" + v.getHourType());
|
||||
}
|
||||
}
|
||||
return pageList;
|
||||
}
|
||||
|
||||
/**
|
||||
* 菜品出售统计
|
||||
*/
|
||||
@@ -236,6 +261,75 @@ public class HardCanteenTotalServiceImpl implements HardCanteenTotalService {
|
||||
return list;
|
||||
}
|
||||
|
||||
/**
|
||||
* 食堂菜品购买统计导出(按天统计)
|
||||
*/
|
||||
@Override
|
||||
public void productTotalExportByDay(HttpServletResponse response, HardOrderDto dto) {
|
||||
dto.setOrderStatusCodes(HardOrderStatusEnum.getPaySuccessCodes());
|
||||
try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(ResourceUtil.getStream("file/设备交易金额汇总.xlsx")).build()) {
|
||||
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
log.error("|食堂菜品购买统计导出(按天统计)|导出数据异常error:{}", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 食堂菜品购买统计导出(按月统计)
|
||||
*/
|
||||
@Override
|
||||
public void productTotalExportByMonth(HttpServletResponse response, HardOrderDto dto) {
|
||||
dto.setOrderStatusCodes(HardOrderStatusEnum.getPaySuccessCodes());
|
||||
try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).withTemplate(ResourceUtil.getStream("file/食堂菜品购买统计(按月).xlsx")).build()) {
|
||||
WriteSheet writeSheet = EasyExcel.writerSheet().build();
|
||||
FillConfig fillConfig = FillConfig.builder().direction(WriteDirectionEnum.HORIZONTAL).build();
|
||||
|
||||
long currentPage = 1L;
|
||||
long pageSize = 200L;
|
||||
while (true) {
|
||||
Page<HardCanteenProductTotalVo> page = productTotalByMonth(new Page(currentPage, pageSize), dto, null);
|
||||
if (ObjectUtil.isEmpty(page) || ObjectUtil.isEmpty(page.getRecords())) break;
|
||||
// 填充数据
|
||||
List<HardCanteenProductTotalVo> records = page.getRecords();
|
||||
// 月份
|
||||
List<Map<String, String>> mounthList = records.stream().map(v -> {
|
||||
LocalDateTime createTime = v.getCreateTime();
|
||||
String createTimeStr = LocalDateTimeUtil.format(createTime, DatePattern.NORM_MONTH_PATTERN);
|
||||
return Map.of("createTimeStr", createTimeStr);
|
||||
}).toList();
|
||||
excelWriter.fill(mounthList, fillConfig, writeSheet);
|
||||
// 早
|
||||
List<HardCanteenProductTotalVo> morningList = records.stream().filter(v -> ObjectUtil.equals(v.getHourType(), HardHourTypeEnum.MORNING.getType())).toList();
|
||||
excelWriter.fill(productTotalExportByMonthToDefaulColExcelMap(morningList), fillConfig, writeSheet);
|
||||
// 中
|
||||
List<HardCanteenProductTotalVo> noonList = records.stream().filter(v -> ObjectUtil.equals(v.getHourType(), HardHourTypeEnum.NOONING.getType())).toList();
|
||||
excelWriter.fill(productTotalExportByMonthToDefaulColExcelMap(noonList), fillConfig, writeSheet);
|
||||
// 晚
|
||||
List<HardCanteenProductTotalVo> nightList = records.stream().filter(v -> ObjectUtil.equals(v.getHourType(), HardHourTypeEnum.NIGHT.getType())).toList();
|
||||
excelWriter.fill(productTotalExportByMonthToDefaulColExcelMap(nightList), fillConfig, writeSheet);
|
||||
if (ObjectUtil.isEmpty(page.getPages()) || page.getCurrent() > page.getPages()) break;
|
||||
currentPage++;
|
||||
}
|
||||
excelWriter.fill(new HashMap<>(), writeSheet);
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
log.error("|食堂菜品购买统计导出(按月统计)|导出数据异常error:{}", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private List<Map<String, String>> productTotalExportByMonthToDefaulColExcelMap(List<HardCanteenProductTotalVo> records) {
|
||||
List<Map<String, String>> list = new LinkedList<>();
|
||||
if (ObjectUtil.isEmpty(records)) return list;
|
||||
for (HardCanteenProductTotalVo i : records) {
|
||||
LinkedHashMap<String, String> map = new LinkedHashMap<>();
|
||||
map.put("totalPrice", BigDecimal.valueOf(i.getTotalPrice()).divide(BigDecimal.valueOf(1000), 2, RoundingMode.HALF_UP).toString());
|
||||
map.put("timeCount", String.valueOf(i.getTimeCount()));
|
||||
list.add(map);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
/**
|
||||
* 为HardCanteenProductTotalVo增加部门信息
|
||||
*/
|
||||
|
||||
Binary file not shown.
+88
-4
@@ -42,7 +42,21 @@
|
||||
<sql id="whereA">
|
||||
a.del_flag = '0'
|
||||
<if test="dto.createTimeStr != null and dto.createTimeStr != '' ">
|
||||
and DATE_FORMAT(a.create_time, '%Y-%m-%d') = #{dto.createTimeStr}
|
||||
<choose>
|
||||
<when test="dto.createTimeType != null and dto.createTimeType != '' ">
|
||||
<choose>
|
||||
<when test="dto.createTimeType == '0'.toString() ">
|
||||
and DATE_FORMAT(a.create_time, '%Y-%m-%d') = #{dto.createTimeStr}
|
||||
</when>
|
||||
<when test="dto.createTimeType == '1'.toString() ">
|
||||
and DATE_FORMAT(a.create_time, '%Y-%m') = #{dto.createTimeStr}
|
||||
</when>
|
||||
</choose>
|
||||
</when>
|
||||
<otherwise>
|
||||
and DATE_FORMAT(a.create_time, '%Y-%m-%d') = #{dto.createTimeStr}
|
||||
</otherwise>
|
||||
</choose>
|
||||
</if>
|
||||
<if test="dto.createTimeList != null and dto.createTimeList.length == 2">
|
||||
and o.create_time between #{dto.createTimeList[0]} and #{dto.createTimeList[1]}
|
||||
@@ -129,7 +143,7 @@
|
||||
from hard_car a
|
||||
inner join hard_parent_car p on a.parent_car_id = p.id and p.del_flag = '0'
|
||||
inner join hard_order o on o.parent_car_id = p.id and o.del_flag = '0' and o.hour_type is not null and
|
||||
o.hour_type not in ('-1')
|
||||
o.hour_type not in ('-1','null')
|
||||
<where>
|
||||
<include refid="whereA"/>
|
||||
<if test="dto.createTimeList != null and dto.createTimeList.length == 2">
|
||||
@@ -186,7 +200,77 @@
|
||||
</if>
|
||||
</where>
|
||||
group by DATE_FORMAT(a.create_time, '%Y-%m-%d'), o.hour_type
|
||||
order by DATE_FORMAT(a.create_time, '%Y-%m-%d') desc, o.hour_type;
|
||||
order by DATE_FORMAT(a.create_time, '%Y-%m-%d') desc, o.hour_type
|
||||
</select>
|
||||
|
||||
<select id="productTotalByMonth" resultType="com.bsd.pjcloud.hard.api.vo.order.HardCanteenProductTotalVo">
|
||||
select DATE_FORMAT(a.create_time, '%Y-%m') as createTimeStr,
|
||||
o.hour_type,
|
||||
SUM(a.product_count) as payCount,
|
||||
SUM(a.total_price) as totalPrice,
|
||||
count(distinct o.id) as timeCount,
|
||||
count(distinct o.user_id) as payUserCount
|
||||
from hard_car a
|
||||
inner join hard_parent_car p on a.parent_car_id = p.id and p.del_flag = '0'
|
||||
inner join hard_order o on o.parent_car_id = p.id and o.del_flag = '0' and o.hour_type is not null and
|
||||
o.hour_type not in ('-1','null')
|
||||
<where>
|
||||
<include refid="whereA"/>
|
||||
<if test="dto.createTimeList != null and dto.createTimeList.length == 2">
|
||||
and o.create_time between #{dto.createTimeList[0]} and #{dto.createTimeList[1]}
|
||||
</if>
|
||||
<if test="dto.hourType != null and dto.hourType != '' ">
|
||||
and o.hour_type = #{dto.hourType}
|
||||
</if>
|
||||
<if test="dto.merchantId != null">
|
||||
and o.merchant_id = #{dto.merchantId}
|
||||
</if>
|
||||
<if test="dto.isOfflineOrder != null">
|
||||
and o.is_offline_order = #{dto.isOfflineOrder}
|
||||
</if>
|
||||
<if test="dto.deptIds != null and dto.deptIds.size() != 0">
|
||||
<choose>
|
||||
<when test="dto.isInclude != null and dto.isInclude == true">
|
||||
and o.dept_id IN
|
||||
</when>
|
||||
<when test="dto.isInclude != null and dto.isInclude == false">
|
||||
and o.dept_id NOT IN
|
||||
</when>
|
||||
<otherwise>
|
||||
and o.dept_id IN
|
||||
</otherwise>
|
||||
</choose>
|
||||
<foreach collection="dto.deptIds" item="v" open="(" close=")" separator=",">
|
||||
#{v}
|
||||
</foreach>
|
||||
</if>
|
||||
<if test="dto.merchantDeptIds != null and dto.merchantDeptIds.size() != 0">
|
||||
and o.merchant_dept_id in
|
||||
<foreach collection="dto.merchantDeptIds" item="v" open="(" close=")" separator=",">
|
||||
#{v}
|
||||
</foreach>
|
||||
</if>
|
||||
<if test="dto.mchIds != null and dto.mchIds.size() != 0">
|
||||
and o.merchant_id in
|
||||
<foreach collection="dto.mchIds" item="v" open="(" close=")" separator=",">
|
||||
#{v}
|
||||
</foreach>
|
||||
</if>
|
||||
<if test="dto.orderStatusCodes != null and dto.orderStatusCodes.size() != 0">
|
||||
and o.order_status in
|
||||
<foreach collection="dto.orderStatusCodes" item="v" open="(" close=")" separator=",">
|
||||
#{v}
|
||||
</foreach>
|
||||
</if>
|
||||
<if test="dto.mchTypeCodes != null and dto.mchTypeCodes.size() != 0">
|
||||
and o.merchant_type in
|
||||
<foreach collection="dto.mchTypeCodes" item="v" open="(" close=")" separator=",">
|
||||
#{v}
|
||||
</foreach>
|
||||
</if>
|
||||
</where>
|
||||
group by DATE_FORMAT(a.create_time, '%Y-%m'), o.hour_type
|
||||
order by DATE_FORMAT(a.create_time, '%Y-%m') desc, o.hour_type
|
||||
</select>
|
||||
|
||||
<select id="proudctQuery" resultType="com.bsd.pjcloud.hard.api.vo.order.HardCarVo">
|
||||
@@ -216,7 +300,7 @@
|
||||
</if>
|
||||
</where>
|
||||
group by a.product_id
|
||||
order by SUM(a.product_count) desc
|
||||
order by a.create_time desc , SUM(a.product_count) desc
|
||||
</select>
|
||||
|
||||
<select id="listByDept" resultType="com.bsd.pjcloud.hard.api.vo.order.HardCanteenProductTotalVo">
|
||||
|
||||
Reference in new issue
Block a user