From 9f4e1c39adfbd25a3e0d14d041d58f42115787b5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=B1=E6=98=8A=E5=A4=A9?= <15984976+n2319_0@user.noreply.gitee.com> Date: Mon, 1 Jun 2026 13:56:39 +0800 Subject: [PATCH] =?UTF-8?q?=E7=94=9F=E4=BA=A7=E6=A8=A1=E5=9D=97=E5=AE=8C?= =?UTF-8?q?=E6=88=90=E4=BB=BB=E5=8A=A1=E6=8E=A5=E5=8F=A3=E5=8A=A0=E5=B9=82?= =?UTF-8?q?=E7=AD=89=EF=BC=9A=E9=87=8D=E5=A4=8D=E7=82=B9=E5=87=BB=E2=80=9C?= =?UTF-8?q?=E5=AE=8C=E6=88=90=E2=80=9D=E4=B8=8D=E5=BA=94=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E7=94=9F=E6=88=90=E5=9B=9E=E6=89=A7=20=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E4=BD=93=E9=AA=8C=20=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E5=85=81=E8=AE=B8=E9=87=8D=E5=A4=8D=E4=BD=86=E8=A6=81=E5=90=88?= =?UTF-8?q?=E5=B9=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/vo/GearProductionTaskListVo.java | 5 +- .../impl/GearProductionTaskServiceImpl.java | 50 +++++++++---- .../production/GearProductionTaskMapper.xml | 16 ++++- .../GearProductionTaskMaterialMapper.xml | 2 +- gear-ui3/src/views/mes/production/index.vue | 70 ++++++++++++++++--- 5 files changed, 117 insertions(+), 26 deletions(-) diff --git a/gear-mes/src/main/java/com/gear/mes/production/domain/vo/GearProductionTaskListVo.java b/gear-mes/src/main/java/com/gear/mes/production/domain/vo/GearProductionTaskListVo.java index 86fc75e..f4685c4 100644 --- a/gear-mes/src/main/java/com/gear/mes/production/domain/vo/GearProductionTaskListVo.java +++ b/gear-mes/src/main/java/com/gear/mes/production/domain/vo/GearProductionTaskListVo.java @@ -24,9 +24,13 @@ public class GearProductionTaskListVo { private String remark; + private String createBy; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date createTime; + private String updateBy; + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Date updateTime; @@ -38,4 +42,3 @@ public class GearProductionTaskListVo { private BigDecimal unfinishedQty; } - diff --git a/gear-mes/src/main/java/com/gear/mes/production/service/impl/GearProductionTaskServiceImpl.java b/gear-mes/src/main/java/com/gear/mes/production/service/impl/GearProductionTaskServiceImpl.java index db8e67f..90eee07 100644 --- a/gear-mes/src/main/java/com/gear/mes/production/service/impl/GearProductionTaskServiceImpl.java +++ b/gear-mes/src/main/java/com/gear/mes/production/service/impl/GearProductionTaskServiceImpl.java @@ -18,7 +18,9 @@ import org.springframework.transaction.annotation.Transactional; import java.math.BigDecimal; import java.util.ArrayList; +import java.util.LinkedHashMap; import java.util.List; +import java.util.Map; @Service public class GearProductionTaskServiceImpl implements IGearProductionTaskService { @@ -76,22 +78,39 @@ public class GearProductionTaskServiceImpl implements IGearProductionTaskService task.setUpdateTime(DateUtils.getNowDate()); taskMapper.insertTask(task); - List products = new ArrayList<>(); + Map productMap = new LinkedHashMap<>(); if (bo.getProducts() != null) { bo.getProducts().forEach(p -> { if (p == null || p.getProductId() == null) return; - GearProductionTaskProduct row = new GearProductionTaskProduct(); - row.setLineId(IdUtil.getSnowflakeNextId()); - row.setTaskId(taskId); - row.setProductId(p.getProductId()); - row.setPlanQty(p.getPlanQty() == null ? BigDecimal.ZERO : p.getPlanQty()); - row.setFinishedQty(p.getFinishedQty() == null ? BigDecimal.ZERO : p.getFinishedQty()); - row.setBadQty(p.getBadQty() == null ? BigDecimal.ZERO : p.getBadQty()); - row.setUnit(p.getUnit()); - row.setRemark(p.getRemark()); - products.add(row); + GearProductionTaskProduct hit = productMap.get(p.getProductId()); + if (hit == null) { + GearProductionTaskProduct row = new GearProductionTaskProduct(); + row.setLineId(IdUtil.getSnowflakeNextId()); + row.setTaskId(taskId); + row.setProductId(p.getProductId()); + row.setPlanQty(p.getPlanQty() == null ? BigDecimal.ZERO : p.getPlanQty()); + row.setFinishedQty(p.getFinishedQty() == null ? BigDecimal.ZERO : p.getFinishedQty()); + row.setBadQty(p.getBadQty() == null ? BigDecimal.ZERO : p.getBadQty()); + row.setUnit(p.getUnit()); + row.setRemark(p.getRemark()); + productMap.put(p.getProductId(), row); + return; + } + BigDecimal planQty = p.getPlanQty() == null ? BigDecimal.ZERO : p.getPlanQty(); + BigDecimal finishedQty = p.getFinishedQty() == null ? BigDecimal.ZERO : p.getFinishedQty(); + BigDecimal badQty = p.getBadQty() == null ? BigDecimal.ZERO : p.getBadQty(); + hit.setPlanQty((hit.getPlanQty() == null ? BigDecimal.ZERO : hit.getPlanQty()).add(planQty)); + hit.setFinishedQty((hit.getFinishedQty() == null ? BigDecimal.ZERO : hit.getFinishedQty()).add(finishedQty)); + hit.setBadQty((hit.getBadQty() == null ? BigDecimal.ZERO : hit.getBadQty()).add(badQty)); + if ((hit.getUnit() == null || hit.getUnit().trim().isEmpty()) && p.getUnit() != null && !p.getUnit().trim().isEmpty()) { + hit.setUnit(p.getUnit()); + } + if ((hit.getRemark() == null || hit.getRemark().trim().isEmpty()) && p.getRemark() != null && !p.getRemark().trim().isEmpty()) { + hit.setRemark(p.getRemark()); + } }); } + List products = new ArrayList<>(productMap.values()); if (!products.isEmpty()) { productMapper.insertBatch(products); } @@ -109,9 +128,13 @@ public class GearProductionTaskServiceImpl implements IGearProductionTaskService if (task == null) { return false; } + if ("2".equals(String.valueOf(task.getStatus()))) { + return true; + } int updated = taskMapper.updateTaskStatus(taskId, "2", task.getUpdateBy(), DateUtils.getNowDate()); if (updated <= 0) { - return false; + GearProductionTask after = taskMapper.selectTaskById(taskId); + return after != null && "2".equals(String.valueOf(after.getStatus())); } regenerateReceiptMaterials(taskId); return true; @@ -134,7 +157,8 @@ public class GearProductionTaskServiceImpl implements IGearProductionTaskService BigDecimal planQty = r.getPlanQty() == null ? BigDecimal.ZERO : r.getPlanQty(); row.setPlanQty(planQty); row.setUsedQty(planQty); - row.setUnit(r.getUnit()); + String unit = r.getUnit(); + row.setUnit(unit == null || unit.trim().isEmpty() ? "个" : unit); row.setRemark(null); rows.add(row); }); diff --git a/gear-mes/src/main/resources/mapper/production/GearProductionTaskMapper.xml b/gear-mes/src/main/resources/mapper/production/GearProductionTaskMapper.xml index f462b0a..321eddd 100644 --- a/gear-mes/src/main/resources/mapper/production/GearProductionTaskMapper.xml +++ b/gear-mes/src/main/resources/mapper/production/GearProductionTaskMapper.xml @@ -13,7 +13,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" t.plan_start_time AS planStartTime, t.plan_end_time AS planEndTime, t.remark AS remark, + t.create_by AS createBy, t.create_time AS createTime, + t.update_by AS updateBy, t.update_time AS updateTime, IFNULL(SUM(p.plan_qty), 0) AS planQty, IFNULL(SUM(p.finished_qty), 0) AS finishedQty, @@ -29,7 +31,18 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND t.plan_start_time =]]> #{beginTime} AND t.plan_start_time #{endTime} - GROUP BY t.task_id + GROUP BY + t.task_id, + t.task_code, + t.task_name, + t.status, + t.plan_start_time, + t.plan_end_time, + t.remark, + t.create_by, + t.create_time, + t.update_by, + t.update_time ORDER BY t.update_time DESC, t.create_time DESC @@ -105,6 +118,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" update_time = #{updateTime} WHERE task_id = #{taskId} AND del_flag = '0' + AND status ]]> #{status} diff --git a/gear-mes/src/main/resources/mapper/production/GearProductionTaskMaterialMapper.xml b/gear-mes/src/main/resources/mapper/production/GearProductionTaskMaterialMapper.xml index 54b90b1..603c62e 100644 --- a/gear-mes/src/main/resources/mapper/production/GearProductionTaskMaterialMapper.xml +++ b/gear-mes/src/main/resources/mapper/production/GearProductionTaskMaterialMapper.xml @@ -37,7 +37,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" END ) * IFNULL(r.material_num, 0) ) AS planQty, - mm.unit AS unit + CASE WHEN mm.unit IS NULL OR mm.unit = '' THEN '个' ELSE mm.unit END AS unit FROM gear_production_task_product p JOIN mat_product_material_relation r ON p.product_id = r.product_id AND r.del_flag = 0 LEFT JOIN mat_material mm ON r.material_id = mm.material_id diff --git a/gear-ui3/src/views/mes/production/index.vue b/gear-ui3/src/views/mes/production/index.vue index e80e76e..5a3f299 100644 --- a/gear-ui3/src/views/mes/production/index.vue +++ b/gear-ui3/src/views/mes/production/index.vue @@ -98,6 +98,11 @@ 已完 {{ formatQty(t.finishedQty) }} 未完 {{ formatQty(t.unfinishedQty) }} +
+ 计划 {{ formatTimeRange(t.planStartTime, t.planEndTime) }} + 创建 {{ t.createBy }} + 更新 {{ formatTime(t.updateTime) }} +
@@ -339,6 +344,22 @@ function normalizeRole(v) { return String(v || '').toLowerCase() } +function formatTime(v) { + if (!v) return '-' + if (v instanceof Date) { + return formatDateTime(v).slice(0, 16) + } + const s = String(v) + if (s.length >= 16) return s.slice(0, 16) + return s +} + +function formatTimeRange(start, end) { + const a = start ? formatTime(start) : '-' + const b = end ? formatTime(end) : '-' + return `${a} ~ ${b}` +} + function pad2(n) { return String(n).padStart(2, '0') } @@ -560,21 +581,43 @@ function onProductPicked(row) { } } +function mergeProductLines(lines) { + const list = Array.isArray(lines) ? lines : [] + const map = new Map() + list.forEach((p) => { + if (!p || p.productId == null) return + const key = String(p.productId) + const planQty = toNumber(p.planQty) + if (!map.has(key)) { + map.set(key, { + productId: p.productId, + planQty, + unit: p.unit || '', + remark: p.remark || '' + }) + return + } + const hit = map.get(key) + hit.planQty = toNumber(hit.planQty) + planQty + if (!hit.unit && p.unit) hit.unit = p.unit + if (!hit.remark && p.remark) hit.remark = p.remark + }) + return Array.from(map.values()) +} + function submitAdd() { if (!addFormRef.value) return addFormRef.value.validate((valid) => { if (!valid) return const task = Object.assign({}, addForm.value) - const products = (addProducts.value || []) - .filter((p) => p && p.productId != null) - .map((p) => ({ - productId: p.productId, - planQty: p.planQty || 0, - finishedQty: 0, - badQty: 0, - unit: p.unit || '', - remark: p.remark || '' - })) + const products = mergeProductLines(addProducts.value).map((p) => ({ + productId: p.productId, + planQty: p.planQty || 0, + finishedQty: 0, + badQty: 0, + unit: p.unit || '', + remark: p.remark || '' + })) addSaving.value = true addProductionTask({ task, products }) @@ -775,6 +818,13 @@ onMounted(() => { margin-bottom: 8px; } +.task-item__meta { + margin-top: -2px; + margin-bottom: 8px; + font-size: 12px; + color: #c0c4cc; +} + .mb12 { margin-bottom: 12px; }