From b0bbeeec7c1467bab108c0509cca1688db559e5a Mon Sep 17 00:00:00 2001 From: wenshijun Date: Thu, 25 Dec 2025 09:42:51 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=9F=E6=88=90=E5=87=BA=E5=85=A5=E5=BA=93?= =?UTF-8?q?=E5=8D=95=E6=8D=AE=E9=80=BB=E8=BE=91=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wisdom/controller/GysJhController.java | 3 +- .../wisdom/controller/RkInfoController.java | 19 +- .../com/zg/project/wisdom/domain/GysJh.java | 29 +- .../project/wisdom/mapper/RkInfoMapper.java | 4 +- .../wisdom/service/impl/GysJhServiceImpl.java | 12 +- .../service/impl/MoveRecordServiceImpl.java | 31 +- .../service/impl/RkInfoServiceImpl.java | 41 +- .../zg/project/wisdom/utils/BillNoUtil.java | 46 +- .../resources/mybatis/wisdom/RkInfoMapper.xml | 449 +++++++++--------- 9 files changed, 334 insertions(+), 300 deletions(-) diff --git a/src/main/java/com/zg/project/wisdom/controller/GysJhController.java b/src/main/java/com/zg/project/wisdom/controller/GysJhController.java index 5e122c9..6a86dd4 100644 --- a/src/main/java/com/zg/project/wisdom/controller/GysJhController.java +++ b/src/main/java/com/zg/project/wisdom/controller/GysJhController.java @@ -50,7 +50,7 @@ public class GysJhController extends BaseController * @param sapNo * @return */ - @PreAuthorize("@ss.hasPermi('plan:jh:list')") +// @PreAuthorize("@ss.hasPermi('plan:jh:list')") @GetMapping("/getBySapNo") public AjaxResult getBySapNo(String sapNo) { @@ -81,7 +81,6 @@ public class GysJhController extends BaseController ExcelUtil util = new ExcelUtil<>(GysJh.class); List jhList = util.importExcel(file.getInputStream()); String operName = getUsername(); - String message = gysJhService.importGysJhList(jhList, operName); return AjaxResult.success(message); } 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 7a28529..e19f367 100644 --- a/src/main/java/com/zg/project/wisdom/controller/RkInfoController.java +++ b/src/main/java/com/zg/project/wisdom/controller/RkInfoController.java @@ -51,7 +51,6 @@ public class RkInfoController extends BaseController query.getPageNum() == null ? 1 : query.getPageNum(), query.getPageSize() == null ? 10 : query.getPageSize() ); - List list = rkInfoService.selectRkInfoList(query); return getDataTable(list); } @@ -75,14 +74,8 @@ public class RkInfoController extends BaseController // 使用 PageHelper 分页 PageHelper.startPage(dto.getPageNum(), dto.getPageSize()); List list = rkInfoService.selectAllRkInfo(dto); -// 统计金额 - Long sumMoney = rkInfoService.selectStatistics(dto); -// 统计库位 - Long pcdeCount = rkInfoService.selectPcde(dto); Map dataInfo = new HashMap<>(); dataInfo.put("dataList",getDataTable(list)); - dataInfo.put("sumMoney",sumMoney); - dataInfo.put("pcdeCount",pcdeCount); return dataInfo; } @@ -360,4 +353,16 @@ public class RkInfoController extends BaseController } + @PostMapping("/statistics") + public Map statistics(@RequestBody RkInfoQueryDTO dto) { + + Long sumMoney = rkInfoService.selectStatistics(dto); + Long pcdeCount = rkInfoService.selectPcde(dto); + + Map dataInfo = new HashMap<>(); + dataInfo.put("sumMoney", sumMoney); + dataInfo.put("pcdeCount", pcdeCount); + return dataInfo; + } + } 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 cb4a8bd..270371c 100644 --- a/src/main/java/com/zg/project/wisdom/domain/GysJh.java +++ b/src/main/java/com/zg/project/wisdom/domain/GysJh.java @@ -68,13 +68,10 @@ public class GysJh extends BaseEntity private String xh; /** 计划交货数量 */ - @Excel(name = "计划交货数量") - private Long jhQty; + private BigDecimal jhQty; /** 合同数量 */ - @Excel(name = "合同数量") - private Long htQty; - + private BigDecimal htQty; /** 计量单位 */ @Excel(name = "计量单位") private String dw; @@ -225,25 +222,11 @@ public class GysJh extends BaseEntity return xh; } - public void setJhQty(Long jhQty) - { - this.jhQty = jhQty; - } + public void setJhQty(BigDecimal jhQty) { this.jhQty = jhQty; } + public BigDecimal getJhQty() { return jhQty; } - public Long getJhQty() - { - return jhQty; - } - - public void setHtQty(Long htQty) - { - this.htQty = htQty; - } - - public Long getHtQty() - { - return htQty; - } + public void setHtQty(BigDecimal htQty) { this.htQty = htQty; } + public BigDecimal getHtQty() { return htQty; } public void setDw(String dw) { 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 1397b8b..8513d8b 100644 --- a/src/main/java/com/zg/project/wisdom/mapper/RkInfoMapper.java +++ b/src/main/java/com/zg/project/wisdom/mapper/RkInfoMapper.java @@ -243,7 +243,7 @@ public interface RkInfoMapper /** * 查询出库单据 */ - List selectDeliveryCkList(@Param("q") RkInfo query); + List selectDeliveryCkList(RkInfo query); /** @@ -252,4 +252,6 @@ public interface RkInfoMapper List selectBorrowAndReturnList(RkInfo rkInfo); RkInfo selectHeaderByBillNo(String billNo); + + String selectMaxBillNo(@Param("prefix") String prefix); } diff --git a/src/main/java/com/zg/project/wisdom/service/impl/GysJhServiceImpl.java b/src/main/java/com/zg/project/wisdom/service/impl/GysJhServiceImpl.java index 537bbb3..bd2cf50 100644 --- a/src/main/java/com/zg/project/wisdom/service/impl/GysJhServiceImpl.java +++ b/src/main/java/com/zg/project/wisdom/service/impl/GysJhServiceImpl.java @@ -271,11 +271,13 @@ public class GysJhServiceImpl implements IGysJhService item.setHtDj(parseBigDecimal(cellValue)); break; case "jhQty": - // Long!!这里用 Long,避免 BigDecimal 转 Long 的报错 - item.setJhQty(parseLong(cellValue)); + item.setJhQty(parseBigDecimal(cellValue)); break; case "htQty": - item.setHtQty(parseLong(cellValue)); + item.setHtQty(parseBigDecimal(cellValue)); + break; + case "entityId": + item.setEntityId(cellValue.trim()); break; case "sapNo": item.setSapNo(cellValue.trim()); @@ -289,8 +291,8 @@ public class GysJhServiceImpl implements IGysJhService // 默认字段 item.setStatus("0"); item.setIsDelete("0"); -// String username = SecurityUtils.getUsername(); - item.setCreateBy("大爷的!!!"); + String username = SecurityUtils.getUsername(); +// item.setCreateBy("大爷的!!!"); item.setCreateTime(DateUtils.getNowDate()); result.add(item); 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 5ed0aa5..07e69ff 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 @@ -158,15 +158,18 @@ public class MoveRecordServiceImpl implements IMoveRecordService if (dto.getTargets().size() == 1 && totalQty.compareTo(realQty) == 0) { MoveTargetItem target = dto.getTargets().get(0); - // 这里 info 用于记录移库前的快照 + // 记录移库前快照 RkInfo info = new RkInfo(); BeanUtils.copyProperties(original, info); - // 更新原库存到新位置 - original.setWarehouseCode(target.getToCangku()); + // ✅ 更新原库存到新位置(统一写入 cangku) + original.setCangku(target.getToCangku()); original.setPcode(target.getToPcode()); original.setTrayCode(target.getToTrayCode()); + + // ✅ 发生移库就标记 original.setHasMoved("1"); + original.setUpdateBy(username); original.setUpdateTime(now); rkInfoMapper.updateRkInfo(original); @@ -179,9 +182,17 @@ public class MoveRecordServiceImpl implements IMoveRecordService // ===== 情况二 & 三:需要新建多条库存记录 ===== List insertList = new ArrayList<>(); + // ✅ 注意:做移库的“来源记录快照”,用于日志一致性(不受后面数量更新影响) + RkInfo fromSnapshot = new RkInfo(); + BeanUtils.copyProperties(original, fromSnapshot); + // 情况三:部分移库(目标总量 < 原库存) → 原库存数量减少 if (totalQty.compareTo(realQty) < 0) { original.setRealQty(realQty.subtract(totalQty)); + + // ✅ 关键:发生移库就标记(你问的 has_moved 应该是 1) + original.setHasMoved("1"); + original.setUpdateBy(username); original.setUpdateTime(now); rkInfoMapper.updateRkInfo(original); @@ -193,13 +204,19 @@ public class MoveRecordServiceImpl implements IMoveRecordService // 新增多条目标库存 for (MoveTargetItem target : dto.getTargets()) { RkInfo newInfo = new RkInfo(); - // 注意:这里以 original 为模板(注意上面是否已修改过数量) - BeanUtils.copyProperties(original, newInfo, "id"); + // ✅ 以“移库前快照”作为模板,避免被上面修改过数量影响其它字段 + BeanUtils.copyProperties(fromSnapshot, newInfo, "id"); + + // ✅ 目标位置字段 newInfo.setCangku(target.getToCangku()); newInfo.setPcode(target.getToPcode()); newInfo.setTrayCode(target.getToTrayCode()); + + // ✅ 目标数量 newInfo.setRealQty(target.getRealQty()); + + // ✅ 发生移库就标记 newInfo.setHasMoved("1"); newInfo.setCreateBy(username); @@ -209,8 +226,8 @@ public class MoveRecordServiceImpl implements IMoveRecordService insertList.add(newInfo); - // 移库记录:从原库存 original → 每个 target - moveRecordMapper.insertMoveRecord(createMoveRecord(original, target, dto)); + // ✅ 移库记录:从“移库前快照” → 每个 target(更准确) + moveRecordMapper.insertMoveRecord(createMoveRecord(fromSnapshot, target, dto)); } if (!insertList.isEmpty()) { 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 0161f25..5cd7a83 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 @@ -279,13 +279,15 @@ public class RkInfoServiceImpl implements IRkInfoService if (jh != null) { String status = jh.getStatus(); if ("2".equals(status)) { - // 回补 jh_qty,改为未到货 - BigDecimal updatedQty = (jh.getJhQty() == null ? BigDecimal.ZERO : new BigDecimal(jh.getJhQty())) - .add(realQty); - jh.setJhQty(updatedQty.longValue()); + BigDecimal updatedQty = + (jh.getJhQty() == null ? BigDecimal.ZERO : jh.getJhQty()) + .add(realQty); + + jh.setJhQty(updatedQty); jh.setStatus("0"); jh.setUpdateBy(userId); jh.setUpdateTime(now); + gysJhMapper.updateGysJh(jh); } else if ("1".equals(status)) { // 只更新状态 @@ -355,7 +357,7 @@ public class RkInfoServiceImpl implements IRkInfoService @Transactional(rollbackFor = Exception.class) public void batchInsert(PcRkInfoBatchDTO dto) { - String billNo = BillNoUtil.generateTodayBillNo("RK"); + String billNo = BillNoUtil.generateTodayBillNo("RK", rkInfoMapper); List list = dto.getRkList(); List rkInfos = new ArrayList<>(); List records = new ArrayList<>(); @@ -376,14 +378,15 @@ public class RkInfoServiceImpl implements IRkInfoService (a, b) -> b )); - // ✅ 2-4. 供应计划扣减&状态更新(保留你原来的逻辑) + // ✅ 2-4. 供应计划扣减&状态更新 if (!realQtyMap.isEmpty()) { List jhList = gysJhMapper.selectByIds(new ArrayList<>(realQtyMap.keySet())); Set idsToUpdateStatus = new HashSet<>(); for (GysJh jh : jhList) { Long jhId = jh.getId(); - BigDecimal planQty = BigDecimal.valueOf(jh.getJhQty()); + BigDecimal planQty = + jh.getJhQty() == null ? BigDecimal.ZERO : jh.getJhQty(); BigDecimal realQty = realQtyMap.get(jhId); if (realQty == null) { continue; @@ -446,7 +449,6 @@ public class RkInfoServiceImpl implements IRkInfoService rk.setStatus("1"); // 审核通过 rk.setIsChuku("0"); // 已入库 } - rkInfos.add(rk); } @@ -626,7 +628,7 @@ public class RkInfoServiceImpl implements IRkInfoService } boolean needAudit = "1".equals(configService.selectConfigByKey("rk.audit.enabled")); - String billNo = BillNoUtil.generateTodayBillNo("RK"); + String billNo = BillNoUtil.generateTodayBillNo("RK", rkInfoMapper); // ✅ 第1步:构造 gysJhId → realQty 的映射(从 scanList 中提取) Map realQtyMap = new HashMap<>(); @@ -650,7 +652,9 @@ public class RkInfoServiceImpl implements IRkInfoService List jhList = gysJhMapper.selectByIds(allJhIds); for (GysJh jh : jhList) { Long jhId = jh.getId(); - BigDecimal planQty = BigDecimal.valueOf(jh.getJhQty()); + BigDecimal planQty = jh.getJhQty() == null + ? BigDecimal.ZERO + : jh.getJhQty(); BigDecimal realQty = realQtyMap.get(jhId); if (realQty == null) { continue; @@ -867,7 +871,7 @@ public class RkInfoServiceImpl implements IRkInfoService boolean needAudit = "1".equals(configService.selectConfigByKey("rk.audit.enabled")); // Step 2: 生成出库单据号 - String billNo = BillNoUtil.generateTodayBillNo("CK"); + String billNo = BillNoUtil.generateTodayBillNo("RK", rkInfoMapper); // Step 3: 批量更新 rk_info 出库字段 for (StockOutItemDTO item : dto.getCkList()) { @@ -1122,7 +1126,7 @@ public class RkInfoServiceImpl implements IRkInfoService newEntry.setPcode(newPcode); newEntry.setRkType(dto.getRkType()); newEntry.setRkTime(DateUtils.getNowDate()); - newEntry.setBillNo(BillNoUtil.generateTodayBillNo("RK")); + newEntry.setBillNo(BillNoUtil.generateTodayBillNo("RK", rkInfoMapper)); newEntry.setCreateBy(SecurityUtils.getUserId().toString()); newEntry.setCreateTime(DateUtils.getNowDate()); newEntry.setUpdateBy(null); @@ -1288,7 +1292,7 @@ public class RkInfoServiceImpl implements IRkInfoService // 计划剩余(表里 jh_qty 列) BigDecimal remain = plan.getJhQty() == null ? BigDecimal.ZERO - : BigDecimal.valueOf(plan.getJhQty()); + : plan.getJhQty(); // ① 全额入库:realQty >= remain -> 直接置 1,不做扣减 if (remain.compareTo(BigDecimal.ZERO) <= 0 || realQty.compareTo(remain) >= 0) { @@ -1318,11 +1322,14 @@ public class RkInfoServiceImpl implements IRkInfoService List toPartial = new ArrayList<>(); for (GysJh r : rows) { - long remain = r.getJhQty() == null ? 0L : r.getJhQty(); - if (remain <= 0L) { - toAll.add(r.getId()); // 已经无剩余 -> 置 1 + BigDecimal remain = r.getJhQty() == null + ? BigDecimal.ZERO + : r.getJhQty(); + + if (remain.compareTo(BigDecimal.ZERO) <= 0) { + toAll.add(r.getId()); // 已经无剩余 -> 置 1(全部入库) } else { - toPartial.add(r.getId()); // 仍有剩余 -> 置 2 + toPartial.add(r.getId()); // 仍有剩余 -> 置 2(部分入库) } } diff --git a/src/main/java/com/zg/project/wisdom/utils/BillNoUtil.java b/src/main/java/com/zg/project/wisdom/utils/BillNoUtil.java index 24a7ee0..f5be4dd 100644 --- a/src/main/java/com/zg/project/wisdom/utils/BillNoUtil.java +++ b/src/main/java/com/zg/project/wisdom/utils/BillNoUtil.java @@ -1,5 +1,7 @@ package com.zg.project.wisdom.utils; +import com.zg.project.wisdom.mapper.RkInfoMapper; + import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map; @@ -7,28 +9,40 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.atomic.AtomicInteger; public class BillNoUtil { - // 内存缓存:key = prefix + date,value = 当前递增号 + + // 内存缓存:key = prefix + yyyyMMdd private static final Map DAILY_SEQUENCE_MAP = new ConcurrentHashMap<>(); /** - * 生成当天单据号(格式:RK20250731_1、CK20250731_2) - * @param prefix 单据前缀(如 RK 或 CK) - * @return 单据号 + * 生成当天单据号(格式:RK20251222_1) */ - public static synchronized String generateTodayBillNo(String prefix) { - if (prefix == null || prefix.trim().isEmpty()) { - prefix = "RK"; - } + public static synchronized String generateTodayBillNo(String prefix, RkInfoMapper rkInfoMapper) { - // 获取当天日期字符串 yyyyMMdd - String today = new SimpleDateFormat("yyyyMMdd").format(new Date()); - String key = prefix + today; + // ✅ 先得到最终前缀(不要让 lambda 捕获一个会被重新赋值的变量) + final String finalPrefix = (prefix == null || prefix.trim().isEmpty()) ? "RK" : prefix.trim(); - // 获取并递增序号 - AtomicInteger counter = DAILY_SEQUENCE_MAP.computeIfAbsent(key, k -> new AtomicInteger(1)); - int sequence = counter.getAndIncrement(); + // ✅ today / key 也用 final,确保 lambda 可用 + final String today = new SimpleDateFormat("yyyyMMdd").format(new Date()); + final String key = finalPrefix + today; + final String likePrefix = finalPrefix + today + "_"; - return prefix + today + "_" + sequence; + // 如果当天还没初始化,从数据库取最大号 + AtomicInteger counter = DAILY_SEQUENCE_MAP.computeIfAbsent(key, k -> { + + String maxBillNo = rkInfoMapper.selectMaxBillNo(likePrefix); + + int start = 1; + if (maxBillNo != null) { + try { + String seqStr = maxBillNo.substring(maxBillNo.lastIndexOf("_") + 1); + start = Integer.parseInt(seqStr) + 1; + } catch (Exception ignored) { + } + } + return new AtomicInteger(start); + }); + + int seq = counter.getAndIncrement(); + return finalPrefix + today + "_" + seq; } } - diff --git a/src/main/resources/mybatis/wisdom/RkInfoMapper.xml b/src/main/resources/mybatis/wisdom/RkInfoMapper.xml index e1879c9..bf28bd0 100644 --- a/src/main/resources/mybatis/wisdom/RkInfoMapper.xml +++ b/src/main/resources/mybatis/wisdom/RkInfoMapper.xml @@ -282,8 +282,8 @@ + AND ri.rk_time <= #{endTime} + ]]> @@ -381,6 +381,7 @@ ORDER BY ri.rk_time DESC + - + SELECT a.id, a.bill_no, a.bill_no_ck, a.rk_type, - si.type_name AS rk_type_name, + si.type_name AS rk_type_name, a.wl_type, - mt.type_name AS wl_type_name, + mt.type_name AS wl_type_name, a.cangku, a.rk_time, a.lihuo_y, @@ -487,37 +448,51 @@ a.gys_no, a.sap_no, a.ck_type, - so.type_name AS ck_type_name, + so.type_name AS ck_type_name, a.ly_time, a.ck_lihuo_y, - u.user_name AS ck_lihuo_y_name, - ru.user_name AS lihuo_y_name, - a.is_delivery AS is_delivery + u.user_name AS ck_lihuo_y_name, + ru.user_name AS lihuo_y_name, + a.is_delivery AS is_delivery FROM ( SELECT - MIN(t.id) AS id, - t.bill_no AS bill_no, - MIN(t.bill_no_ck) AS bill_no_ck, - MIN(t.rk_type) AS rk_type, - MIN(t.wl_type) AS wl_type, - MIN(t.cangku) AS cangku, - MIN(t.rk_time) AS rk_time, - MIN(t.lihuo_y) AS lihuo_y, - MAX(t.is_chuku) AS is_chuku, - MIN(t.xj) AS xj, - MIN(t.xm_no) AS xm_no, - MIN(t.xm_ms) AS xm_ms, - MIN(t.xm_no_ck) AS xm_no_ck, - MIN(t.xm_ms_ck) AS xm_ms_ck, - MIN(t.gys_mc) AS gys_mc, - MIN(t.wl_no) AS wl_no, - MIN(t.wl_ms) AS wl_ms, - MIN(t.gys_no) AS gys_no, - MIN(t.sap_no) AS sap_no, - MIN(t.ck_type) AS ck_type, - MAX(t.ly_time) AS ly_time, - MIN(t.ck_lihuo_y) AS ck_lihuo_y, - MIN(t.is_delivery) AS is_delivery + MIN(t.id) AS id, + + /* ✅ 单据号:出库/借料出库 -> CK;其它 -> RK(用于页面展示) */ + t.show_bill_no AS bill_no, + + /* 保留 bill_no_ck 字段(出库态有值) */ + MIN(t.bill_no_ck) AS bill_no_ck, + + MIN(t.rk_type) AS rk_type, + MIN(t.wl_type) AS wl_type, + MIN(t.cangku) AS cangku, + + /* 时间:你要更合理也可以改成 MAX(COALESCE(ly_time,rk_time)) */ + MIN(t.rk_time) AS rk_time, + + MIN(t.lihuo_y) AS lihuo_y, + MAX(t.is_chuku) AS is_chuku, + + MIN(t.xj) AS xj, + MIN(t.xm_no) AS xm_no, + MIN(t.xm_ms) AS xm_ms, + MIN(t.xm_no_ck) AS xm_no_ck, + MIN(t.xm_ms_ck) AS xm_ms_ck, + MIN(t.gys_mc) AS gys_mc, + MIN(t.wl_no) AS wl_no, + MIN(t.wl_ms) AS wl_ms, + MIN(t.gys_no) AS gys_no, + MIN(t.sap_no) AS sap_no, + + MIN(t.ck_type) AS ck_type, + MAX(t.ly_time) AS ly_time, + MIN(t.ck_lihuo_y) AS ck_lihuo_y, + MIN(t.is_delivery) AS is_delivery, + + /* ✅ 用于 needAudit 子查询判断:本组是 RK 组还是 CK 组 */ + MIN(t.show_bill_type) AS show_bill_type + FROM ( SELECT ri.id, @@ -544,11 +519,29 @@ ri.ck_lihuo_y, ri.pcode, ri.is_delete, - ri.is_delivery + ri.is_delivery, + + CASE + WHEN ri.is_chuku IN ('1','3') + AND ri.bill_no_ck IS NOT NULL + AND ri.bill_no_ck != '' + THEN ri.bill_no_ck + ELSE ri.bill_no + END AS show_bill_no, + + CASE + WHEN ri.is_chuku IN ('1','3') + AND ri.bill_no_ck IS NOT NULL + AND ri.bill_no_ck != '' + THEN 'CK' + ELSE 'RK' + END AS show_bill_type + FROM rk_info ri ) t + - + AND t.is_delete = #{q.isDelete} @@ -571,60 +564,102 @@ - - - AND ( - t.xm_no LIKE concat('%', #{q.keyword}, '%') - OR t.xm_ms LIKE concat('%', #{q.keyword}, '%') - OR t.wl_no LIKE concat('%', #{q.keyword}, '%') - OR t.wl_ms LIKE concat('%', #{q.keyword}, '%') - OR t.gys_no LIKE concat('%', #{q.keyword}, '%') - OR t.gys_mc LIKE concat('%', #{q.keyword}, '%') - OR t.sap_no LIKE concat('%', #{q.keyword}, '%') - OR t.bill_no LIKE concat('%', #{q.keyword}, '%') - OR t.bill_no_ck LIKE concat('%', #{q.keyword}, '%') - OR t.ck_type LIKE concat('%', #{q.keyword}, '%') - OR t.pcode LIKE concat('%', #{q.keyword}, '%') - ) + + + = #{q.startTime} ]]> + + + - - AND t.rk_type LIKE concat('%', #{q.rkType}, '%') - AND t.wl_type LIKE concat('%', #{q.wlType}, '%') - AND t.cangku LIKE concat('%', #{q.cangku}, '%') + + + = #{q.lyStartTime} ]]> + + + + - - = #{q.startTime} ]]> - - = #{q.lyStartTime}]]> - + + + AND t.rk_type LIKE concat('%', #{q.rkType}, '%') + + + AND t.wl_type LIKE concat('%', #{q.wlType}, '%') + + + AND t.cangku LIKE concat('%', #{q.cangku}, '%') + - - AND t.lihuo_y LIKE concat('%', #{q.lihuoY}, '%') - AND t.xj LIKE concat('%', #{q.xj}, '%') - AND t.bill_no LIKE concat('%', #{q.billNo}, '%') - AND t.bill_no_ck LIKE concat('%', #{q.billNoCk}, '%') - AND t.xm_no LIKE concat('%', #{q.xmNo}, '%') - AND t.xm_ms LIKE concat('%', #{q.xmMs}, '%') - AND t.wl_no LIKE concat('%', #{q.wlNo}, '%') - AND t.wl_ms LIKE concat('%', #{q.wlMs}, '%') - AND t.gys_no LIKE concat('%', #{q.gysNo}, '%') - AND t.gys_mc LIKE concat('%', #{q.gysMc}, '%') - AND t.sap_no LIKE concat('%', #{q.sapNo}, '%') - AND t.pcode LIKE concat('%', #{q.pcode}, '%') - AND t.ck_type LIKE concat('%', #{q.ckType}, '%') + + AND t.lihuo_y LIKE concat('%', #{q.lihuoY}, '%') + + + AND t.xj LIKE concat('%', #{q.xj}, '%') + + + + + AND t.show_bill_no LIKE concat('%', #{q.billNo}, '%') + + + + + AND t.bill_no_ck LIKE concat('%', #{q.billNoCk}, '%') + + + + + AND t.xm_no LIKE concat('%', #{q.xmNo}, '%') + + + AND t.xm_ms LIKE concat('%', #{q.xmMs}, '%') + + + AND t.wl_no LIKE concat('%', #{q.wlNo}, '%') + + + AND t.wl_ms LIKE concat('%', #{q.wlMs}, '%') + + + AND t.gys_no LIKE concat('%', #{q.gysNo}, '%') + + + AND t.gys_mc LIKE concat('%', #{q.gysMc}, '%') + + + AND t.sap_no LIKE concat('%', #{q.sapNo}, '%') + + + AND t.pcode LIKE concat('%', #{q.pcode}, '%') + + + AND t.ck_type LIKE concat('%', #{q.ckType}, '%') + AND t.is_delivery = #{q.isDelivery} - - - AND t.bill_no_ck IS NOT NULL + + + AND ( + t.xm_no LIKE concat('%', #{q.keyword}, '%') + OR t.xm_ms LIKE concat('%', #{q.keyword}, '%') + OR t.wl_no LIKE concat('%', #{q.keyword}, '%') + OR t.wl_ms LIKE concat('%', #{q.keyword}, '%') + OR t.gys_no LIKE concat('%', #{q.keyword}, '%') + OR t.gys_mc LIKE concat('%', #{q.keyword}, '%') + OR t.sap_no LIKE concat('%', #{q.keyword}, '%') + OR t.bill_no LIKE concat('%', #{q.keyword}, '%') + OR t.bill_no_ck LIKE concat('%', #{q.keyword}, '%') + OR t.show_bill_no LIKE concat('%', #{q.keyword}, '%') + OR t.ck_type LIKE concat('%', #{q.keyword}, '%') + OR t.pcode LIKE concat('%', #{q.keyword}, '%') + ) - + AND NOT EXISTS ( SELECT 1 @@ -633,12 +668,19 @@ ON asg.rk_id = r2.id AND asg.approver_id IS NOT NULL AND (asg.audit_result IS NOT NULL AND asg.audit_result != '1') - WHERE r2.bill_no = t.bill_no - AND r2.is_delete = 0 + WHERE r2.is_delete = 0 + AND ( + (t.show_bill_type = 'RK' AND r2.bill_no = t.show_bill_no) + OR (t.show_bill_type = 'CK' AND r2.bill_no_ck = t.show_bill_no) + ) ) + - GROUP BY t.bill_no + + /* ✅ 关键:按 show_bill_no 分组(出库合并 CK,在库保留 RK) */ + GROUP BY t.show_bill_no + ) a LEFT JOIN stock_in_type si ON a.rk_type = si.type_code LEFT JOIN stock_out_type so ON a.ck_type = so.type_code @@ -646,8 +688,10 @@ LEFT JOIN material_type mt ON a.wl_type = mt.type_code LEFT JOIN sys_user ru ON a.lihuo_y = ru.user_id ORDER BY a.rk_time DESC + + + @@ -1378,6 +1376,13 @@ LIMIT 1 + + UPDATE rk_info