成本模块

This commit is contained in:
2025-12-02 17:58:16 +08:00
parent be91905508
commit 4b9cce2777
22 changed files with 4808 additions and 3 deletions

View File

@@ -0,0 +1,272 @@
package com.klp.controller;
import java.util.List;
import java.util.Map;
import java.util.Arrays;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import com.klp.common.annotation.RepeatSubmit;
import com.klp.common.annotation.Log;
import com.klp.common.core.controller.BaseController;
import com.klp.common.core.domain.PageQuery;
import com.klp.common.core.domain.R;
import com.klp.common.core.validate.AddGroup;
import com.klp.common.core.validate.EditGroup;
import com.klp.common.enums.BusinessType;
import com.klp.common.utils.poi.ExcelUtil;
import com.klp.domain.vo.CostCoilDailyVo;
import com.klp.domain.bo.CostCoilDailyBo;
import com.klp.service.ICostCoilDailyService;
import com.klp.common.core.page.TableDataInfo;
import java.time.LocalDate;
import java.time.LocalDateTime;
import org.springframework.format.annotation.DateTimeFormat;
/**
* 钢卷日成本记录表
*
* @author klp
* @date 2025-11-25
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/wms/cost/coil")
public class CostCoilDailyController extends BaseController {
private final ICostCoilDailyService iCostCoilDailyService;
/**
* 查询钢卷日成本记录表列表
*/
@GetMapping("/list")
public TableDataInfo<CostCoilDailyVo> list(CostCoilDailyBo bo, PageQuery pageQuery) {
return iCostCoilDailyService.queryPageList(bo, pageQuery);
}
/**
* 导出钢卷日成本记录表列表
*/
@Log(title = "钢卷日成本记录表", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(CostCoilDailyBo bo, HttpServletResponse response) {
List<CostCoilDailyVo> list = iCostCoilDailyService.queryList(bo);
ExcelUtil.exportExcel(list, "钢卷日成本记录表", CostCoilDailyVo.class, response);
}
/**
* 获取钢卷日成本记录表详细信息
*
* @param costId 主键
*/
@GetMapping("/{costId}")
public R<CostCoilDailyVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long costId) {
return R.ok(iCostCoilDailyService.queryById(costId));
}
/**
* 新增钢卷日成本记录表
*/
@Log(title = "钢卷日成本记录表", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody CostCoilDailyBo bo) {
return toAjax(iCostCoilDailyService.insertByBo(bo));
}
/**
* 修改钢卷日成本记录表
*/
@Log(title = "钢卷日成本记录表", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody CostCoilDailyBo bo) {
return toAjax(iCostCoilDailyService.updateByBo(bo));
}
/**
* 删除钢卷日成本记录表
*
* @param costIds 主键串
*/
@Log(title = "钢卷日成本记录表", businessType = BusinessType.DELETE)
@DeleteMapping("/{costIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] costIds) {
return toAjax(iCostCoilDailyService.deleteWithValidByIds(Arrays.asList(costIds), true));
}
/**
* 实时计算指定钢卷的成本
*
* @param coilId 钢卷ID可选
* @param calcTime 计算时间点(可选,默认当前时间)
*/
@PostMapping("/calculate")
public R<Map<String, Object>> calculateCost(@RequestParam(required = false) Long coilId,
@RequestParam(required = false) LocalDateTime calcTime) {
Map<String, Object> result = iCostCoilDailyService.calculateCost(coilId, calcTime);
if (result.containsKey("error")) {
return R.fail(result.get("error").toString());
}
return R.ok(result);
}
/**
* 批量计算多个钢卷的成本
*
* @param coilIds 钢卷ID列表支持逗号分隔的字符串或数组
* @param calcTime 计算时间点(可选,默认当前时间)
*/
@PostMapping("/batchCalculateCost")
public R<List<Map<String, Object>>> batchCalculateCost(@RequestParam String coilIds,
@RequestParam(required = false) LocalDateTime calcTime) {
// 解析coilIds字符串为Long列表
List<Long> coilIdList = new java.util.ArrayList<>();
if (coilIds != null && !coilIds.trim().isEmpty()) {
String[] ids = coilIds.split(",");
for (String id : ids) {
try {
Long coilId = Long.parseLong(id.trim());
coilIdList.add(coilId);
} catch (NumberFormatException e) {
// 忽略无效的ID
}
}
}
List<Map<String, Object>> results = iCostCoilDailyService.batchCalculateCost(coilIdList, calcTime);
return R.ok(results);
}
/**
* 批量计算钢卷成本(定时任务使用)
*
* @param calcDate 计算日期(可选,默认前一日)
*/
@PostMapping("/batchCalculate")
@Log(title = "批量计算钢卷成本", businessType = BusinessType.OTHER)
public R<Integer> batchCalculate(@RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate calcDate) {
if (calcDate == null) {
calcDate = LocalDate.now().minusDays(1);
}
int count = iCostCoilDailyService.calculateDailyCost(calcDate);
return R.ok(count);
}
/**
* 查询成本统计报表
*
* @param startDate 开始日期
* @param endDate 结束日期
* @param groupBy 分组维度warehouse/itemType/materialType
* @param warehouseId 库区ID可选
*/
@GetMapping("/report/summary")
public R<Map<String, Object>> queryCostSummary(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate startDate,
@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate endDate,
@RequestParam(required = false) String groupBy,
@RequestParam(required = false) Long warehouseId) {
Map<String, Object> result = iCostCoilDailyService.queryCostSummary(startDate, endDate, groupBy, warehouseId);
return R.ok(result);
}
/**
* 查询成本趋势分析
*
* @param startDate 开始日期
* @param endDate 结束日期
*/
@GetMapping("/report/trend")
public R<List<Map<String, Object>>> queryCostTrend(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate startDate,
@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate endDate) {
List<Map<String, Object>> result = iCostCoilDailyService.queryCostTrend(startDate, endDate);
return R.ok(result);
}
/**
* 按入场钢卷号维度计算成本
*
* @param enterCoilNo 入场钢卷号
* @param calcDate 计算日期(可选,默认当前日期)
*/
@PostMapping("/calculateByEnterCoilNo")
public R<Map<String, Object>> calculateCostByEnterCoilNo(@RequestParam String enterCoilNo,
@RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate calcDate) {
Map<String, Object> result = iCostCoilDailyService.calculateCostByEnterCoilNo(enterCoilNo, calcDate);
if (result.containsKey("error")) {
return R.fail(result.get("error").toString());
}
return R.ok(result);
}
/**
* 现算成本检索(基于 wms_material_coil
*/
@GetMapping("/search/material")
public R<Map<String, Object>> searchMaterialCost(@RequestParam(required = false) String enterCoilNo,
@RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate calcDate,
@RequestParam(required = false, defaultValue = "1") Integer pageNum,
@RequestParam(required = false, defaultValue = "20") Integer pageSize) {
Map<String, Object> result = iCostCoilDailyService.searchMaterialCost(enterCoilNo, calcDate, pageNum, pageSize);
return R.ok(result);
}
/**
* 批量按入场钢卷号维度计算成本(定时任务使用)
*
* @param calcDate 计算日期(可选,默认前一日)
*/
@PostMapping("/batchCalculateByEnterCoilNo")
@Log(title = "批量按入场钢卷号计算成本", businessType = BusinessType.OTHER)
public R<Integer> batchCalculateByEnterCoilNo(@RequestParam(required = false) @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate calcDate) {
if (calcDate == null) {
calcDate = LocalDate.now().minusDays(1);
}
int count = iCostCoilDailyService.calculateDailyCostByEnterCoilNo(calcDate);
return R.ok(count);
}
/**
* 查询按入场钢卷号统计的成本报表
*
* @param startDate 开始日期
* @param endDate 结束日期
* @param enterCoilNo 入场钢卷号(可选)
*/
@GetMapping("/report/byEnterCoilNo")
public R<List<Map<String, Object>>> queryCostByEnterCoilNo(@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate startDate,
@RequestParam @DateTimeFormat(pattern = "yyyy-MM-dd") LocalDate endDate,
@RequestParam(required = false) String enterCoilNo) {
List<Map<String, Object>> result = iCostCoilDailyService.queryCostByEnterCoilNo(startDate, endDate, enterCoilNo);
return R.ok(result);
}
/**
* 囤积成本页数据(分页 + 汇总)
*/
@GetMapping("/stockpile")
public R<Map<String, Object>> queryStockpile(@RequestParam(required = false) String enterCoilNo,
@RequestParam(required = false) String currentCoilNo,
PageQuery pageQuery) {
Map<String, Object> result = iCostCoilDailyService.queryStockpileCostList(enterCoilNo, currentCoilNo, pageQuery);
return R.ok(result);
}
/**
* 成本模块首页概览
* 统计当前「现存且未发货」钢卷的总成本、总净重、总毛重以及平均在库天数
*/
@GetMapping("/overview")
public R<Map<String, Object>> overview() {
Map<String, Object> result = iCostCoilDailyService.queryOverview();
return R.ok(result);
}
}

View File

@@ -0,0 +1,108 @@
package com.klp.controller;
import java.util.List;
import java.util.Arrays;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import com.klp.common.annotation.RepeatSubmit;
import com.klp.common.annotation.Log;
import com.klp.common.core.controller.BaseController;
import com.klp.common.core.domain.PageQuery;
import com.klp.common.core.domain.R;
import com.klp.common.core.validate.AddGroup;
import com.klp.common.core.validate.EditGroup;
import com.klp.common.enums.BusinessType;
import com.klp.common.utils.poi.ExcelUtil;
import com.klp.domain.vo.CostStandardConfigVo;
import com.klp.domain.bo.CostStandardConfigBo;
import com.klp.service.ICostStandardConfigService;
import com.klp.common.core.page.TableDataInfo;
/**
* 成本标准配置表
*
* @author klp
* @date 2025-11-25
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/wms/cost/standard")
public class CostStandardConfigController extends BaseController {
private final ICostStandardConfigService iCostStandardConfigService;
/**
* 查询成本标准配置表列表
*/
@GetMapping("/list")
public TableDataInfo<CostStandardConfigVo> list(CostStandardConfigBo bo, PageQuery pageQuery) {
return iCostStandardConfigService.queryPageList(bo, pageQuery);
}
/**
* 导出成本标准配置表列表
*/
@Log(title = "成本标准配置表", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(CostStandardConfigBo bo, HttpServletResponse response) {
List<CostStandardConfigVo> list = iCostStandardConfigService.queryList(bo);
ExcelUtil.exportExcel(list, "成本标准配置表", CostStandardConfigVo.class, response);
}
/**
* 获取成本标准配置表详细信息
*
* @param configId 主键
*/
@GetMapping("/{configId}")
public R<CostStandardConfigVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long configId) {
return R.ok(iCostStandardConfigService.queryById(configId));
}
/**
* 查询当前有效的成本标准
*/
@GetMapping("/current")
public R<CostStandardConfigVo> getCurrent() {
return R.ok(iCostStandardConfigService.queryCurrentEffective());
}
/**
* 新增成本标准配置表
*/
@Log(title = "成本标准配置表", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody CostStandardConfigBo bo) {
return toAjax(iCostStandardConfigService.insertByBo(bo));
}
/**
* 修改成本标准配置表
*/
@Log(title = "成本标准配置表", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody CostStandardConfigBo bo) {
return toAjax(iCostStandardConfigService.updateByBo(bo));
}
/**
* 删除成本标准配置表
*
* @param configIds 主键串
*/
@Log(title = "成本标准配置表", businessType = BusinessType.DELETE)
@DeleteMapping("/{configIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] configIds) {
return toAjax(iCostStandardConfigService.deleteWithValidByIds(Arrays.asList(configIds), true));
}
}