From 009901d5ee87c695fbccf052d1387754c145fb2c Mon Sep 17 00:00:00 2001 From: wenshijun Date: Mon, 2 Feb 2026 18:10:54 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0bigdecimal=E5=BA=8F=E5=88=97?= =?UTF-8?q?=E5=8F=B7=20=E6=B7=BB=E5=8A=A0=E7=A7=BB=E5=BA=93=E5=8D=95?= =?UTF-8?q?=E5=90=91=E5=88=97=E8=A1=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/AutoInventoryController.java | 36 ++-- .../InventoryMatchScanController.java | 18 +- .../service/InventoryMatchScanService.java | 3 +- .../impl/InventoryMatchScanServiceImpl.java | 34 ++-- .../Task/controller/StatisticsController.java | 20 +-- .../wisdom/config/BigDecimalSerializer.java | 22 +++ .../wisdom/controller/RkInfoController.java | 11 ++ .../wisdom/controller/RkRecordController.java | 7 - .../com/zg/project/wisdom/domain/GysJh.java | 5 + .../zg/project/wisdom/domain/MoveRecord.java | 30 ++-- .../com/zg/project/wisdom/domain/RkInfo.java | 7 + .../zg/project/wisdom/domain/RkRecord.java | 12 +- .../wisdom/domain/vo/AuditSignatureVo.java | 3 + .../domain/vo/GysJhUndeliveredSummaryVO.java | 3 + .../project/wisdom/domain/vo/HomeKpiVO.java | 4 + .../project/wisdom/domain/vo/PlanToMtdVO.java | 3 + .../domain/vo/StockStatisticGroupVO.java | 4 + .../wisdom/domain/vo/StockStatisticVO.java | 3 + .../wisdom/mapper/MoveRecordMapper.java | 17 ++ .../project/wisdom/mapper/RkInfoMapper.java | 47 ++++++ .../project/wisdom/mapper/RkRecordMapper.java | 10 -- .../wisdom/service/IRkInfoService.java | 29 ++++ .../wisdom/service/IRkRecordService.java | 2 - .../service/impl/MoveRecordServiceImpl.java | 60 ++++--- .../service/impl/RkBillServiceImpl.java | 1 + .../service/impl/RkInfoServiceImpl.java | 158 ++++++++++++++++++ .../service/impl/RkRecordServiceImpl.java | 8 - .../zg/project/wisdom/utils/DecimalUtil.java | 43 +++++ .../InventoryMatchScanMapper.xml | 61 +++++++ .../mybatis/wisdom/MoveRecordMapper.xml | 32 ++++ .../resources/mybatis/wisdom/RkInfoMapper.xml | 111 ++++++++++++ .../mybatis/wisdom/RkRecordMapper.xml | 51 +----- 32 files changed, 692 insertions(+), 163 deletions(-) create mode 100644 src/main/java/com/zg/project/wisdom/config/BigDecimalSerializer.java create mode 100644 src/main/java/com/zg/project/wisdom/utils/DecimalUtil.java diff --git a/src/main/java/com/zg/project/inventory/AutoInventory/controller/AutoInventoryController.java b/src/main/java/com/zg/project/inventory/AutoInventory/controller/AutoInventoryController.java index 76bd7f2..7193d97 100644 --- a/src/main/java/com/zg/project/inventory/AutoInventory/controller/AutoInventoryController.java +++ b/src/main/java/com/zg/project/inventory/AutoInventory/controller/AutoInventoryController.java @@ -68,28 +68,28 @@ public class AutoInventoryController extends BaseController { /** * 开始匹配 */ -// @PostMapping("/match") -// @ApiOperation("开始匹配") -// public AjaxResult match(@RequestBody QueryDTO dto) { -// // 停止盘点 -// rfidService.stopScan(dto.getDeviceId()); -// -// dto.setScanType(1); -// -// rkInfoService.matchWithStatus(dto); -// -// return AjaxResult.success(); -// } + @PostMapping("/match") + @ApiOperation("开始匹配") + public AjaxResult match(@RequestBody QueryDTO dto) { + // 停止盘点 + rfidService.stopScan(dto.getDeviceId()); + + dto.setScanType(1); + + rkInfoService.matchWithStatus(dto); + + return AjaxResult.success(); + } /** * 匹配后图表统计 */ -// @PostMapping("/chart") -// @ApiOperation("匹配后图表统计") -// public AjaxResult chart(@RequestBody QueryDTO dto) { -// ChartDataVO vo = rkInfoService.matchWithAll(dto); -// return AjaxResult.success(vo); -// } + @PostMapping("/chart") + @ApiOperation("匹配后图表统计") + public AjaxResult chart(@RequestBody QueryDTO dto) { + ChartDataVO vo = rkInfoService.matchWithAll(dto); + return AjaxResult.success(vo); + } /** diff --git a/src/main/java/com/zg/project/inventory/AutoInventory/controller/InventoryMatchScanController.java b/src/main/java/com/zg/project/inventory/AutoInventory/controller/InventoryMatchScanController.java index 5f8ef82..57df19e 100644 --- a/src/main/java/com/zg/project/inventory/AutoInventory/controller/InventoryMatchScanController.java +++ b/src/main/java/com/zg/project/inventory/AutoInventory/controller/InventoryMatchScanController.java @@ -50,15 +50,15 @@ public class InventoryMatchScanController extends BaseController { * @param matchScan * @return */ -// @GetMapping("/countList") -// public TableDataInfo countList(InventoryMatchScan matchScan) { -// // 开启分页 -// startPage(); -// // 调用 service 层查询数据 -// List list = inventoryMatchScanService.selectMatchScanCountList(matchScan); -// // 返回分页后的结果 -// return getDataTable(list); -// } + @GetMapping("/countList") + public TableDataInfo countList(InventoryMatchScan matchScan) { + // 开启分页 + startPage(); + // 调用 service 层查询数据 + List list = inventoryMatchScanService.selectMatchScanCountList(matchScan); + // 返回分页后的结果 + return getDataTable(list); + } /** diff --git a/src/main/java/com/zg/project/inventory/AutoInventory/service/InventoryMatchScanService.java b/src/main/java/com/zg/project/inventory/AutoInventory/service/InventoryMatchScanService.java index e826552..09724c0 100644 --- a/src/main/java/com/zg/project/inventory/AutoInventory/service/InventoryMatchScanService.java +++ b/src/main/java/com/zg/project/inventory/AutoInventory/service/InventoryMatchScanService.java @@ -19,5 +19,6 @@ public interface InventoryMatchScanService { List selectInventoryMatchScanList(InventoryMatchScan matchScan); -// List selectMatchScanCountList(InventoryMatchScan matchScan); + List selectMatchScanCountList(InventoryMatchScan matchScan); + } diff --git a/src/main/java/com/zg/project/inventory/AutoInventory/service/impl/InventoryMatchScanServiceImpl.java b/src/main/java/com/zg/project/inventory/AutoInventory/service/impl/InventoryMatchScanServiceImpl.java index d6225eb..e074b10 100644 --- a/src/main/java/com/zg/project/inventory/AutoInventory/service/impl/InventoryMatchScanServiceImpl.java +++ b/src/main/java/com/zg/project/inventory/AutoInventory/service/impl/InventoryMatchScanServiceImpl.java @@ -56,22 +56,22 @@ public class InventoryMatchScanServiceImpl implements InventoryMatchScanService return mapper.selectInventoryMatchScanList(matchScan); } -// @Override -// public List selectMatchScanCountList(InventoryMatchScan param) { -// // 状态=2:只查扫描表中的数据 -// if ("2".equals(param.getStatus())) { -// return mapper.selectOnlyFromMatchScan(param); -// } -// // 状态=1:查询指定仓库下未被扫描的库位 -// else if ("1".equals(param.getStatus())) { -// // ✅ 根据任务ID取 sceneId,再按 scene 查询“未被扫描”的库位 -// String sceneId = taskMapper.getSceneByTaskId(param.getTaskId()); -// return rkInfoMapper.getUnscannedPcodeByScene(sceneId, param.getTaskId()); -// } -// // 其它情况:返回扫描表和库存表的关联数据 -// else { -// return mapper.selectJoinRkInfo(param); -// } -// } + @Override + public List selectMatchScanCountList(InventoryMatchScan param) { + // 状态=2:只查扫描表中的数据 + if ("2".equals(param.getStatus())) { + return mapper.selectOnlyFromMatchScan(param); + } + // 状态=1:查询指定仓库下未被扫描的库位 + else if ("1".equals(param.getStatus())) { + // ✅ 根据任务ID取 sceneId,再按 scene 查询“未被扫描”的库位 + String sceneId = taskMapper.getSceneByTaskId(param.getTaskId()); + return rkInfoMapper.getUnscannedPcodeByScene(sceneId, param.getTaskId()); + } + // 其它情况:返回扫描表和库存表的关联数据 + else { + return mapper.selectJoinRkInfo(param); + } + } } diff --git a/src/main/java/com/zg/project/inventory/Task/controller/StatisticsController.java b/src/main/java/com/zg/project/inventory/Task/controller/StatisticsController.java index ee09b6d..0435620 100644 --- a/src/main/java/com/zg/project/inventory/Task/controller/StatisticsController.java +++ b/src/main/java/com/zg/project/inventory/Task/controller/StatisticsController.java @@ -22,14 +22,14 @@ public class StatisticsController extends BaseController { * @param taskId * @return */ -// @GetMapping("/count") -// public AjaxResult conuntGetByTaskId(@RequestParam("taskId") String taskId) -// { -// -// String warehouse = taskService.getWhByTaskId(taskId); -// -// int count = rkInfoService.countGetByWh(warehouse); -// -// return AjaxResult.success(count); -// } + @GetMapping("/count") + public AjaxResult conuntGetByTaskId(@RequestParam("taskId") String taskId) + { + + String warehouse = taskService.getWhByTaskId(taskId); + + int count = rkInfoService.countGetByWh(warehouse); + + return AjaxResult.success(count); + } } diff --git a/src/main/java/com/zg/project/wisdom/config/BigDecimalSerializer.java b/src/main/java/com/zg/project/wisdom/config/BigDecimalSerializer.java new file mode 100644 index 0000000..3d19225 --- /dev/null +++ b/src/main/java/com/zg/project/wisdom/config/BigDecimalSerializer.java @@ -0,0 +1,22 @@ +package com.zg.project.wisdom.config; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; + +import java.io.IOException; +import java.math.BigDecimal; + +public class BigDecimalSerializer extends JsonSerializer { + + @Override + public void serialize(BigDecimal value, JsonGenerator gen, SerializerProvider serializers) + throws IOException { + if (value == null) { + gen.writeNull(); + } else { + // 保持数字类型,不带引号,不补0、不截断 + gen.writeNumber(value.stripTrailingZeros().toPlainString()); + } + } +} diff --git a/src/main/java/com/zg/project/wisdom/controller/RkInfoController.java b/src/main/java/com/zg/project/wisdom/controller/RkInfoController.java index 667eebf..3772482 100644 --- a/src/main/java/com/zg/project/wisdom/controller/RkInfoController.java +++ b/src/main/java/com/zg/project/wisdom/controller/RkInfoController.java @@ -113,4 +113,15 @@ public class RkInfoController extends BaseController return AjaxResult.success(stockStatistic); } + /** + * + * @param pcode + * @return + */ + @GetMapping("/pcode/{pcode}") + public AjaxResult listRkInfoByPcode(@PathVariable String pcode) { + List rows = rkInfoService.listRkInfoByPcode(pcode); + return AjaxResult.success(rows); + } + } diff --git a/src/main/java/com/zg/project/wisdom/controller/RkRecordController.java b/src/main/java/com/zg/project/wisdom/controller/RkRecordController.java index cb6521d..cff8e01 100644 --- a/src/main/java/com/zg/project/wisdom/controller/RkRecordController.java +++ b/src/main/java/com/zg/project/wisdom/controller/RkRecordController.java @@ -165,13 +165,6 @@ public class RkRecordController extends BaseController return toAjax(rkRecordService.deletePreOutRecords(ids)); } - /** - * 出入库统计(同时返回) - */ - @PostMapping("/statistic") - public AjaxResult statistic(@RequestBody RkRecord query) { - return AjaxResult.success(rkRecordService.getRecordStatistic(query)); - } /** * 出入库统计,返回总数 */ diff --git a/src/main/java/com/zg/project/wisdom/domain/GysJh.java b/src/main/java/com/zg/project/wisdom/domain/GysJh.java index a14b55a..54afa86 100644 --- a/src/main/java/com/zg/project/wisdom/domain/GysJh.java +++ b/src/main/java/com/zg/project/wisdom/domain/GysJh.java @@ -4,6 +4,8 @@ import java.math.BigDecimal; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.zg.project.wisdom.config.BigDecimalSerializer; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import com.zg.framework.aspectj.lang.annotation.Excel; @@ -73,6 +75,7 @@ public class GysJh extends BaseEntity /** 合同数量 */ @Excel(name = "合同数量") + @JsonSerialize(using = BigDecimalSerializer.class) private BigDecimal htQty; /** SAP订单编号 */ @@ -81,10 +84,12 @@ public class GysJh extends BaseEntity /** 计划交货数量 */ @Excel(name = "计划交货数量") + @JsonSerialize(using = BigDecimalSerializer.class) private BigDecimal jhQty; /** 已入库数量(累计) */ @Excel(name = "已入库数量") + @JsonSerialize(using = BigDecimalSerializer.class) private BigDecimal realQty; /** diff --git a/src/main/java/com/zg/project/wisdom/domain/MoveRecord.java b/src/main/java/com/zg/project/wisdom/domain/MoveRecord.java index 7816323..bc801cb 100644 --- a/src/main/java/com/zg/project/wisdom/domain/MoveRecord.java +++ b/src/main/java/com/zg/project/wisdom/domain/MoveRecord.java @@ -1,7 +1,9 @@ package com.zg.project.wisdom.domain; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import com.zg.framework.web.domain.BaseEntity; import com.zg.framework.aspectj.lang.annotation.Excel; +import com.zg.project.wisdom.config.BigDecimalSerializer; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; @@ -10,9 +12,6 @@ import java.util.Date; /** * 移库记录对象 move_record - * - * @author zg - * @date 2025-06-20 */ public class MoveRecord extends BaseEntity { @@ -27,12 +26,16 @@ public class MoveRecord extends BaseEntity { /** 移库生成的新库存ID(rk_info.id,用于撤销移库) */ private Long newRkInfoId; + /** ================= 新增:上级移库记录ID ================= */ + private Long parentMoveId; + /** 实物ID */ @Excel(name = "实物ID") private String entityId; /** 实际移库数量 */ @Excel(name = "移库数量") + @JsonSerialize(using = BigDecimalSerializer.class) private BigDecimal realQty; /** 原仓库 */ @@ -70,7 +73,7 @@ public class MoveRecord extends BaseEntity { @Excel(name = "操作人名称") private String movedByName; - /** 操作时间(移库时间) */ + /** 操作时间 */ @Excel(name = "操作时间", dateFormat = "yyyy-MM-dd HH:mm:ss") private Date movedAt; @@ -104,6 +107,14 @@ public class MoveRecord extends BaseEntity { // ==================== Getter / Setter ==================== + public Long getParentMoveId() { + return parentMoveId; + } + + public void setParentMoveId(Long parentMoveId) { + this.parentMoveId = parentMoveId; + } + public Long getId() { return id; } @@ -286,6 +297,7 @@ public class MoveRecord extends BaseEntity { .append("id", getId()) .append("rkInfoId", getRkInfoId()) .append("newRkInfoId", getNewRkInfoId()) + .append("parentMoveId", getParentMoveId()) .append("entityId", getEntityId()) .append("realQty", getRealQty()) .append("fromCangku", getFromCangku()) @@ -298,17 +310,7 @@ public class MoveRecord extends BaseEntity { .append("movedBy", getMovedBy()) .append("movedByName", getMovedByName()) .append("movedAt", getMovedAt()) - .append("createBy", getCreateBy()) - .append("createTime", getCreateTime()) - .append("updateBy", getUpdateBy()) - .append("updateTime", getUpdateTime()) .append("isDelete", getIsDelete()) - .append("fromCangkuName", getFromCangkuName()) - .append("toCangkuName", getToCangkuName()) - .append("xmNo", getXmNo()) - .append("xmMs", getXmMs()) - .append("wlMs", getWlMs()) - .append("gysMc", getGysMc()) .toString(); } } diff --git a/src/main/java/com/zg/project/wisdom/domain/RkInfo.java b/src/main/java/com/zg/project/wisdom/domain/RkInfo.java index 92fa01f..62bc93b 100644 --- a/src/main/java/com/zg/project/wisdom/domain/RkInfo.java +++ b/src/main/java/com/zg/project/wisdom/domain/RkInfo.java @@ -3,6 +3,8 @@ package com.zg.project.wisdom.domain; import java.math.BigDecimal; import java.util.Date; import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.zg.project.wisdom.config.BigDecimalSerializer; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import com.zg.framework.aspectj.lang.annotation.Excel; @@ -127,10 +129,12 @@ public class RkInfo extends BaseEntity /** 计划交货金额 */ @Excel(name = "计划交货金额") + @JsonSerialize(using = BigDecimalSerializer.class) private BigDecimal jhAmt; /** 合同单价 */ @Excel(name = "合同单价") + @JsonSerialize(using = BigDecimalSerializer.class) private BigDecimal htDj; /** SAP订单编号 */ @@ -143,10 +147,12 @@ public class RkInfo extends BaseEntity /** 计划交货数量 */ @Excel(name = "计划交货数量") + @JsonSerialize(using = BigDecimalSerializer.class) private BigDecimal jhQty; /** 合同数量 */ @Excel(name = "合同数量") + @JsonSerialize(using = BigDecimalSerializer.class) private BigDecimal htQty; /** 计量单位 */ @@ -155,6 +161,7 @@ public class RkInfo extends BaseEntity /** 实际入库数量 */ @Excel(name = "实际入库数量") + @JsonSerialize(using = BigDecimalSerializer.class) private BigDecimal realQty; /** 库位码 */ diff --git a/src/main/java/com/zg/project/wisdom/domain/RkRecord.java b/src/main/java/com/zg/project/wisdom/domain/RkRecord.java index 4a077ef..b847660 100644 --- a/src/main/java/com/zg/project/wisdom/domain/RkRecord.java +++ b/src/main/java/com/zg/project/wisdom/domain/RkRecord.java @@ -5,6 +5,8 @@ import java.util.Date; import java.util.List; import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.zg.project.wisdom.config.BigDecimalSerializer; import org.apache.commons.lang3.builder.ToStringBuilder; import org.apache.commons.lang3.builder.ToStringStyle; import com.zg.framework.aspectj.lang.annotation.Excel; @@ -142,10 +144,12 @@ public class RkRecord extends BaseEntity /** 计划交货金额 */ @Excel(name = "计划交货金额") + @JsonSerialize(using = BigDecimalSerializer.class) private BigDecimal jhAmt; /** 合同单价 */ @Excel(name = "合同单价") + @JsonSerialize(using = BigDecimalSerializer.class) private BigDecimal htDj; /** SAP订单编号 */ @@ -158,10 +162,12 @@ public class RkRecord extends BaseEntity /** 计划交货数量 */ @Excel(name = "计划交货数量") + @JsonSerialize(using = BigDecimalSerializer.class) private BigDecimal jhQty; /** 合同数量 */ @Excel(name = "合同数量") + @JsonSerialize(using = BigDecimalSerializer.class) private BigDecimal htQty; /** 计量单位 */ @@ -169,7 +175,8 @@ public class RkRecord extends BaseEntity private String dw; /** 实际入库数量 */ - @Excel(name = "实际入库数量") + @Excel(name = "实际出/入库数量") + @JsonSerialize(using = BigDecimalSerializer.class) private BigDecimal realQty; /** 库位码 */ @@ -227,9 +234,8 @@ public class RkRecord extends BaseEntity private Long sid; /** 是否需要配送(0否,1是,2配送中,3配送完成) */ - @Excel(name = "是否需要配送(0否,1是,2配送中,3配送完成)") + @Excel(name = "是否需要配送", readConverterExp = "0=否,1=是,2=配送中,3=配送完成") private String isDelivery; - /** 封样编号1 */ // @Excel(name = "封样编号1") private String fycde1; diff --git a/src/main/java/com/zg/project/wisdom/domain/vo/AuditSignatureVo.java b/src/main/java/com/zg/project/wisdom/domain/vo/AuditSignatureVo.java index 7a8643f..9c06d20 100644 --- a/src/main/java/com/zg/project/wisdom/domain/vo/AuditSignatureVo.java +++ b/src/main/java/com/zg/project/wisdom/domain/vo/AuditSignatureVo.java @@ -1,5 +1,7 @@ package com.zg.project.wisdom.domain.vo; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.zg.project.wisdom.config.BigDecimalSerializer; import com.zg.project.wisdom.domain.AuditSignature; import lombok.Data; import lombok.EqualsAndHashCode; @@ -29,6 +31,7 @@ public class AuditSignatureVo extends AuditSignature { private String wlNo; /** 实际入库数量 */ + @JsonSerialize(using = BigDecimalSerializer.class) private BigDecimal realQty; /** 计量单位 */ diff --git a/src/main/java/com/zg/project/wisdom/domain/vo/GysJhUndeliveredSummaryVO.java b/src/main/java/com/zg/project/wisdom/domain/vo/GysJhUndeliveredSummaryVO.java index c4875ce..db7bf4c 100644 --- a/src/main/java/com/zg/project/wisdom/domain/vo/GysJhUndeliveredSummaryVO.java +++ b/src/main/java/com/zg/project/wisdom/domain/vo/GysJhUndeliveredSummaryVO.java @@ -1,6 +1,8 @@ // com.zg.project.wisdom.domain.vo.GysJhUndeliveredSummaryVO package com.zg.project.wisdom.domain.vo; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.zg.project.wisdom.config.BigDecimalSerializer; import lombok.Data; import java.math.BigDecimal; @@ -14,5 +16,6 @@ public class GysJhUndeliveredSummaryVO { /** 总数量(jh_qty 合计,表示剩余未到数量) */ private Long totalQty; /** 总金额(ht_dj * jh_qty 合计) */ + @JsonSerialize(using = BigDecimalSerializer.class) private BigDecimal amountPlan; } diff --git a/src/main/java/com/zg/project/wisdom/domain/vo/HomeKpiVO.java b/src/main/java/com/zg/project/wisdom/domain/vo/HomeKpiVO.java index 2000cdf..2f28f12 100644 --- a/src/main/java/com/zg/project/wisdom/domain/vo/HomeKpiVO.java +++ b/src/main/java/com/zg/project/wisdom/domain/vo/HomeKpiVO.java @@ -1,5 +1,7 @@ package com.zg.project.wisdom.domain.vo; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.zg.project.wisdom.config.BigDecimalSerializer; import lombok.Data; import java.math.BigDecimal; @@ -17,6 +19,7 @@ public class HomeKpiVO { private Integer monthInProjectCount; /** 月入库金额 */ + @JsonSerialize(using = BigDecimalSerializer.class) private BigDecimal monthInAmount; /** 月出库条数 */ @@ -26,5 +29,6 @@ public class HomeKpiVO { private Integer monthOutProjectCount; /** 月出库金额 */ + @JsonSerialize(using = BigDecimalSerializer.class) private BigDecimal monthOutAmount; } diff --git a/src/main/java/com/zg/project/wisdom/domain/vo/PlanToMtdVO.java b/src/main/java/com/zg/project/wisdom/domain/vo/PlanToMtdVO.java index bbf63ba..117350b 100644 --- a/src/main/java/com/zg/project/wisdom/domain/vo/PlanToMtdVO.java +++ b/src/main/java/com/zg/project/wisdom/domain/vo/PlanToMtdVO.java @@ -1,5 +1,7 @@ package com.zg.project.wisdom.domain.vo; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.zg.project.wisdom.config.BigDecimalSerializer; import lombok.Data; import java.math.BigDecimal; @@ -8,6 +10,7 @@ public class PlanToMtdVO { private String wlNo; // 物料号 private String wlMs; // 物料描述 private String dw; // 单位 + @JsonSerialize(using = BigDecimalSerializer.class) private BigDecimal htDj; // 合同单价 } \ No newline at end of file diff --git a/src/main/java/com/zg/project/wisdom/domain/vo/StockStatisticGroupVO.java b/src/main/java/com/zg/project/wisdom/domain/vo/StockStatisticGroupVO.java index 7641543..54d6158 100644 --- a/src/main/java/com/zg/project/wisdom/domain/vo/StockStatisticGroupVO.java +++ b/src/main/java/com/zg/project/wisdom/domain/vo/StockStatisticGroupVO.java @@ -1,5 +1,7 @@ package com.zg.project.wisdom.domain.vo; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.zg.project.wisdom.config.BigDecimalSerializer; import lombok.Data; import java.math.BigDecimal; @@ -14,12 +16,14 @@ public class StockStatisticGroupVO { private String groupValue; /** 总金额 */ + @JsonSerialize(using = BigDecimalSerializer.class) private BigDecimal totalAmount; /** 使用库位数 */ private Integer locationCount; /** 总数量 */ + @JsonSerialize(using = BigDecimalSerializer.class) private BigDecimal totalQuantity; /** 项目数(去重 xm_no) */ diff --git a/src/main/java/com/zg/project/wisdom/domain/vo/StockStatisticVO.java b/src/main/java/com/zg/project/wisdom/domain/vo/StockStatisticVO.java index 0e040e5..4d1ba45 100644 --- a/src/main/java/com/zg/project/wisdom/domain/vo/StockStatisticVO.java +++ b/src/main/java/com/zg/project/wisdom/domain/vo/StockStatisticVO.java @@ -1,5 +1,7 @@ package com.zg.project.wisdom.domain.vo; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.zg.project.wisdom.config.BigDecimalSerializer; import lombok.Data; import java.math.BigDecimal; @@ -14,6 +16,7 @@ public class StockStatisticVO { private Integer locationCount; /** 库存总数量 */ + @JsonSerialize(using = BigDecimalSerializer.class) private BigDecimal totalQuantity; /** 项目总数(去重 xm_no) */ diff --git a/src/main/java/com/zg/project/wisdom/mapper/MoveRecordMapper.java b/src/main/java/com/zg/project/wisdom/mapper/MoveRecordMapper.java index ca7d123..ea39ed4 100644 --- a/src/main/java/com/zg/project/wisdom/mapper/MoveRecordMapper.java +++ b/src/main/java/com/zg/project/wisdom/mapper/MoveRecordMapper.java @@ -59,4 +59,21 @@ public interface MoveRecordMapper * @return 结果 */ void insertMoveRecord(MoveRecord moveRecord); + + /** + * 根据入库信息id查询移库记录id + * + * @param rkInfoId 入库信息id + * @return 移库记录id + */ + Long selectLastMoveIdByRkInfoId(Long rkInfoId); + + /** + * 根据移库记录id查询子移库记录数量 + * + * @param moveRecordId 移库记录id + * @return 子移库记录数量 + */ + int countByParentMoveId(Long moveRecordId); + } diff --git a/src/main/java/com/zg/project/wisdom/mapper/RkInfoMapper.java b/src/main/java/com/zg/project/wisdom/mapper/RkInfoMapper.java index d0f4d59..3030f7d 100644 --- a/src/main/java/com/zg/project/wisdom/mapper/RkInfoMapper.java +++ b/src/main/java/com/zg/project/wisdom/mapper/RkInfoMapper.java @@ -3,6 +3,9 @@ package com.zg.project.wisdom.mapper; import java.math.BigDecimal; import java.util.Date; import java.util.List; + +import com.zg.project.inventory.domain.vo.PcdeCntVO; +import com.zg.project.inventory.domain.vo.RkInfoMatchVO; import com.zg.project.wisdom.domain.RkInfo; import com.zg.project.wisdom.domain.vo.StockStatisticVO; import io.lettuce.core.dynamic.annotation.Param; @@ -108,4 +111,48 @@ public interface RkInfoMapper */ StockStatisticVO selectStockStatisticByCondition(RkInfo query); + /** + * 1️⃣ 正常匹配的数据 + * 扫描到 & 当前库存中 & 属于当前场景 + */ + List getByPcodeIdList(@Param("list") List pcdeIds, + @Param("sceneId") String sceneId); + + /** + * 2️⃣ 未盘点的数据 + * 当前库存中 & 未出现在扫描结果中 + */ + List getMissedPcodeIds(@Param("list") List pcdeIds, + @Param("sceneId") String sceneId); + + /** + * 3️⃣ 异常数据(批量) + * 扫描到,但在当前库存中不存在 + */ + List getNotExistsPcodeIds(@Param("list") List pcdeIds, + @Param("sceneId") String sceneId); + + /** + * 图表统计:每个库位有多少个货物 + * @param ids + * @return + */ + List selectPcdeCntFromRkInfo(List ids); + + /** + * 根据所属仓库查询所有的库位号和库位对应的货物数量 + * @param + * @return + */ + List getUnscannedPcodeByScene(@org.apache.ibatis.annotations.Param("sceneId") String sceneId, + @org.apache.ibatis.annotations.Param("taskId") String taskId); + + /** + * 获取指定仓库的盘点数据 + * @param warehouse + * @return + */ + int countGetByWh(@org.apache.ibatis.annotations.Param("warehouse") String warehouse); + + List listRkInfoByPcode(String pcode); } diff --git a/src/main/java/com/zg/project/wisdom/mapper/RkRecordMapper.java b/src/main/java/com/zg/project/wisdom/mapper/RkRecordMapper.java index ad4c0a2..c3f0d27 100644 --- a/src/main/java/com/zg/project/wisdom/mapper/RkRecordMapper.java +++ b/src/main/java/com/zg/project/wisdom/mapper/RkRecordMapper.java @@ -123,15 +123,6 @@ public interface RkRecordMapper */ RkRecord selectRkRecordByRkInfoId(@Param("rkInfoId") Long rkInfoId); - /** - * 入库统计 - */ - StockStatisticVO selectInRecordStatistic(RkRecord query); - - /** - * 出库统计 - */ - StockStatisticVO selectOutRecordStatistic(RkRecord query); /** * 借出入库 @@ -154,5 +145,4 @@ public interface RkRecordMapper * */ StockStatisticVO selectRecordStatisticByCondition(RkRecord query); - } diff --git a/src/main/java/com/zg/project/wisdom/service/IRkInfoService.java b/src/main/java/com/zg/project/wisdom/service/IRkInfoService.java index 589cfe3..1fccaaa 100644 --- a/src/main/java/com/zg/project/wisdom/service/IRkInfoService.java +++ b/src/main/java/com/zg/project/wisdom/service/IRkInfoService.java @@ -1,6 +1,9 @@ package com.zg.project.wisdom.service; import java.util.List; + +import com.zg.project.inventory.domain.dto.QueryDTO; +import com.zg.project.inventory.domain.vo.ChartDataVO; import com.zg.project.wisdom.domain.RkInfo; import com.zg.project.wisdom.domain.vo.StockStatisticVO; @@ -66,5 +69,31 @@ public interface IRkInfoService StockStatisticVO getStockStatistic(RkInfo query); + /** + * 盘点开始匹配 + * @param dto + * @return + */ + void matchWithStatus(QueryDTO dto); + /** + * 图表统计:每个库位有多少个货物 + * @param dto + * @return + */ + ChartDataVO matchWithAll(QueryDTO dto); + + /** + * 统计指定仓库的库存数量 + * @param warehouse + * @return + */ + int countGetByWh(String warehouse); + + /** + * 按库位查询货物数量 + * @param pcode + * @return + */ + List listRkInfoByPcode(String pcode); } diff --git a/src/main/java/com/zg/project/wisdom/service/IRkRecordService.java b/src/main/java/com/zg/project/wisdom/service/IRkRecordService.java index 33fcfdd..52226c6 100644 --- a/src/main/java/com/zg/project/wisdom/service/IRkRecordService.java +++ b/src/main/java/com/zg/project/wisdom/service/IRkRecordService.java @@ -93,8 +93,6 @@ public interface IRkRecordService */ int deletePreOutRecords(Long[] ids); - - RecordStatisticVO getRecordStatistic(RkRecord query); /** * 出入库总数统计 */ diff --git a/src/main/java/com/zg/project/wisdom/service/impl/MoveRecordServiceImpl.java b/src/main/java/com/zg/project/wisdom/service/impl/MoveRecordServiceImpl.java index 2f69a85..b5f3e7b 100644 --- a/src/main/java/com/zg/project/wisdom/service/impl/MoveRecordServiceImpl.java +++ b/src/main/java/com/zg/project/wisdom/service/impl/MoveRecordServiceImpl.java @@ -120,7 +120,6 @@ public class MoveRecordServiceImpl implements IMoveRecordService @Transactional(rollbackFor = Exception.class) public void processMove(MoveRequestDTO dto) { - /* ====================== 0. 基础校验 ====================== */ if (dto == null || dto.getFromRkId() == null) { throw new ServiceException("原库存ID不能为空"); } @@ -151,16 +150,18 @@ public class MoveRecordServiceImpl implements IMoveRecordService String userId = String.valueOf(SecurityUtils.getUserId()); Date now = DateUtils.getNowDate(); - /* ====================== 3. 原库存快照 ====================== */ + /* ====================== 3. 查询上一条移库记录 ====================== */ + Long lastMoveId = moveRecordMapper.selectLastMoveIdByRkInfoId(dto.getFromRkId()); + + /* ====================== 4. 原库存快照 ====================== */ RkInfo snapshot = new RkInfo(); BeanUtils.copyProperties(original, snapshot); - /* ====================== 4. 全量移库(不拆分) ====================== */ + /* ====================== 5. 全量移库 ====================== */ if (dto.getTargets().size() == 1 && moveTotalQty.compareTo(originQty) == 0) { MoveTargetItem target = dto.getTargets().get(0); - // 4.1 更新原库存(仅换库位) original.setCangku(target.getToCangku()); original.setPcode(target.getToPcode()); original.setTrayCode(target.getToTrayCode()); @@ -169,10 +170,13 @@ public class MoveRecordServiceImpl implements IMoveRecordService original.setUpdateTime(now); rkInfoMapper.updateRkInfo(original); - // 4.2 移库流水(全量移库,无新库存) MoveRecord record = new MoveRecord(); record.setRkInfoId(snapshot.getId()); - record.setNewRkInfoId(null); // ✅ 关键:全量移库没有新库存 + record.setNewRkInfoId(null); + + // ★★ 新增关键 ★★ + record.setParentMoveId(lastMoveId); + record.setEntityId(snapshot.getEntityId()); record.setRealQty(originQty); @@ -198,16 +202,14 @@ public class MoveRecordServiceImpl implements IMoveRecordService return; } - /* ====================== 5. 部分移库(拆分库存) ====================== */ + /* ====================== 6. 部分移库 ====================== */ - // 5.1 原库存扣减数量 original.setRealQty(originQty.subtract(moveTotalQty)); original.setHasMoved("1"); original.setUpdateBy(userId); original.setUpdateTime(now); rkInfoMapper.updateRkInfo(original); - // 5.2 生成新库存 + 移库流水 for (MoveTargetItem target : dto.getTargets()) { /* ---------- 新库存 ---------- */ @@ -227,10 +229,14 @@ public class MoveRecordServiceImpl implements IMoveRecordService rkInfoMapper.insertRkInfo(newInfo); - /* ---------- 移库流水(重点) ---------- */ + /* ---------- 移库流水 ---------- */ MoveRecord record = new MoveRecord(); - record.setRkInfoId(snapshot.getId()); // 原库存 - record.setNewRkInfoId(newInfo.getId()); // ✅ 关键:新库存ID + record.setRkInfoId(snapshot.getId()); + record.setNewRkInfoId(newInfo.getId()); + + // ★★ 新增关键 ★★ + record.setParentMoveId(lastMoveId); + record.setEntityId(snapshot.getEntityId()); record.setRealQty(target.getRealQty()); @@ -273,10 +279,16 @@ public class MoveRecordServiceImpl implements IMoveRecordService throw new ServiceException("移库记录不存在或已撤销"); } + /* ====================== 2. 关键:校验是否有子移库 ====================== */ + int childCount = moveRecordMapper.countByParentMoveId(moveRecordId); + if (childCount > 0) { + throw new ServiceException("该移库已产生后续移库,请先撤销后续移库"); + } + Long originRkInfoId = record.getRkInfoId(); Long newRkInfoId = record.getNewRkInfoId(); - /* ====================== 2. 查询原库存 ====================== */ + /* ====================== 3. 查询原库存 ====================== */ RkInfo origin = rkInfoMapper.selectRkInfoById(originRkInfoId); if (origin == null || "1".equals(origin.getIsDelete())) { throw new ServiceException("原库存不存在或已删除,无法撤销"); @@ -285,12 +297,11 @@ public class MoveRecordServiceImpl implements IMoveRecordService String userId = String.valueOf(SecurityUtils.getUserId()); Date now = DateUtils.getNowDate(); - /* ====================== 3. 分情况处理 ====================== */ + /* ====================== 4. 分情况处理 ====================== */ - // ---------- 情况一:全量移库 ---------- + // -------- 全量移库 -------- if (newRkInfoId == null) { - // 回滚库位 origin.setCangku(record.getFromCangku()); origin.setPcode(record.getFromPcode()); origin.setTrayCode(record.getFromTrayCode()); @@ -299,25 +310,31 @@ public class MoveRecordServiceImpl implements IMoveRecordService origin.setUpdateTime(now); rkInfoMapper.updateRkInfo(origin); + } - // ---------- 情况二:部分移库 ---------- + // -------- 部分移库 -------- else { - /* 3.1 原库存回补数量 */ BigDecimal qty = record.getRealQty(); if (qty == null || qty.compareTo(BigDecimal.ZERO) <= 0) { throw new ServiceException("移库数量异常,无法撤销"); } + // 回补数量 origin.setRealQty(origin.getRealQty().add(qty)); + + // 恢复位置 + origin.setCangku(record.getFromCangku()); + origin.setPcode(record.getFromPcode()); + origin.setTrayCode(record.getFromTrayCode()); + origin.setHasMoved("0"); origin.setUpdateBy(userId); origin.setUpdateTime(now); - origin.setHasMoved("0"); rkInfoMapper.updateRkInfo(origin); - /* 3.2 删除移库生成的新库存 */ + // 删除新库存 RkInfo newInfo = rkInfoMapper.selectRkInfoById(newRkInfoId); if (newInfo != null && !"1".equals(newInfo.getIsDelete())) { newInfo.setIsDelete("1"); @@ -327,10 +344,11 @@ public class MoveRecordServiceImpl implements IMoveRecordService } } - /* ====================== 4. 标记移库记录已撤销 ====================== */ + /* ====================== 5. 标记移库记录已撤销 ====================== */ record.setIsDelete("1"); record.setUpdateBy(userId); record.setUpdateTime(now); moveRecordMapper.updateMoveRecord(record); } + } diff --git a/src/main/java/com/zg/project/wisdom/service/impl/RkBillServiceImpl.java b/src/main/java/com/zg/project/wisdom/service/impl/RkBillServiceImpl.java index cc84721..709dcfe 100644 --- a/src/main/java/com/zg/project/wisdom/service/impl/RkBillServiceImpl.java +++ b/src/main/java/com/zg/project/wisdom/service/impl/RkBillServiceImpl.java @@ -598,6 +598,7 @@ public class RkBillServiceImpl implements IRkBillService record.setOperationTime(bill.getOperationTime()); record.setOperator(bill.getOperator()); record.setTeamCode(bill.getTeamCode()); + record.setIsDelivery(bill.getIsDelivery()); /* ================== ✅ 关键修复 ================== */ // 仓库必须来源于【库存快照】,而不是 bill diff --git a/src/main/java/com/zg/project/wisdom/service/impl/RkInfoServiceImpl.java b/src/main/java/com/zg/project/wisdom/service/impl/RkInfoServiceImpl.java index 13dc81a..9140d91 100644 --- a/src/main/java/com/zg/project/wisdom/service/impl/RkInfoServiceImpl.java +++ b/src/main/java/com/zg/project/wisdom/service/impl/RkInfoServiceImpl.java @@ -1,7 +1,21 @@ package com.zg.project.wisdom.service.impl; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; import java.util.List; +import java.util.stream.Collectors; + +import com.zg.common.exception.ServiceException; import com.zg.common.utils.DateUtils; +import com.zg.common.utils.StringUtils; +import com.zg.project.inventory.AutoInventory.mapper.InventoryMatchScanMapper; +import com.zg.project.inventory.Task.mapper.InventoryTaskMapper; +import com.zg.project.inventory.domain.dto.QueryDTO; +import com.zg.project.inventory.domain.entity.InventoryMatchScan; +import com.zg.project.inventory.domain.vo.ChartDataVO; +import com.zg.project.inventory.domain.vo.PcdeCntVO; import com.zg.project.wisdom.domain.vo.StockStatisticVO; import com.zg.project.wisdom.mapper.RkRecordMapper; import org.springframework.beans.factory.annotation.Autowired; @@ -26,6 +40,12 @@ public class RkInfoServiceImpl implements IRkInfoService @Autowired private RkRecordMapper rkRecordMapper; + @Autowired + private InventoryTaskMapper taskMapper; + + @Autowired + private InventoryMatchScanMapper matchScanMapper; + /** * 查询库存单据明细 * @@ -112,4 +132,142 @@ public class RkInfoServiceImpl implements IRkInfoService public StockStatisticVO getStockStatistic(RkInfo query) { return rkInfoMapper.selectStockStatisticByCondition(query); } + + @Override + @Transactional(rollbackFor = Exception.class) + public void matchWithStatus(QueryDTO dto) { + + /* ================== 1. 基础参数校验 ================== */ + + List pcdeIds = dto.getIds(); + if (pcdeIds == null || pcdeIds.isEmpty()) { + return; + } + + String taskId = dto.getTaskId(); + String sceneId = taskMapper.selectSceneIdById(taskId); + if (sceneId == null || sceneId.trim().isEmpty()) { + throw new ServiceException("匹配失败:缺少场景ID"); + } + + int scanType = dto.getScanType() != null ? dto.getScanType() : 0; + String deviceId = dto.getDeviceId(); + + if (scanType == 1 && StringUtils.isBlank(deviceId)) { + throw new ServiceException("自动盘点必须传递设备ID"); + } + + /* ================== 2. 三类盘点数据匹配 ================== */ + + // 1️⃣ 正常:扫描到 & 当前库存存在 + List matchedAll = + rkInfoMapper.getByPcodeIdList(pcdeIds, sceneId); + matchedAll.forEach(r -> r.setStatus("0")); + + // 2️⃣ 未盘:库存中存在但未扫描 + List missedAll = + rkInfoMapper.getMissedPcodeIds(pcdeIds, sceneId); + missedAll.forEach(r -> r.setStatus("1")); + + // 3️⃣ 异常:扫描到但库存中不存在(批量) + List errorIds = + rkInfoMapper.getNotExistsPcodeIds(pcdeIds, sceneId); + + List errorAll = errorIds.stream().map(id -> { + RkInfo r = new RkInfo(); + r.setPcodeId(id); + r.setStatus("2"); + return r; + }).collect(Collectors.toList()); + + /* ================== 3. 扫描结果落库 ================== */ + + String tmeStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + List toSave = new ArrayList<>(); + + for (RkInfo r : matchedAll) { + toSave.add(buildScanRecord(taskId, r.getPcode(), "0", deviceId, tmeStr, scanType)); + } + + for (RkInfo r : missedAll) { + toSave.add(buildScanRecord(taskId, r.getPcode(), "1", deviceId, tmeStr, scanType)); + } + + for (RkInfo r : errorAll) { + toSave.add(buildScanRecord(taskId, r.getPcodeId(), "2", deviceId, tmeStr, scanType)); + } + + if (!toSave.isEmpty()) { + matchScanMapper.insertBatch(toSave); + } + + /* ================== 4. 更新任务状态 ================== */ + + taskMapper.updateStatus(taskId, "1"); + } + + /** + * 封装一个盘点扫描记录 + * + * @param taskId 任务 ID + * @param pcode 库位编码 ID + * @param status 盘点状态(0=匹配成功,1=未盘点,2=错误) + * @param deviceId 设备 ID(自动盘点时才有) + * @param tme 扫描时间 + * @param scanType 扫描类型(0=手动盘点,1=自动盘点) + * @return 封装好的 InventoryMatchScan 对象 + */ + private InventoryMatchScan buildScanRecord(String taskId, String pcode, String status, + String deviceId, String tme, int scanType) { + InventoryMatchScan record = new InventoryMatchScan(); + record.setPcode(pcode); + record.setTaskId(taskId); + record.setStatus(status); + + // 自动盘点时才保存设备 ID + if (scanType == 1 && deviceId != null) { + record.setDeviceId(deviceId); + } + + record.setTme(tme); + record.setScanType(scanType); + return record; + } + + /** + * 图表统计:每个库位有多少个货物 + * @param dto + * @return + */ + @Override + public ChartDataVO matchWithAll(QueryDTO dto) { + List ids = dto.getIds(); + if (ids == null || ids.isEmpty()) { + return new ChartDataVO(Collections.emptyList(), + Collections.emptyList(), + 0L); + } + + List rows = rkInfoMapper.selectPcdeCntFromRkInfo(ids); + + List pcdeList = new ArrayList<>(rows.size()); + List fycdeCntList = new ArrayList<>(rows.size()); + + for (PcdeCntVO r : rows) { + pcdeList.add(r.getPcde()); + fycdeCntList.add(r.getCnt()); + } + + return new ChartDataVO(pcdeList, fycdeCntList, (long) rows.size()); + } + + @Override + public int countGetByWh(String warehouse) { + return rkInfoMapper.countGetByWh(warehouse); + } + + @Override + public List listRkInfoByPcode(String pcode) { + return rkInfoMapper.listRkInfoByPcode(pcode); + } } diff --git a/src/main/java/com/zg/project/wisdom/service/impl/RkRecordServiceImpl.java b/src/main/java/com/zg/project/wisdom/service/impl/RkRecordServiceImpl.java index a22db47..40071b3 100644 --- a/src/main/java/com/zg/project/wisdom/service/impl/RkRecordServiceImpl.java +++ b/src/main/java/com/zg/project/wisdom/service/impl/RkRecordServiceImpl.java @@ -795,14 +795,6 @@ public class RkRecordServiceImpl implements IRkRecordService return deleteCount; } - @Override - public RecordStatisticVO getRecordStatistic(RkRecord query) { - - RecordStatisticVO vo = new RecordStatisticVO(); - vo.setInStatistic(rkRecordMapper.selectInRecordStatistic(query)); - vo.setOutStatistic(rkRecordMapper.selectOutRecordStatistic(query)); - return vo; - } @Override diff --git a/src/main/java/com/zg/project/wisdom/utils/DecimalUtil.java b/src/main/java/com/zg/project/wisdom/utils/DecimalUtil.java new file mode 100644 index 0000000..ae8bd17 --- /dev/null +++ b/src/main/java/com/zg/project/wisdom/utils/DecimalUtil.java @@ -0,0 +1,43 @@ +package com.zg.project.wisdom.utils; + +import java.math.BigDecimal; +import java.math.RoundingMode; + +public class DecimalUtil { + + private DecimalUtil() { + } + + /** + * 核心方法:去除多余小数 0,不补、不截 + * + * @param value BigDecimal + * @return String(用于返回给前端 / 导出 / 业务使用) + */ + public static String toPlain(BigDecimal value) { + if (value == null) { + return null; + } + return value.stripTrailingZeros().toPlainString(); + } + + /** + * 用于数值计算后再次规范化 + */ + public static BigDecimal normalize(BigDecimal value) { + if (value == null) { + return null; + } + return value.stripTrailingZeros(); + } + + /** + * 字符串安全转 BigDecimal(避免 double 精度问题) + */ + public static BigDecimal parse(String value) { + if (value == null || value.trim().isEmpty()) { + return null; + } + return new BigDecimal(value.trim()); + } +} diff --git a/src/main/resources/mybatis/Inventory/AutoInventory/InventoryMatchScanMapper.xml b/src/main/resources/mybatis/Inventory/AutoInventory/InventoryMatchScanMapper.xml index 5d97545..1bbc70c 100644 --- a/src/main/resources/mybatis/Inventory/AutoInventory/InventoryMatchScanMapper.xml +++ b/src/main/resources/mybatis/Inventory/AutoInventory/InventoryMatchScanMapper.xml @@ -4,6 +4,11 @@ + INSERT INTO inventory_match_scan (task_id, device_id, pcode, tme, scan_type, status) VALUES @@ -12,16 +17,33 @@ + + + + + + + + + + SELECT id + FROM move_record + WHERE new_rk_info_id = #{rkInfoId} + AND is_delete = '0' + ORDER BY create_time DESC + LIMIT 1 + + + + diff --git a/src/main/resources/mybatis/wisdom/RkInfoMapper.xml b/src/main/resources/mybatis/wisdom/RkInfoMapper.xml index 959a5c0..795561a 100644 --- a/src/main/resources/mybatis/wisdom/RkInfoMapper.xml +++ b/src/main/resources/mybatis/wisdom/RkInfoMapper.xml @@ -389,5 +389,116 @@ AND is_delete = '0' + + + + + + + + + + + + + + + + diff --git a/src/main/resources/mybatis/wisdom/RkRecordMapper.xml b/src/main/resources/mybatis/wisdom/RkRecordMapper.xml index 05f629a..1a5f011 100644 --- a/src/main/resources/mybatis/wisdom/RkRecordMapper.xml +++ b/src/main/resources/mybatis/wisdom/RkRecordMapper.xml @@ -590,70 +590,35 @@ COUNT(DISTINCT rr.pcode) AS locationCount, IFNULL(SUM(rr.real_qty), 0) AS totalQuantity FROM rk_record rr - - rr.is_delete = 0 - AND rr.exec_status = 1 - - - AND rr.operation_type IN - - #{it} - - - - AND rr.xm_no LIKE CONCAT('%', #{xmNo}, '%') - - - AND rr.wl_no LIKE CONCAT('%', #{wlNo}, '%') - - - AND rr.pcode LIKE CONCAT('%', #{pcode}, '%') - - - AND rr.cangku LIKE CONCAT('%', #{cangku}, '%') - - - AND rr.operation_time >= #{startDate} - - - AND rr.operation_time <= #{endDate} - - - - - -