diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/controller/OutsideIvtController.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/controller/OutsideIvtController.java new file mode 100644 index 0000000..f5bf521 --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/controller/OutsideIvtController.java @@ -0,0 +1,115 @@ +package org.nl.wms.basedata_manage.controller; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.metadata.IPage; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.nl.common.base.TableDataInfo; +import org.nl.common.domain.query.PageQuery; +import org.nl.common.logging.annotation.Log; +import org.nl.wms.basedata_manage.service.IOutsideIvtService; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/outsideivt") +@Slf4j +public class OutsideIvtController { + + @Resource + private final IOutsideIvtService outsideIvtService; + + @GetMapping + @Log("查询库外库存") + public ResponseEntity query(@RequestParam Map whereJson, PageQuery page) { + IPage pageData = outsideIvtService.queryAll(whereJson, page); + TableDataInfo result = new TableDataInfo<>(pageData.getRecords(), pageData.getTotal()); + result.setCode(String.valueOf(HttpStatus.OK.value())); + result.setMsg("查询成功"); + return new ResponseEntity<>(result, HttpStatus.OK); + } + + @GetMapping("/summary") + @Log("查询库外库存汇总") + public ResponseEntity querySummary(@RequestParam Map whereJson) { + JSONObject summary = outsideIvtService.querySummary(whereJson); + List regionSummary = outsideIvtService.queryRegionSummary(whereJson); + List regionTransitSummary = outsideIvtService.queryRegionTransitSummary(whereJson); + summary.put("region_total_list", regionSummary.stream().map(item -> { + JSONObject row = new JSONObject(); + row.put("region_code", item.getString("region_code")); + row.put("region_name", item.getString("region_name")); + row.put("value", item.getBigDecimal("total_qty")); + return row; + }).collect(Collectors.toList())); + summary.put("region_transit_list", regionTransitSummary.stream().map(item -> { + JSONObject row = new JSONObject(); + row.put("region_code", item.getString("region_code")); + row.put("region_name", item.getString("region_name")); + row.put("value", item.getBigDecimal("total_qty")); + return row; + }).collect(Collectors.toList())); + return new ResponseEntity<>(summary, HttpStatus.OK); + } + + @GetMapping(value = "/download", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) + @Log("导出库外库存") + public void download(@RequestParam Map whereJson, HttpServletResponse response) { + String[] headers = {"点位编码", "点位名称", "区域", "物料编码", "物料名称", "批次", "载具号", "重量", "计量单位"}; + List rows = outsideIvtService.queryAll(whereJson); + try (Workbook workbook = new XSSFWorkbook()) { + Sheet sheet = workbook.createSheet("库外库存"); + Row header = sheet.createRow(0); + for (int i = 0; i < headers.length; i++) { + Cell cell = header.createCell(i); + cell.setCellValue(headers[i]); + sheet.setColumnWidth(i, 18 * 256); + } + + for (int i = 0; i < rows.size(); i++) { + JSONObject item = rows.get(i); + Row row = sheet.createRow(i + 1); + row.createCell(0).setCellValue(getString(item, "point_code")); + row.createCell(1).setCellValue(getString(item, "point_name")); + row.createCell(2).setCellValue(getString(item, "region_name")); + row.createCell(3).setCellValue(getString(item, "material_code")); + row.createCell(4).setCellValue(getString(item, "material_name")); + row.createCell(5).setCellValue(getString(item, "batch_no")); + row.createCell(6).setCellValue(getString(item, "storagevehicle_code")); + row.createCell(7).setCellValue(item.getBigDecimal("weight") == null ? 0D : item.getBigDecimal("weight").doubleValue()); + row.createCell(8).setCellValue(getString(item, "qty_unit_name")); + } + + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + String fileName = URLEncoder.encode("库外库存.xlsx", StandardCharsets.UTF_8.name()).replace("+", "%20"); + response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + fileName); + workbook.write(response.getOutputStream()); + } catch (Exception e) { + log.error(">>> 导出库外库存失败:", e); + } + } + + private String getString(JSONObject item, String key) { + Object value = item.get(key); + return value == null ? "" : String.valueOf(value); + } +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/controller/StructIvtController.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/controller/StructIvtController.java index 998d67a..cc826b6 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/controller/StructIvtController.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/controller/StructIvtController.java @@ -1,13 +1,20 @@ package org.nl.wms.basedata_manage.controller; +import com.alibaba.fastjson.JSONObject; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.nl.common.base.TableDataInfo; import org.nl.common.domain.query.PageQuery; import org.nl.common.logging.annotation.Log; import org.nl.wms.basedata_manage.service.IMdPbStoragevehicleextService; import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; @@ -15,6 +22,10 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.List; import java.util.Map; @@ -40,4 +51,61 @@ public class StructIvtController { public ResponseEntity query(@RequestParam Map whereJson, PageQuery page) { return new ResponseEntity<>(TableDataInfo.build(iMdPbStoragevehicleextService.queryAll(whereJson, page)), HttpStatus.OK); } + + @GetMapping("/summary") + @Log("查询库存汇总") + public ResponseEntity querySummary(@RequestParam Map whereJson) { + return new ResponseEntity<>(iMdPbStoragevehicleextService.querySummary(whereJson), HttpStatus.OK); + } + + @GetMapping(value = "/download", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) + @Log("导出库存") + public void download(@RequestParam Map whereJson, HttpServletResponse response) { + String[] headers = {"仓位编码", "仓位名称", "仓库", "库区", "物料编码", "物料名称", "批次号", "载具号", "总数", "可用数", "冻结数", "计量单位", "备注", "入库时间", "供应商编码", "供应商名称"}; + List rows = iMdPbStoragevehicleextService.queryAll(whereJson); + try (Workbook workbook = new XSSFWorkbook()) { + Sheet sheet = workbook.createSheet("库内库存"); + Row header = sheet.createRow(0); + for (int i = 0; i < headers.length; i++) { + Cell cell = header.createCell(i); + cell.setCellValue(headers[i]); + sheet.setColumnWidth(i, 18 * 256); + } + + for (int i = 0; i < rows.size(); i++) { + JSONObject item = rows.get(i); + Row row = sheet.createRow(i + 1); + row.createCell(0).setCellValue(getString(item, "struct_code")); + row.createCell(1).setCellValue(getString(item, "struct_name")); + row.createCell(2).setCellValue(getString(item, "stor_name")); + row.createCell(3).setCellValue(getString(item, "sect_name")); + row.createCell(4).setCellValue(getString(item, "material_code")); + row.createCell(5).setCellValue(getString(item, "material_name")); + row.createCell(6).setCellValue(getString(item, "pcsn")); + row.createCell(7).setCellValue(getString(item, "storagevehicle_code")); + row.createCell(8).setCellValue(item.getBigDecimal("qty") == null ? 0D : item.getBigDecimal("qty").doubleValue()); + double qty = item.getBigDecimal("qty") == null ? 0D : item.getBigDecimal("qty").doubleValue(); + double frozenQty = item.getBigDecimal("frozen_qty") == null ? 0D : item.getBigDecimal("frozen_qty").doubleValue(); + row.createCell(9).setCellValue(qty - frozenQty); + row.createCell(10).setCellValue(frozenQty); + row.createCell(11).setCellValue(getString(item, "qty_unit_name")); + row.createCell(12).setCellValue(getString(item, "remark")); + row.createCell(13).setCellValue(getString(item, "create_time")); + row.createCell(14).setCellValue(getString(item, "supp_code")); + row.createCell(15).setCellValue(getString(item, "supp_name")); + } + + response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); + String fileName = URLEncoder.encode("库内库存.xlsx", StandardCharsets.UTF_8.name()).replace("+", "%20"); + response.setHeader("Content-Disposition", "attachment; filename*=UTF-8''" + fileName); + workbook.write(response.getOutputStream()); + } catch (Exception e) { + log.error(">>> 导出库存失败:", e); + } + } + + private String getString(JSONObject item, String key) { + Object value = item.get(key); + return value == null ? "" : String.valueOf(value); + } } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/IMdPbStoragevehicleextService.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/IMdPbStoragevehicleextService.java index 1c87e56..3fc5e2f 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/IMdPbStoragevehicleextService.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/IMdPbStoragevehicleextService.java @@ -27,4 +27,18 @@ public interface IMdPbStoragevehicleextService extends IService queryAll(Map whereJson, PageQuery page); + /** + * 列表查询,不分页 + * @param whereJson 查询条件 + * @return 列表 + */ + List queryAll(Map whereJson); + + /** + * 库存汇总查询 + * @param whereJson 查询条件 + * @return 汇总结果 + */ + JSONObject querySummary(Map whereJson); + } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/IOutsideIvtService.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/IOutsideIvtService.java new file mode 100644 index 0000000..49a0f0a --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/IOutsideIvtService.java @@ -0,0 +1,21 @@ +package org.nl.wms.basedata_manage.service; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.metadata.IPage; +import org.nl.common.domain.query.PageQuery; + +import java.util.List; +import java.util.Map; + +public interface IOutsideIvtService { + + IPage queryAll(Map whereJson, PageQuery page); + + List queryAll(Map whereJson); + + JSONObject querySummary(Map whereJson); + + List queryRegionSummary(Map whereJson); + + List queryRegionTransitSummary(Map whereJson); +} diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/MdPbStoragevehicleextMapper.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/MdPbStoragevehicleextMapper.java index 1ade3eb..c8aaf24 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/MdPbStoragevehicleextMapper.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/MdPbStoragevehicleextMapper.java @@ -60,6 +60,13 @@ public interface MdPbStoragevehicleextMapper extends BaseMapper queryAllByPage(Page page, @Param("param") Map whereJson); + /** + * 库存汇总 + * @param whereJson 查询条件 + * @return 汇总结果 + */ + JSONObject querySummary(@Param("param") Map whereJson); + /** * erp查询库存 * @param whereJson { diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/MdPbStoragevehicleextMapper.xml b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/MdPbStoragevehicleextMapper.xml index b8649cb..bbe4682 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/MdPbStoragevehicleextMapper.xml +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/dao/mapper/MdPbStoragevehicleextMapper.xml @@ -114,12 +114,73 @@ AND ext.pcsn LIKE #{param.pcsn} + + + AND + ext.storagevehicle_code LIKE CONCAT('%', #{param.storagevehicle_code}, '%') + AND 0 = (SELECT COUNT(*) FROM sch_base_task t WHERE t.task_status '5' AND t.is_delete = '0' AND (t.vehicle_code = ext.storagevehicle_code OR t.vehicle_code2 = ext.storagevehicle_code)) ORDER BY ext.create_time Desc + + + SELECT DISTINCT + ext.group_id AS storagevehicleext_id, + p.point_code, + p.point_name, + p.region_code, + p.region_name, + mater.material_code, + mater.material_name, + ext.pcsn AS batch_no, + ext.storagevehicle_code, + ext.qty AS weight, + ext.qty AS qty, + ext.frozen_qty, + ext.qty_unit_name, + ext.create_time + FROM md_pb_groupplate ext + INNER JOIN sch_base_point p ON p.vehicle_code = ext.storagevehicle_code + INNER JOIN md_me_materialbase mater ON mater.material_id = ext.material_id + + + ORDER BY ext.create_time DESC + + + + + + + + + + diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/MdPbStoragevehicleextServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/MdPbStoragevehicleextServiceImpl.java index f35750f..e2104ae 100644 --- a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/MdPbStoragevehicleextServiceImpl.java +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/MdPbStoragevehicleextServiceImpl.java @@ -10,6 +10,7 @@ import org.nl.wms.basedata_manage.service.dao.MdPbStoragevehicleext; import org.nl.wms.basedata_manage.service.dao.mapper.MdPbStoragevehicleextMapper; import org.springframework.stereotype.Service; +import java.util.List; import java.util.Map; /** @@ -31,4 +32,14 @@ public class MdPbStoragevehicleextServiceImpl extends ServiceImpl queryAll(Map whereJson) { + return this.baseMapper.queryAll(whereJson); + } + + @Override + public JSONObject querySummary(Map whereJson) { + return this.baseMapper.querySummary(whereJson); + } + } diff --git a/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/OutsideIvtServiceImpl.java b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/OutsideIvtServiceImpl.java new file mode 100644 index 0000000..c3a0a2c --- /dev/null +++ b/lms/nladmin-system/nlsso-server/src/main/java/org/nl/wms/basedata_manage/service/impl/OutsideIvtServiceImpl.java @@ -0,0 +1,45 @@ +package org.nl.wms.basedata_manage.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import org.nl.common.domain.query.PageQuery; +import org.nl.wms.basedata_manage.service.IOutsideIvtService; +import org.nl.wms.basedata_manage.service.dao.mapper.OutsideIvtMapper; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; + +@Service +@RequiredArgsConstructor +public class OutsideIvtServiceImpl implements IOutsideIvtService { + + private final OutsideIvtMapper outsideIvtMapper; + + @Override + public IPage queryAll(Map whereJson, PageQuery page) { + return outsideIvtMapper.queryPage(new Page<>(page.getPage() + 1, page.getSize()), whereJson); + } + + @Override + public List queryAll(Map whereJson) { + return outsideIvtMapper.queryAll(whereJson); + } + + @Override + public JSONObject querySummary(Map whereJson) { + return outsideIvtMapper.querySummary(whereJson); + } + + @Override + public List queryRegionSummary(Map whereJson) { + return outsideIvtMapper.queryRegionSummary(whereJson); + } + + @Override + public List queryRegionTransitSummary(Map whereJson) { + return outsideIvtMapper.queryRegionTransitSummary(whereJson); + } +} diff --git a/lms/nladmin-ui/src/views/wms/statement/outsideivt/index.vue b/lms/nladmin-ui/src/views/wms/statement/outsideivt/index.vue new file mode 100644 index 0000000..a903cc1 --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/statement/outsideivt/index.vue @@ -0,0 +1,345 @@ + + + + + diff --git a/lms/nladmin-ui/src/views/wms/statement/outsideivt/outsideivt.js b/lms/nladmin-ui/src/views/wms/statement/outsideivt/outsideivt.js new file mode 100644 index 0000000..4e5d019 --- /dev/null +++ b/lms/nladmin-ui/src/views/wms/statement/outsideivt/outsideivt.js @@ -0,0 +1,34 @@ +import request from '@/utils/request' + +export function getSummary(params) { + return request({ + url: 'api/outsideivt/summary', + method: 'get', + params + }) +} + +export default { + add(data) { + return request({ + url: 'api/outsideivt', + method: 'post', + data + }) + }, + edit(data) { + return request({ + url: 'api/outsideivt', + method: 'put', + data + }) + }, + del(ids) { + return request({ + url: 'api/outsideivt/', + method: 'delete', + data: ids + }) + }, + getSummary +} diff --git a/lms/nladmin-ui/src/views/wms/statement/structivt/index.vue b/lms/nladmin-ui/src/views/wms/statement/structivt/index.vue index fb40073..4b4f0c0 100644 --- a/lms/nladmin-ui/src/views/wms/statement/structivt/index.vue +++ b/lms/nladmin-ui/src/views/wms/statement/structivt/index.vue @@ -2,6 +2,20 @@
+
+
+
总库存
+
{{ formatNum(summary.total_qty) }} KG
+
+
+
可用库存
+
{{ formatNum(summary.available_qty) }} KG
+
+
+
冻结库存
+
{{ formatNum(summary.frozen_qty) }} KG
+
+
+ + +
- + 导出 + - + @@ -137,7 +161,15 @@ export default { return { sects: [], permission: {}, - rules: {} + rules: {}, + exportLoading: false, + summary: { + total_qty: 0, + available_qty: 0, + frozen_qty: 0, + vehicle_count: 0, + material_count: 0 + } } }, created() { @@ -148,8 +180,26 @@ export default { methods: { // 钩子:在获取表格数据之前执行,false 则代表不获取数据 [CRUD.HOOK.beforeRefresh]() { + this.fetchSummary() return true }, + formatNum(value) { + const num = Number(value || 0) + return num.toFixed(3).replace(/\.?0+$/, '') + }, + fetchSummary() { + crudStructivt.getSummary(this.query).then(res => { + this.summary = Object.assign({}, this.summary, res || {}) + }).catch(() => { + this.summary = { + total_qty: 0, + available_qty: 0, + frozen_qty: 0, + vehicle_count: 0, + material_count: 0 + } + }) + }, hand(value) { this.crud.toQuery() }, @@ -172,20 +222,62 @@ export default { this.crud.toQuery() }, downdtl() { - if (this.currentRow !== null) { - this.showDtlLoading = true - download('/api/structivt/download', this.crud.query).then(result => { - downloadFile(result, '成品库存', 'xlsx') - this.showDtlLoading = false - }).catch(() => { - this.showDtlLoading = false - }) - } + this.exportLoading = true + download('/api/structivt/download', this.crud.query).then(result => { + downloadFile(result, '库内库存', 'xlsx') + this.exportLoading = false + }).catch(() => { + this.exportLoading = false + }) } } } diff --git a/lms/nladmin-ui/src/views/wms/statement/structivt/structivt.js b/lms/nladmin-ui/src/views/wms/statement/structivt/structivt.js index 52927a9..6a845e5 100644 --- a/lms/nladmin-ui/src/views/wms/statement/structivt/structivt.js +++ b/lms/nladmin-ui/src/views/wms/statement/structivt/structivt.js @@ -62,4 +62,12 @@ export function excelImport(data) { }) } -export default { add, edit, del, getStruct, getStructById, getUnits, save, excelImport } +export function getSummary(params) { + return request({ + url: 'api/structivt/summary', + method: 'get', + params + }) +} + +export default { add, edit, del, getStruct, getStructById, getUnits, save, excelImport, getSummary }