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 0819ca0..19f4409 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 @@ -55,11 +55,15 @@ public class InventoryMatchScanController extends BaseController { */ @GetMapping("/countList") public TableDataInfo countList(InventoryMatchScan matchScan) { + // 开启分页 startPage(); + // 调用 service 层查询数据 List list = inventoryMatchScanService.selectMatchScanCountList(matchScan); + // 返回分页后的结果 return getDataTable(list); } + /** * 根据任务名称分页查询盘点结果 * @param dto 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 efd4dd5..d5bcc92 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 @@ -60,12 +60,17 @@ public class InventoryMatchScanServiceImpl implements InventoryMatchScanService @Override public List selectMatchScanCountList(InventoryMatchScan param) { + // 状态=2:只查扫描表中的数据 if ("2".equals(param.getStatus())) { return mapper.selectOnlyFromMatchScan(param); - } else if ("1".equals(param.getStatus())) { - String wh = taskMapper.getWhByTaskId(param.getTaskId()); + } + // 状态=1:查询指定仓库下未被扫描的库位 + else if ("1".equals(param.getStatus())) { + String wh = taskMapper.getWhByTaskId(param.getTaskId()); // 根据任务ID获取仓库ID return rkInfoMapper.getUnscannedPcodeByWh(wh, param.getTaskId()); - } else { + } + // 其它情况:返回扫描表和库存表的关联数据 + else { return mapper.selectJoinRkInfo(param); } } diff --git a/src/main/java/com/zg/project/Inventory/HdInventory/HdInventoryController.java b/src/main/java/com/zg/project/Inventory/HdInventory/HdInventoryController.java index 6808b85..c9c8712 100644 --- a/src/main/java/com/zg/project/Inventory/HdInventory/HdInventoryController.java +++ b/src/main/java/com/zg/project/Inventory/HdInventory/HdInventoryController.java @@ -19,7 +19,7 @@ public class HdInventoryController { @Autowired private IRkInfoService rkInfoService; - @ApiModelProperty("盘点对比") + @ApiModelProperty("开始匹配") @PostMapping("/match") public AjaxResult match(@RequestBody QueryDTO dto) { diff --git a/src/main/java/com/zg/project/Inventory/Task/mapper/InventoryTaskMapper.java b/src/main/java/com/zg/project/Inventory/Task/mapper/InventoryTaskMapper.java index 23e0c40..98fc512 100644 --- a/src/main/java/com/zg/project/Inventory/Task/mapper/InventoryTaskMapper.java +++ b/src/main/java/com/zg/project/Inventory/Task/mapper/InventoryTaskMapper.java @@ -80,4 +80,11 @@ public interface InventoryTaskMapper * @param status */ void updateStatus(@Param("taskId") String taskId, @Param("status") String status); + + /** + * 根据任务ID查询场景ID + * @param taskId + * @return + */ + String selectSceneIdById(String taskId); } 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 71aab25..c5e9adb 100644 --- a/src/main/java/com/zg/project/wisdom/controller/RkInfoController.java +++ b/src/main/java/com/zg/project/wisdom/controller/RkInfoController.java @@ -1,6 +1,5 @@ package com.zg.project.wisdom.controller; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -8,7 +7,7 @@ import javax.servlet.http.HttpServletResponse; import com.github.pagehelper.PageHelper; import com.zg.project.wisdom.domain.dto.*; -import com.zg.project.wisdom.domain.vo.BillGroupVO; +import com.zg.project.wisdom.domain.vo.PcodeQtyVO; import io.swagger.annotations.ApiOperation; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; @@ -39,7 +38,7 @@ public class RkInfoController extends BaseController /** * 查询出库,借料,待审批,撤销出入库单据主列表 */ - @PreAuthorize("@ss.hasPermi('wisdom:stock:list')") +// @PreAuthorize("@ss.hasPermi('wisdom:stock:list')") @PostMapping("/list") public TableDataInfo list(@RequestBody RkInfoQueryDTO rkInfo) { PageHelper.startPage(rkInfo.getPageNum(), rkInfo.getPageSize()); @@ -47,6 +46,14 @@ public class RkInfoController extends BaseController return getDataTable(list); } +// @PreAuthorize("@ss.hasPermi('wisdom:stock:stat')") + @GetMapping("/pcode/{pcode}") + public AjaxResult listRkInfoByPcode(@PathVariable String pcode) { + List rows = rkInfoService.listRkInfoByPcode(pcode); + return AjaxResult.success(rows); + } + + @ApiOperation("按单据分组(bill_no)列表:若存在出库则同时返回 bill_no_ck") @PreAuthorize("@ss.hasPermi('wisdom:stock:list')") @PostMapping("/bill/groups") diff --git a/src/main/java/com/zg/project/wisdom/domain/vo/PcodeQtyVO.java b/src/main/java/com/zg/project/wisdom/domain/vo/PcodeQtyVO.java new file mode 100644 index 0000000..5ef7d0f --- /dev/null +++ b/src/main/java/com/zg/project/wisdom/domain/vo/PcodeQtyVO.java @@ -0,0 +1,14 @@ +// vo/PcodeQtyVO.java +package com.zg.project.wisdom.domain.vo; + +import java.math.BigDecimal; +import lombok.Data; + +@Data +public class PcodeQtyVO { + /** 库位码 */ + private String pcode; + + /** 在库总数量(real_qty 之和) */ + private BigDecimal totalQty; +} 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 0d4966f..d4621ae 100644 --- a/src/main/java/com/zg/project/wisdom/mapper/RkInfoMapper.java +++ b/src/main/java/com/zg/project/wisdom/mapper/RkInfoMapper.java @@ -1,14 +1,12 @@ package com.zg.project.wisdom.mapper; -import java.util.ArrayList; import java.util.List; -import java.util.Map; 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.StockPhoto; import com.zg.project.wisdom.domain.dto.RkInfoQueryDTO; +import com.zg.project.wisdom.domain.vo.PcodeQtyVO; import org.apache.ibatis.annotations.Param; /** @@ -129,25 +127,22 @@ public interface RkInfoMapper int cancelStockOut(String billNoCk); /** - * 查看盘点扫描正常数据 - * @param pcdeIds - * @return + * 查看盘点扫描正常数据(限定场景) */ - List getByPcodeIdList(List pcdeIds); + List getByPcodeIdList(@Param("list") List pcdeIds, + @Param("sceneId") String sceneId); /** - * 盘点扫描未正常数据 - * @param pcdeIds - * @return + * 查看盘点扫描未正常数据(限定场景) */ - List getMissedPcodeIds(List pcdeIds); + List getMissedPcodeIds(@Param("list") List pcdeIds, + @Param("sceneId") String sceneId); /** - * 判断盘点扫描的id是否存在 - * @param id - * @return + * 判断盘点扫描的id在场景内是否存在 */ - int existsByPcodeId(String id); + int existsByPcodeId(@Param("pcodeId") String pcodeId, + @Param("sceneId") String sceneId); /** * 获取指定仓库的盘点数据 @@ -223,4 +218,7 @@ public interface RkInfoMapper * @return */ List selectRkInfoByIds(@Param("ids") Long[] ids); + + List listRkInfoByPcode(String pcode); + } 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 33f9f5b..13b3755 100644 --- a/src/main/java/com/zg/project/wisdom/service/IRkInfoService.java +++ b/src/main/java/com/zg/project/wisdom/service/IRkInfoService.java @@ -6,7 +6,7 @@ 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.dto.*; -import com.zg.project.wisdom.domain.vo.BillGroupVO; +import com.zg.project.wisdom.domain.vo.PcodeQtyVO; /** * 库存单据主Service接口 @@ -148,4 +148,11 @@ public interface IRkInfoService */ void revertByIds(Long[] ids); + /** + * 按库位查询货物数量 + * @param pcode + * @return + */ + List listRkInfoByPcode(String pcode); + } 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 c7aca90..487e6c5 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 @@ -22,6 +22,7 @@ import com.zg.project.system.service.ISysConfigService; import com.zg.project.wisdom.domain.AuditSignature; import com.zg.project.wisdom.domain.GysJh; import com.zg.project.wisdom.domain.dto.*; +import com.zg.project.wisdom.domain.vo.PcodeQtyVO; import com.zg.project.wisdom.mapper.AuditSignatureMapper; import com.zg.project.wisdom.mapper.GysJhMapper; import com.zg.project.wisdom.utils.BillNoUtil; @@ -737,32 +738,18 @@ public class RkInfoServiceImpl implements IRkInfoService } @Override + @Transactional(rollbackFor = Exception.class) public void matchWithStatus(QueryDTO dto) { List pcdeIds = dto.getIds(); if (pcdeIds == null || pcdeIds.isEmpty()) return; - // 一、三类匹配数据 - List matchedAll = rkInfoMapper.getByPcodeIdList(pcdeIds); - matchedAll.forEach(r -> r.setStatus("0")); + // 场景ID:优先取 DTO;没有就通过任务查 + String sceneId = taskMapper.selectSceneIdById(dto.getTaskId()); + if (sceneId == null || sceneId.trim().isEmpty()) { + throw new ServiceException("匹配失败:缺少场景ID"); + } - List missedAll = rkInfoMapper.getMissedPcodeIds(pcdeIds); - missedAll.forEach(r -> r.setStatus("1")); - - List errorIds = pcdeIds.stream() - .filter(id -> rkInfoMapper.existsByPcodeId(id) == 0) - .collect(Collectors.toList()); - - List errorAll = errorIds.stream() - .map(id -> { - RkInfo r = new RkInfo(); - r.setPcodeId(id); - r.setStatus("2"); - return r; - }) - .collect(Collectors.toList()); - - // 二、封装入库记录 - String tmeStr = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); + // 自动盘点必须要设备ID String deviceId = dto.getDeviceId(); int scanType = dto.getScanType() != null ? dto.getScanType() : 0; String taskId = dto.getTaskId(); @@ -771,7 +758,28 @@ public class RkInfoServiceImpl implements IRkInfoService throw new ServiceException("自动盘点必须传递设备ID"); } + // 三类数据(限定在 sceneId 内) + List matchedAll = rkInfoMapper.getByPcodeIdList(pcdeIds, sceneId); + matchedAll.forEach(r -> r.setStatus("0")); + + List missedAll = rkInfoMapper.getMissedPcodeIds(pcdeIds, sceneId); + missedAll.forEach(r -> r.setStatus("1")); + + List errorIds = pcdeIds.stream() + .filter(id -> rkInfoMapper.existsByPcodeId(id, sceneId) == 0) + .collect(Collectors.toList()); + + List errorAll = errorIds.stream().map(id -> { + RkInfo r = new RkInfo(); + r.setPcodeId(id); + r.setStatus("2"); + return r; + }).collect(Collectors.toList()); + + // 统一落表 + 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.getPcodeId(), "0", deviceId, tmeStr, scanType)); } @@ -786,7 +794,9 @@ public class RkInfoServiceImpl implements IRkInfoService matchScanMapper.insertBatch(toSave); } - taskMapper.updateStatus(taskId, "1"); + if (taskId != null && !taskId.trim().isEmpty()) { + taskMapper.updateStatus(taskId, "1"); // 已完成 + } } private InventoryMatchScan buildScanRecord(String taskId, String pcode, String status, @@ -935,4 +945,9 @@ public class RkInfoServiceImpl implements IRkInfoService } } + @Override + public List listRkInfoByPcode(String pcode) { + return rkInfoMapper.listRkInfoByPcode(pcode); + } + } diff --git a/src/main/resources/mybatis/Inventory/AutoInventory/InventoryMatchScanMapper.xml b/src/main/resources/mybatis/Inventory/AutoInventory/InventoryMatchScanMapper.xml index 4851544..e244560 100644 --- a/src/main/resources/mybatis/Inventory/AutoInventory/InventoryMatchScanMapper.xml +++ b/src/main/resources/mybatis/Inventory/AutoInventory/InventoryMatchScanMapper.xml @@ -196,22 +196,20 @@ parameterType="InventoryMatchScan" resultType="com.zg.project.Inventory.domain.vo.RkInfoMatchVO"> SELECT - r.pcode AS rkPcode, - r.real_qty AS realQty + r.pcode AS rkPcode, + COALESCE(SUM(r.real_qty), 0) AS realQty + FROM rk_info r + WHERE r.pcode_id IN ( + SELECT DISTINCT i.pcode FROM inventory_match_scan i - LEFT JOIN rk_info r ON i.pcode = r.pcode_id - - AND i.task_id = #{taskId} - - - AND i.device_id = #{deviceId} - - - AND i.status = #{status} - + AND i.task_id = #{taskId} + AND i.device_id = #{deviceId} + AND i.status = #{status} - ORDER BY i.tme DESC + ) + GROUP BY r.pcode + ORDER BY MAX(r.create_time) DESC diff --git a/src/main/resources/mybatis/Inventory/Task/InventoryTaskMapper.xml b/src/main/resources/mybatis/Inventory/Task/InventoryTaskMapper.xml index a54c6c8..d754284 100644 --- a/src/main/resources/mybatis/Inventory/Task/InventoryTaskMapper.xml +++ b/src/main/resources/mybatis/Inventory/Task/InventoryTaskMapper.xml @@ -85,6 +85,14 @@ where id = #{taskId} + + insert into inventory_task diff --git a/src/main/resources/mybatis/wisdom/RkInfoMapper.xml b/src/main/resources/mybatis/wisdom/RkInfoMapper.xml index 4289cf4..9cd330d 100644 --- a/src/main/resources/mybatis/wisdom/RkInfoMapper.xml +++ b/src/main/resources/mybatis/wisdom/RkInfoMapper.xml @@ -325,62 +325,59 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" --> - - SELECT ri.id, ri.rk_type, ri.wl_type, ri.cangku, ri.rk_time, ri.lihuo_y, ri.is_chuku, ri.bill_no, ri.bill_no_ck, @@ -611,40 +597,55 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" ri.ck_lihuo_y, ri.ck_type, ri.team_code, ri.ly_time, ri.ck_remark, ri.create_by, ri.create_time, ri.update_by, ri.update_time, ri.is_delete FROM rk_info ri + JOIN pcde_detail pd ON ri.pcode_id = pd.encoded_id WHERE ri.is_delete = '0' + AND pd.is_delete = '0' + AND ri.is_chuku = '0' + AND pd.scene = #{sceneId} AND ri.pcode_id IN #{id} - SELECT - id, rk_type, wl_type, cangku, rk_time, lihuo_y, - is_chuku, bill_no, bill_no_ck, - remark, xj, xm_no, xm_ms, wl_no, wl_ms, is_borrowed, - gys_no, gys_mc, jh_amt, ht_dj, sap_no, xh, - jh_qty, ht_qty, dw, real_qty, - pcode, pcode_id, tray_code, entity_id, - ck_lihuo_y, ck_type, team_code, ly_time, ck_remark, - create_by, create_time, update_by, update_time, is_delete - FROM rk_info - WHERE is_delete = '0' + ri.id, ri.rk_type, ri.wl_type, ri.cangku, ri.rk_time, ri.lihuo_y, + ri.is_chuku, ri.bill_no, ri.bill_no_ck, + ri.remark, ri.xj, ri.xm_no, ri.xm_ms, ri.wl_no, ri.wl_ms, ri.is_borrowed, + ri.gys_no, ri.gys_mc, ri.jh_amt, ri.ht_dj, ri.sap_no, ri.xh, + ri.jh_qty, ri.ht_qty, ri.dw, ri.real_qty, + ri.pcode, ri.pcode_id, ri.tray_code, ri.entity_id, + ri.ck_lihuo_y, ri.ck_type, ri.team_code, ri.ly_time, ri.ck_remark, + ri.create_by, ri.create_time, ri.update_by, ri.update_time, ri.is_delete + FROM rk_info ri + JOIN pcde_detail pd ON ri.pcode_id = pd.encoded_id + WHERE ri.is_delete = '0' + AND ri.is_chuku = '0' + AND pd.is_delete = '0' + AND pd.scene = #{sceneId} - AND pcode_id NOT IN + AND ri.pcode_id NOT IN #{id} - SELECT COUNT(1) - FROM rk_info - WHERE is_delete = '0' - AND pcode_id = #{pcodeId} + FROM rk_info ri + JOIN pcde_detail pd ON ri.pcode_id = pd.encoded_id + WHERE ri.is_delete = '0' + AND pd.is_delete = '0' + AND ri.is_chuku = '0' + AND ri.pcode_id = #{pcodeId} + AND pd.scene = #{sceneId} + + SELECT + t.*, + wh.warehouse_name AS cangku_name + FROM rk_info t + LEFT JOIN warehouse_info wh + ON wh.warehouse_code = t.cangku + WHERE t.is_delete = 0 + AND t.is_chuku = 0 + AND t.pcode = #{pcode} + ORDER BY t.rk_time DESC, t.id DESC + + \ No newline at end of file