diff --git a/klp-ui/src/api/l2/timing.js b/klp-ui/src/api/l2/timing.js index 43ebc625..d9f7271e 100644 --- a/klp-ui/src/api/l2/timing.js +++ b/klp-ui/src/api/l2/timing.js @@ -33,6 +33,14 @@ export function getTimingSegByEncoilId(encoilId) { }) } +// 计划详情 + SEG 实绩合并,后端一次返回,避免前端二次请求 +export function getPlanWithSeg(encoilId) { + return request({ + url: '/sql-server-api/plans-with-seg/' + encoilId, + method: 'get' + }) +} + export function getTimingSegByHotcoilId(encoilId) { return request({ url: '/sql-server-api/seg-by-hotcoil/' + encoilId, diff --git a/klp-ui/src/api/wms/processCoilRecord.js b/klp-ui/src/api/wms/processCoilRecord.js index dfa1608e..105ed509 100644 --- a/klp-ui/src/api/wms/processCoilRecord.js +++ b/klp-ui/src/api/wms/processCoilRecord.js @@ -15,3 +15,7 @@ export function countProcessCoilRecord(versionId) { export function upsertProcessCoilRecord(data) { return request({ url: '/wms/processCoilRecord/upsert', method: 'post', data }) } + +export function batchRebindCoilRecord(data) { + return request({ url: '/wms/processCoilRecord/batchRebind', method: 'post', data }) +} diff --git a/klp-ui/src/api/wms/processSpec.js b/klp-ui/src/api/wms/processSpec.js index 5fc0a17a..6500151e 100644 --- a/klp-ui/src/api/wms/processSpec.js +++ b/klp-ui/src/api/wms/processSpec.js @@ -42,3 +42,4 @@ export function delProcessSpec(specId) { method: 'delete' }) } + diff --git a/klp-ui/src/views/timing/acid/index.vue b/klp-ui/src/views/timing/acid/index.vue index c4cb4cea..75eea626 100644 --- a/klp-ui/src/views/timing/acid/index.vue +++ b/klp-ui/src/views/timing/acid/index.vue @@ -91,8 +91,7 @@ import * as echarts from 'echarts' import { getTimingPlanList, getTimingPlanCount, - getTimingPlanDetail, - getTimingSegByEncoilId + getPlanWithSeg } from '@/api/l2/timing' const PLAN_FIELDS = [ @@ -157,7 +156,7 @@ export default { } }, created() { - // plain instance property — Vue 2 does NOT proxy underscore-prefixed names + // plain instance properties — Vue 2 does NOT proxy underscore-prefixed names this.chartInstances = [] this.resizeHandler = null this.loadPlanCount() @@ -194,44 +193,37 @@ export default { if (!this.queryForm.coilId) return this.loadPlanList() this.loading = true try { - const res = await getTimingPlanDetail(this.queryForm.coilId) - const row = res?.data?.firstRow || null - if (row) { - this.selectedPlan = row - await this.loadPerf(row) - } + await this._loadFull(this.queryForm.coilId) } finally { this.loading = false } }, async handlePlanRowClick(row) { - this.selectedPlan = row + const encoilId = row.encoilid || row.coilid + if (!encoilId) return + this.disposeCharts() this.perfSeries = null this.perfSegCount = 0 - this.disposeCharts() - await this.loadPerf(row) - }, - async loadPerf(plan) { - const encoilId = plan.encoilid || plan.coilid - if (!encoilId) return this.perfLoading = true try { - const res = await getTimingSegByEncoilId(encoilId) - const series = res?.data?.series || null - const rows = res?.data?.rows || [] - this.perfSegCount = rows.length - this.perfSeries = series - if (series && rows.length) { - await this.$nextTick() - this.renderCharts(series) - } - } catch (_) { - this.perfSeries = null - this.perfSegCount = 0 + await this._loadFull(encoilId) } finally { this.perfLoading = false } }, + async _loadFull(encoilId) { + const res = await getPlanWithSeg(encoilId) + const plan = res?.data?.plan || res?.data?.firstRow || null + const series = res?.data?.series || null + const rows = res?.data?.rows || [] + if (plan) this.selectedPlan = plan + this.perfSegCount = rows.length + this.perfSeries = series + if (series && rows.length) { + await this.$nextTick() + this.renderCharts(series) + } + }, disposeCharts() { if (this.resizeHandler) { window.removeEventListener('resize', this.resizeHandler) diff --git a/klp-ui/src/views/wms/processSpec/coilSpecBind.vue b/klp-ui/src/views/wms/processSpec/coilSpecBind.vue new file mode 100644 index 00000000..83ce5b82 --- /dev/null +++ b/klp-ui/src/views/wms/processSpec/coilSpecBind.vue @@ -0,0 +1,953 @@ + + + + + diff --git a/klp-wms/src/main/java/com/klp/controller/WmsProcessCoilRecordController.java b/klp-wms/src/main/java/com/klp/controller/WmsProcessCoilRecordController.java index 9b9a031d..20e0b2ce 100644 --- a/klp-wms/src/main/java/com/klp/controller/WmsProcessCoilRecordController.java +++ b/klp-wms/src/main/java/com/klp/controller/WmsProcessCoilRecordController.java @@ -7,6 +7,7 @@ import com.klp.common.core.page.TableDataInfo; import com.klp.domain.bo.WmsProcessCoilRecordBo; import com.klp.domain.vo.WmsProcessCoilRecordVo; import com.klp.service.IWmsProcessCoilRecordService; +import lombok.Data; import lombok.RequiredArgsConstructor; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; @@ -42,10 +43,28 @@ public class WmsProcessCoilRecordController extends BaseController { return R.ok(wmsProcessCoilRecordService.countByVersion(versionId)); } - /** 新增或更新(幂等接口,前端每次点击钢卷行时调用) */ + /** 新增或更新(幂等接口) */ @PostMapping("/upsert") public R upsert(@RequestBody WmsProcessCoilRecordBo bo) { wmsProcessCoilRecordService.upsert(bo); return R.ok(); } + + /** + * 批量重绑:将所选钢卷从 oldVersionId 迁移到 newVersionId。 + * oldVersionId 可为空(此时只新增,不删除旧记录)。 + */ + @PostMapping("/batchRebind") + public R batchRebind(@RequestBody BatchRebindRequest req) { + wmsProcessCoilRecordService.batchRebind(req.getCoilIds(), req.getNewVersionId(), req.getOldVersionId()); + return R.ok(); + } + + @Data + static class BatchRebindRequest { + private List coilIds; + private Long newVersionId; + /** 可为空;非空时先删除该版本下的旧记录 */ + private Long oldVersionId; + } } diff --git a/klp-wms/src/main/java/com/klp/domain/vo/WmsProcessCoilRecordVo.java b/klp-wms/src/main/java/com/klp/domain/vo/WmsProcessCoilRecordVo.java index 0c2ba06a..d76d477b 100644 --- a/klp-wms/src/main/java/com/klp/domain/vo/WmsProcessCoilRecordVo.java +++ b/klp-wms/src/main/java/com/klp/domain/vo/WmsProcessCoilRecordVo.java @@ -25,4 +25,12 @@ public class WmsProcessCoilRecordVo { private Date createTime; private String remark; + + // ── 连接字段(来自 wms_process_spec_version / wms_process_spec) ── + private String versionCode; + private Integer isActive; + private String versionStatus; + private Long specId; + private String specCode; + private String specName; } diff --git a/klp-wms/src/main/java/com/klp/mapper/WmsProcessCoilRecordMapper.java b/klp-wms/src/main/java/com/klp/mapper/WmsProcessCoilRecordMapper.java index a9b5b65c..d4e9150b 100644 --- a/klp-wms/src/main/java/com/klp/mapper/WmsProcessCoilRecordMapper.java +++ b/klp-wms/src/main/java/com/klp/mapper/WmsProcessCoilRecordMapper.java @@ -1,11 +1,23 @@ package com.klp.mapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.klp.common.core.mapper.BaseMapperPlus; import com.klp.domain.WmsProcessCoilRecord; +import com.klp.domain.bo.WmsProcessCoilRecordBo; import com.klp.domain.vo.WmsProcessCoilRecordVo; +import org.apache.ibatis.annotations.Param; + +import java.util.List; /** * 版本钢卷服役记录 Mapper */ public interface WmsProcessCoilRecordMapper extends BaseMapperPlus { + + /** 带版本/规程名称的分页列表(JOIN 查询) */ + IPage selectVoPageJoin(Page page, @Param("bo") WmsProcessCoilRecordBo bo); + + /** 带版本/规程名称的不分页列表 */ + List selectVoListJoin(@Param("bo") WmsProcessCoilRecordBo bo); } diff --git a/klp-wms/src/main/java/com/klp/service/IWmsProcessCoilRecordService.java b/klp-wms/src/main/java/com/klp/service/IWmsProcessCoilRecordService.java index 5af36552..2a66e08b 100644 --- a/klp-wms/src/main/java/com/klp/service/IWmsProcessCoilRecordService.java +++ b/klp-wms/src/main/java/com/klp/service/IWmsProcessCoilRecordService.java @@ -12,13 +12,20 @@ import java.util.List; */ public interface IWmsProcessCoilRecordService { + /** 分页列表,携带版本/规程名称(JOIN) */ TableDataInfo queryPageList(WmsProcessCoilRecordBo bo, PageQuery pageQuery); List queryList(WmsProcessCoilRecordBo bo); - /** 按版本统计服役钢卷总数(含异常数) */ + /** 按版本统计服役钢卷总数 */ long countByVersion(Long versionId); /** 新增或更新(按 version_id + coil_id 唯一键) */ void upsert(WmsProcessCoilRecordBo bo); + + /** + * 批量重绑:将指定钢卷的服役记录从旧版本迁移到新版本。 + * oldVersionId 非空时先删除旧记录,再写入新版本记录。 + */ + void batchRebind(List coilIds, Long newVersionId, Long oldVersionId); } diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsProcessCoilRecordServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsProcessCoilRecordServiceImpl.java index 7f5e22aa..4d06cf1b 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsProcessCoilRecordServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsProcessCoilRecordServiceImpl.java @@ -13,6 +13,7 @@ import com.klp.mapper.WmsProcessCoilRecordMapper; import com.klp.service.IWmsProcessCoilRecordService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.List; @@ -27,13 +28,13 @@ public class WmsProcessCoilRecordServiceImpl implements IWmsProcessCoilRecordSer @Override public TableDataInfo queryPageList(WmsProcessCoilRecordBo bo, PageQuery pageQuery) { - Page result = baseMapper.selectVoPage(pageQuery.build(), buildQueryWrapper(bo)); - return TableDataInfo.build(result); + Page page = pageQuery.build(); + return TableDataInfo.build(baseMapper.selectVoPageJoin(page, bo)); } @Override public List queryList(WmsProcessCoilRecordBo bo) { - return baseMapper.selectVoList(buildQueryWrapper(bo)); + return baseMapper.selectVoListJoin(bo); } @Override @@ -60,6 +61,24 @@ public class WmsProcessCoilRecordServiceImpl implements IWmsProcessCoilRecordSer } } + @Override + @Transactional(rollbackFor = Exception.class) + public void batchRebind(List coilIds, Long newVersionId, Long oldVersionId) { + for (String coilId : coilIds) { + if (oldVersionId != null) { + baseMapper.delete(Wrappers.lambdaQuery() + .eq(WmsProcessCoilRecord::getVersionId, oldVersionId) + .eq(WmsProcessCoilRecord::getCoilId, coilId)); + } + WmsProcessCoilRecordBo bo = new WmsProcessCoilRecordBo(); + bo.setVersionId(newVersionId); + bo.setCoilId(coilId); + bo.setHasAnomaly(0); + bo.setAnomalyCnt(0); + upsert(bo); + } + } + private LambdaQueryWrapper buildQueryWrapper(WmsProcessCoilRecordBo bo) { LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); lqw.eq(bo.getVersionId() != null, WmsProcessCoilRecord::getVersionId, bo.getVersionId()); diff --git a/klp-wms/src/main/resources/mapper/klp/WmsProcessCoilRecordMapper.xml b/klp-wms/src/main/resources/mapper/klp/WmsProcessCoilRecordMapper.xml index 308e77f5..f43811cc 100644 --- a/klp-wms/src/main/resources/mapper/klp/WmsProcessCoilRecordMapper.xml +++ b/klp-wms/src/main/resources/mapper/klp/WmsProcessCoilRecordMapper.xml @@ -18,4 +18,58 @@ + + + + + + + + + + + + + + + + + + + + FROM wms_process_coil_record r + LEFT JOIN wms_process_spec_version v ON r.version_id = v.version_id AND v.del_flag = 0 + LEFT JOIN wms_process_spec s ON v.spec_id = s.spec_id AND s.del_flag = 0 + WHERE r.del_flag = 0 + + AND r.version_id = #{bo.versionId} + + + AND r.coil_id LIKE CONCAT('%', #{bo.coilId}, '%') + + + AND r.en_coil_id LIKE CONCAT('%', #{bo.enCoilId}, '%') + + + AND r.has_anomaly = #{bo.hasAnomaly} + + ORDER BY r.process_time DESC + + + + + +