package com.zy.asrs.controller; import com.baomidou.mybatisplus.plugins.Page; import com.core.annotations.ManagerAuth; import com.core.common.R; import com.zy.asrs.entity.MonthlySettle; import com.zy.asrs.entity.MonthlySettleDetail; import com.zy.asrs.entity.param.DateRangeParam; import com.zy.asrs.entity.param.MonthlySettleQueryParam; import com.zy.asrs.entity.result.MonthlySettleStatisticsVO; import com.zy.asrs.service.MonthlySettleService; import com.zy.common.web.BaseController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; @RestController public class MonthlySettleController extends BaseController { @Autowired private MonthlySettleService monthlySettleService; /** * 获取月结信息 */ @RequestMapping(value = "/monthlySettle/{id}/auth") @ManagerAuth public R get(@PathVariable("id") Long id) { return R.ok(monthlySettleService.selectById(id)); } /** * 分页查询月结列表 */ @RequestMapping(value = "/monthlySettle/list/auth") @ManagerAuth public R list(MonthlySettleQueryParam param) { Page page = new Page<>(param.getCurr(), param.getLimit()); java.util.Map condition = new java.util.HashMap<>(); if (param.getSettleNo() != null && !param.getSettleNo().trim().isEmpty()) { condition.put("settleNo", param.getSettleNo()); } if (param.getStatus() != null) { condition.put("status", param.getStatus()); } if (param.getStartDate() != null && !param.getStartDate().trim().isEmpty() && param.getEndDate() != null && !param.getEndDate().trim().isEmpty()) { condition.put("startDate", param.getStartDate()); condition.put("endDate", param.getEndDate()); } page.setCondition(condition); return R.ok(monthlySettleService.getPage(page)); } /** * 获取最近的月结记录 */ @RequestMapping(value = "/monthlySettle/latest/auth") @ManagerAuth public R getLatest() { MonthlySettle latest = monthlySettleService.getLatestSettle(); return R.ok(latest); } /** * 获取下一个月结的起始日期 */ @RequestMapping(value = "/monthlySettle/nextStartDate/auth") @ManagerAuth public R getNextStartDate() { Date nextStartDate = monthlySettleService.getNextStartDate(); if (nextStartDate != null) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); return R.ok(sdf.format(nextStartDate)); } return R.ok(null); } /** * 获取最晚月结记录的结束日期 */ @RequestMapping(value = "/monthlySettle/latestEndDate/auth") @ManagerAuth public R getLatestEndDate() { Date latestEndDate = monthlySettleService.getLatestEndDate(); if (latestEndDate != null) { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); return R.ok(sdf.format(latestEndDate)); } return R.ok(null); } /** * 检查月结时间范围内是否有未完成的订单 */ @RequestMapping(value = "/monthlySettle/checkUnfinished/auth") @ManagerAuth public R checkUnfinished(DateRangeParam param) { boolean hasUnfinished = monthlySettleService.hasUnfinishedOrders(param.getStartDate(), param.getEndDate()); if (hasUnfinished) { return R.error("月结时间范围内存在未完成的订单,无法进行月结"); } return R.ok(); } /** * 发起月结 */ @RequestMapping(value = "/monthlySettle/start/auth") @ManagerAuth public R startSettle(DateRangeParam param) { return R.ok(monthlySettleService.startSettle(param.getStartDate(), param.getEndDate(), getUserId())); } /** * 获取月结统计信息 */ @RequestMapping(value = "/monthlySettle/statistics/{id}/auth") @ManagerAuth public R getStatistics(@PathVariable("id") Long id) { return R.ok(monthlySettleService.getSettleStatistics(id)); } /** * 删除月结记录 */ @RequestMapping(value = "/monthlySettle/{id}/auth", method = RequestMethod.DELETE) @ManagerAuth public R delete(@PathVariable("id") Long id) { monthlySettleService.deleteSettle(id); return R.ok("删除成功"); } /** * 导出月结明细 */ @RequestMapping(value = "/monthlySettle/detail/export/{id}/auth") @ManagerAuth(memo = "导出月结明细") public R exportDetail(@PathVariable("id") Long id) { // 获取月结统计信息 MonthlySettleStatisticsVO statistics = monthlySettleService.getSettleStatistics(id); if (statistics == null) { return R.error("月结明细不存在"); } List details = statistics.getDetails() != null ? statistics.getDetails() : new ArrayList<>(); List detailFlows = statistics.getDetailFlows() != null ? statistics.getDetailFlows() : new ArrayList<>(); // 定义明细流水导出字段 List flowFields = new ArrayList<>(); flowFields.add("orderNo"); flowFields.add("orderTime"); flowFields.add("pakinPakoutStatusName"); flowFields.add("matnr"); flowFields.add("maktx"); flowFields.add("batch"); flowFields.add("brand"); flowFields.add("specs"); flowFields.add("qty"); flowFields.add("unit"); // 定义汇总导出字段 List summaryFields = new ArrayList<>(); summaryFields.add("matnr"); summaryFields.add("maktx"); summaryFields.add("batch"); summaryFields.add("brand"); summaryFields.add("beginningQty"); summaryFields.add("endingQty"); summaryFields.add("diffQty"); summaryFields.add("inQty"); summaryFields.add("outQty"); // 构建返回数据结构:第一页是明细流水,第二页是汇总 java.util.Map result = new java.util.HashMap<>(); result.put("detailFlows", exportSupport(detailFlows, flowFields)); result.put("details", exportSupport(details, summaryFields)); result.put("flowTitles", new String[]{"订单编号", "业务时间", "类型", "物料编码", "物料名称", "批次", "品牌", "规格", "数量", "单位"}); result.put("summaryTitles", new String[]{"物料编码", "物料名称", "批次", "品牌", "期初库存", "期末库存", "差异数量", "本期入库", "本期出库"}); return R.ok(result); } }