统计接口新增1212

This commit is contained in:
2025-12-12 14:53:20 +08:00
parent 4bcd655827
commit 829f0301e0
6 changed files with 62 additions and 23 deletions

View File

@@ -46,7 +46,7 @@ public class DeliveryOrderController extends BaseController {
/** /**
* 新增:详细列表(表头 + 货物明细 + 照片),不分页 * 新增:详细列表(表头 + 货物明细 + 照片),不分页
*/ */
// @PreAuthorize("@ss.hasPermi('document:order:list')") // @PreAuthorize("@ss.hasPermi('document:order:list')")
@GetMapping("/listWithDetail") @GetMapping("/listWithDetail")
public TableDataInfo listWithDetail(DeliveryOrder deliveryOrder) { public TableDataInfo listWithDetail(DeliveryOrder deliveryOrder) {
@@ -56,7 +56,6 @@ public class DeliveryOrderController extends BaseController {
return getDataTable(list); return getDataTable(list);
} }
/** /**
* 导出配送单据主列表 * 导出配送单据主列表
*/ */
@@ -187,4 +186,12 @@ public class DeliveryOrderController extends BaseController {
List<DeliveryDailyStatVO> list = deliveryOrderService.statByDaily(query); List<DeliveryDailyStatVO> list = deliveryOrderService.statByDaily(query);
return AjaxResult.success(list); return AjaxResult.success(list);
} }
/** 按日期(月维度)统计 */
//@PreAuthorize("@ss.hasPermi('document:order:stat')")
@PostMapping("/stat/monthly")
public AjaxResult statByMonthly(@RequestBody DeliveryOrderStatQuery query) {
List<DeliveryMonthlyStatVO> list = deliveryOrderService.statByMonthly(query);
return AjaxResult.success(list);
}
} }

View File

@@ -14,7 +14,7 @@ public class DeliveryOrderStatQuery {
/** 开始日期(按配送日期过滤) */ /** 开始日期(按配送日期过滤) */
@JsonFormat(pattern = "yyyy-MM-dd") @JsonFormat(pattern = "yyyy-MM-dd")
private Date beginDate; private Date statDate;
/** 结束日期(按配送日期过滤) */ /** 结束日期(按配送日期过滤) */
@JsonFormat(pattern = "yyyy-MM-dd") @JsonFormat(pattern = "yyyy-MM-dd")

View File

@@ -108,6 +108,9 @@ public interface DeliveryOrderMapper
/** 按日期(日维度)统计 */ /** 按日期(日维度)统计 */
List<DeliveryDailyStatVO> selectDailyStat(@Param("q") DeliveryOrderStatQuery query); List<DeliveryDailyStatVO> selectDailyStat(@Param("q") DeliveryOrderStatQuery query);
/** 按日期(月维度)统计 */
List<DeliveryMonthlyStatVO> selectMonthlyStat(@Param("q") DeliveryOrderStatQuery query);
/** 配送单VO列表 */ /** 配送单VO列表 */
List<DeliveryOrderVo> selectDeliveryOrderVoList(DeliveryOrder deliveryOrder); List<DeliveryOrderVo> selectDeliveryOrderVoList(DeliveryOrder deliveryOrder);
} }

View File

@@ -54,6 +54,9 @@ public interface IDeliveryOrderService {
/** 按日期(日维度)统计 */ /** 按日期(日维度)统计 */
List<DeliveryDailyStatVO> statByDaily(DeliveryOrderStatQuery query); List<DeliveryDailyStatVO> statByDaily(DeliveryOrderStatQuery query);
/** 按日期(月维度)统计 */
List<DeliveryMonthlyStatVO> statByMonthly(DeliveryOrderStatQuery query);
/** 配送单VO列表 */ /** 配送单VO列表 */
List<DeliveryOrderVo> selectDeliveryOrderVoList(DeliveryOrder deliveryOrder); List<DeliveryOrderVo> selectDeliveryOrderVoList(DeliveryOrder deliveryOrder);
} }

View File

@@ -190,20 +190,19 @@ public class DeliveryOrderServiceImpl implements IDeliveryOrderService
throw new ServiceException("物料明细不能为空"); throw new ServiceException("物料明细不能为空");
} }
// 取第一条,仍然要求同一出库单据号(暂不支持多出库单合并) // 取第一条 billNoCk判断是“手动创建”还是“出库单生成”
String billNoCk = dto.getItems().get(0).getBillNoCk(); String billNoCk = dto.getItems().get(0).getBillNoCk();
if (StringUtils.isBlank(billNoCk)) { boolean fromWms = StringUtils.isNotBlank(billNoCk); // true = 出库单生成false = 手动创建
throw new ServiceException("明细行缺少出库单据号 billNoCk");
}
// 收集 rk_info 主键 id用于回写 WMS // 收集 rk_info 主键 id用于出库单生成场景回写 WMS
List<Long> rkInfoIds = dto.getItems().stream() List<Long> rkInfoIds = dto.getItems().stream()
.map(DeliveryOrderLineDTO::getRkInfoId) .map(DeliveryOrderLineDTO::getRkInfoId)
.filter(Objects::nonNull) .filter(Objects::nonNull)
.distinct() .distinct()
.collect(Collectors.toList()); .collect(Collectors.toList());
if (rkInfoIds.isEmpty()) { // 出库单生成场景必须有 rkInfoId
if (fromWms && rkInfoIds.isEmpty()) {
throw new ServiceException("明细行缺少 rk_info 主键 id无法回写配送状态"); throw new ServiceException("明细行缺少 rk_info 主键 id无法回写配送状态");
} }
@@ -237,7 +236,9 @@ public class DeliveryOrderServiceImpl implements IDeliveryOrderService
for (DeliveryOrderLineDTO it : dto.getItems()) { for (DeliveryOrderLineDTO it : dto.getItems()) {
// 仍然限制同一出库单(你后续要支持多出库单再放开) // ===== 出库单生成场景下的两个判断(手动创建时跳过) =====
if (fromWms) {
// 限制同一出库单
if (!billNoCk.equals(it.getBillNoCk())) { if (!billNoCk.equals(it.getBillNoCk())) {
throw new ServiceException("当前接口暂不支持多张出库单合并配送,请确保所有明细 billNoCk 相同"); throw new ServiceException("当前接口暂不支持多张出库单合并配送,请确保所有明细 billNoCk 相同");
} }
@@ -245,6 +246,7 @@ public class DeliveryOrderServiceImpl implements IDeliveryOrderService
if (it.getRkInfoId() == null) { if (it.getRkInfoId() == null) {
throw new ServiceException("明细行缺少 rk_info 主键 id"); throw new ServiceException("明细行缺少 rk_info 主键 id");
} }
}
DeliveryOrder row = new DeliveryOrder(); DeliveryOrder row = new DeliveryOrder();
@@ -284,7 +286,7 @@ public class DeliveryOrderServiceImpl implements IDeliveryOrderService
row.setRemark(dto.getRemark()); row.setRemark(dto.getRemark());
// 2.2 明细字段 // 2.2 明细字段
row.setRkInfoId(it.getRkInfoId()); // 关联 rk_info 主键ID row.setRkInfoId(it.getRkInfoId()); // 关联 rk_info 主键ID(手动单可以为空)
row.setBillNoCk(it.getBillNoCk()); row.setBillNoCk(it.getBillNoCk());
row.setXmMs(it.getXmMs()); row.setXmMs(it.getXmMs());
row.setXmNo(it.getXmNo()); row.setXmNo(it.getXmNo());
@@ -309,13 +311,15 @@ public class DeliveryOrderServiceImpl implements IDeliveryOrderService
deliveryOrderMapper.batchInsert(rows); deliveryOrderMapper.batchInsert(rows);
} }
// ========== 4. 回写 WMS:按 rk_info.id 更新 is_delivery = 2配送中 ========== // ========== 4. 回写 WMS(仅出库单生成场景,手动创建不回写、不远程调用 ==========
if (fromWms) {
boolean ok = updateWmsIsDeliveryByIds(rkInfoIds, 2); boolean ok = updateWmsIsDeliveryByIds(rkInfoIds, 2);
if (!ok) { if (!ok) {
// 回写失败,整单回滚,避免脏数据 // 回写失败,整单回滚,避免脏数据
throw new ServiceException("已生成配送单,但回写 WMS 配送状态失败"); throw new ServiceException("已生成配送单,但回写 WMS 配送状态失败");
} }
}
return orderNo; return orderNo;
} }
@@ -495,4 +499,9 @@ public class DeliveryOrderServiceImpl implements IDeliveryOrderService
return deliveryOrderMapper.selectDailyStat(query); return deliveryOrderMapper.selectDailyStat(query);
} }
@Override
public List<DeliveryMonthlyStatVO> statByMonthly(DeliveryOrderStatQuery query) {
return deliveryOrderMapper.selectMonthlyStat(query);
}
} }

View File

@@ -874,8 +874,8 @@
(dor.is_delete = '0' OR dor.is_delete = 0 OR dor.is_delete IS NULL) (dor.is_delete = '0' OR dor.is_delete = 0 OR dor.is_delete IS NULL)
<!-- 配送日期范围 --> <!-- 配送日期范围 -->
<if test="q.beginDate != null"> <if test="q.statDate != null">
AND DATE(dor.delivery_date) <![CDATA[>=]]> DATE(#{q.beginDate}) AND DATE(dor.delivery_date) <![CDATA[>=]]> DATE(#{q.statDate})
</if> </if>
<if test="q.endDate != null"> <if test="q.endDate != null">
AND DATE(dor.delivery_date) <![CDATA[<=]]> DATE(#{q.endDate}) AND DATE(dor.delivery_date) <![CDATA[<=]]> DATE(#{q.endDate})
@@ -989,4 +989,21 @@
GROUP BY DATE(dor.delivery_date) GROUP BY DATE(dor.delivery_date)
ORDER BY statDate ASC ORDER BY statDate ASC
</select> </select>
<!-- 按日期(月维度)统计 -->
<select id="selectMonthlyStat"
parameterType="com.delivery.project.document.domain.dto.DeliveryOrderStatQuery"
resultType="com.delivery.project.document.domain.vo.DeliveryMonthlyStatVO">
SELECT
DATE_FORMAT(dor.delivery_date, '%Y-%m') AS statMonth,
COUNT(1) AS orderCount,
IFNULL(SUM(dor.delivery_ton), 0) AS totalDeliveryTon,
IFNULL(SUM(dor.goods_size), 0) AS totalGoodsSize,
IFNULL(SUM(dor.actual_fee), 0) AS totalActualFee,
IFNULL(SUM(dor.total_km), 0) AS totalKm
FROM delivery_order dor
<include refid="statWhere"/>
GROUP BY DATE_FORMAT(dor.delivery_date, '%Y-%m')
ORDER BY statMonth ASC
</select>
</mapper> </mapper>