From c89f7dcf9344a35efde2a00edb10491b401ba000 Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期三, 16 九月 2026 09:19:00 +0800
Subject: [PATCH] feat(trace): 添加种子流向信息展示功能
---
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/batch/MesWmBatchMapper.java | 9 ++
yudao-server/src/main/resources/static/trace.html | 31 ++++++-
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/pub/trace/vo/MesProTracePublicRespVO.java | 6 +
docs/seed_flow_trace_integration.md | 53 +++++++++++++
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/batch/vo/MesWmBatchFlowRespVO.java | 40 ++++++++++
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java | 6 +
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchService.java | 9 ++
yudao-module-mes/src/main/resources/mapper/wm/batch/MesWmBatchMapper.xml | 40 +++++++++
yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/trace/MesProTracePublicServiceImpl.java | 4 +
9 files changed, 188 insertions(+), 10 deletions(-)
diff --git a/docs/seed_flow_trace_integration.md b/docs/seed_flow_trace_integration.md
new file mode 100644
index 0000000..ff9ecd5
--- /dev/null
+++ b/docs/seed_flow_trace_integration.md
@@ -0,0 +1,53 @@
+# 绉嶅瓙娴佸悜淇℃伅锛堥攢鍞嚭搴撳嚭鍏ュ簱娴佹按锛� - H5 婧簮鑱旇皟璇存槑
+
+## 鑳屾櫙
+
+H5 鎵爜婧簮椤碉紙`mes.trace-base-url` 鎸囧悜鐨� `trace.html`锛夋柊澧炪�岀瀛愭祦鍚戜俊鎭�嶅尯鍧楋細
+鎸�**鎵规鍏ㄦ祦姘�**灞曠ず璇ユ壒娆$殑鍏ュ簱涓庡嚭搴撹褰曪紙鏁版嵁婧愪负閿�鍞嚭搴� `/sales-outbound/product-sales` 妯″潡瀵瑰簲鐨勫簱瀛樹簨鍔★級銆�
+
+鍚屾椂淇鏃㈡湁銆岄攢鍞幓鍚戙�嶆暟鎹摼璺細绉嶅瓙閿�鍞嚭搴撴寜琚嬬爜/鎵樼洏鎵爜鎷h揣鏃讹紝鎵规鍙峰彧鍐欏叆鍑哄簱**鏄庣粏琛�**
+锛坄mes_wm_product_sales_detail.batch_code`锛夛紝鍘熸煡璇㈠彧鍖归厤鍑哄簱**琛岃〃**鎵规鍙凤紝瀵艰嚧婧簮姘歌繙鏌ヤ笉鍒伴攢鍞嚭搴撲俊鎭��
+
+## 娑夊強鎺ュ彛
+
+| 鏂规硶 | 璺緞 | 璇存槑 |
+|------|------|------|
+| GET | /public/mes/trace/query?code={杩芥函鐮亇 | H5 婧簮鏌ヨ锛堝厤鐧诲綍锛夛紝鍝嶅簲鏂板 `seedFlows` 鍖哄潡 |
+
+**鍝嶅簲鏂板瀛楁 `seedFlows`锛堟壒娆″嚭鍏ュ簱娴佹按锛屾寜浜嬪姟鏃堕棿鍗囧簭锛夛細**
+
+| 瀛楁 | 绫诲瀷 | 璇存槑 |
+|------|------|------|
+| type | Integer | 浜嬪姟鏂瑰悜锛�1-鍏ュ簱 2-鍑哄簱 |
+| bizType | Integer | 涓氬姟绫诲瀷锛�118-鐢熶骇鍏ュ簱銆�119-閿�鍞嚭搴撱��124-浜у搧浜у嚭銆�120-閿�鍞��璐у叆搴撶瓑锛岃 MesBizTypeConstants锛� |
+| bizCode | String | 鏉ユ簮涓氬姟鍗曞彿锛堝閿�鍞嚭搴撳崟鍙� SL_xxx锛� |
+| quantity | BigDecimal | 鍙樺姩鏁伴噺锛堝嚭搴撲负璐熸暟锛屽睍绀烘椂鍙栫粷瀵瑰�硷級 |
+| transactionTime | LocalDateTime | 浜嬪姟鍙戠敓鏃堕棿 |
+| warehouseName | String | 浠撳簱鍚嶇О |
+| locationName | String | 搴撳尯鍚嶇О |
+| areaName | String | 搴撲綅鍚嶇О |
+| clientName | String | 瀹㈡埛鍚嶇О锛堜粎閿�鍞嚭搴撴祦姘村甫鍑猴紝鏉ヨ嚜鍑哄簱鍗曞揩鐓э級 |
+
+**`salesTargets` 瀛楁鍙樺寲锛堝悓鎺ュ彛锛屽悜鍚庡吋瀹癸級锛�**
+
+- 鏌ヨ鍙e緞鎵╁睍锛氭壒娆″彿闄ゅ尮閰嶅嚭搴撹澶栵紝鍚屾椂鎸夊嚭搴撴槑缁嗚仛鍚堝尮閰嶏紙鎺掗櫎宸插彇娑堝崟鎹級銆�
+- 鏂板濉厖 `clientName`锛堝鎴峰悕绉板揩鐓э級銆乣clientCode` 涓嶅彉锛涙鍓嶆亽涓� null銆�
+
+## H5 椤甸潰灞曠ず瑙勫垯
+
+| 鍖哄潡 | 灞曠ず鏉′欢 | 鍒� |
+|------|----------|----|
+| 绉嶅瓙娴佸悜淇℃伅 | `seedFlows` 闈炵┖锛堜紭鍏堬級 | 鏂瑰悜锛堝叆搴�/鍑哄簱寰芥爣锛夈�佷笟鍔°�佹潵婧愬崟鍙枫�佸鎴枫�佹暟閲忋�佹椂闂淬�佷粨搴�/搴撳尯 |
+| 绉嶅瓙娴佸悜淇℃伅锛堝洖閫�锛� | `seedFlows` 涓虹┖浣� `salesTargets` 闈炵┖ | 閿�鍞嚭搴撳崟銆佸鎴枫�佹暟閲忋�佹棩鏈� |
+
+## 閮ㄧ讲娉ㄦ剰浜嬮」
+
+1. `trace.html` 涓� `yudao-server` 闈欐�佽祫婧愶紙`src/main/resources/static/trace.html`锛夛紝闇�**閲嶆柊鎵撳寘鍙戝竷鍚庣**锛�
+ 鑻ョ敓浜� nginx 鐨� `/prod/trace.html`锛堝 `http://47.97.181.254:9008/prod/trace.html`锛夋槸鐙珛鎷疯礉閮ㄧ讲鐨勶紝闇�鍚屾鏇挎崲璇ユ枃浠躲��
+2. 閿�鍞嚭搴撴祦姘寸殑瀹㈡埛鍚嶇О鍙� `mes_wm_product_sales.client_name` 蹇収瀛楁锛岃姹傜幆澧冨簱鍖呭惈璇ュ垪锛�
+ 缁忔帓鏌� `mom-thzy` 搴撳凡鏈夛紝**`mom-xgdl` 搴撶己澶� `client_name` / `outbound_time` / `outbound_user_id` 鍒�**锛堣惤鍚庝簬浠g爜锛夛紝浣跨敤 local 鐜鏃堕渶鍏堣ˉ鍒椼��
+3. 鍘嗗彶鍑哄簱鍗曚笉浼氳ˉ鐢熸垚娴佹按锛屼粎鏂板嚭搴撳彲鐪嬪埌瀹屾暣鍏�+鍑鸿褰曪紱鏃犳祦姘存椂鍥為��灞曠ず閿�鍞嚭搴撳崟銆�
+
+## 楠岃瘉鏁版嵁锛坢om-thzy锛�
+
+鎵规 `PC20260819twoITEM_001`锛氬叆搴� 100锛堜骇鍝佷骇鍑猴紝铏氭嫙绾胯竟浠撳簱锛夆啋 鍑哄簱 1锛堥攢鍞嚭搴� SL_20260901002锛屾垚鍝佸悎鏍煎簱锛屽崡閫氬鎴凤級銆�
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/batch/vo/MesWmBatchFlowRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/batch/vo/MesWmBatchFlowRespVO.java
new file mode 100644
index 0000000..ce058b2
--- /dev/null
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/admin/wm/batch/vo/MesWmBatchFlowRespVO.java
@@ -0,0 +1,40 @@
+package cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+@Schema(description = "绠$悊鍚庡彴 - MES 鎵规鍑哄叆搴撴祦姘达紙绉嶅瓙娴佸悜锛塕esponse VO")
+@Data
+public class MesWmBatchFlowRespVO {
+
+ @Schema(description = "浜嬪姟绫诲瀷锛�1-鍏ュ簱 2-鍑哄簱", example = "2")
+ private Integer type;
+
+ @Schema(description = "涓氬姟绫诲瀷锛堣 MesBizTypeConstants锛屽 119-閿�鍞嚭搴撱��124-浜у搧浜у嚭锛�", example = "119")
+ private Integer bizType;
+
+ @Schema(description = "鏉ユ簮涓氬姟鍗曞彿", example = "SL_20260901002")
+ private String bizCode;
+
+ @Schema(description = "鏈鍙樺姩鏁伴噺锛堝嚭搴撲负璐熸暟锛�", example = "-1")
+ private BigDecimal quantity;
+
+ @Schema(description = "浜嬪姟鍙戠敓鏃堕棿")
+ private LocalDateTime transactionTime;
+
+ @Schema(description = "浠撳簱鍚嶇О", example = "鎴愬搧鍚堟牸搴�")
+ private String warehouseName;
+
+ @Schema(description = "搴撳尯鍚嶇О", example = "鎴愬搧鍚堟牸搴撳尯")
+ private String locationName;
+
+ @Schema(description = "搴撲綅鍚嶇О", example = "鎴愬搧鍚堟牸搴撲綅")
+ private String areaName;
+
+ @Schema(description = "瀹㈡埛鍚嶇О锛堥攢鍞嚭搴�/閿�鍞��璐ф椂锛�", example = "瀹㈡埛A")
+ private String clientName;
+
+}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/pub/trace/vo/MesProTracePublicRespVO.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/pub/trace/vo/MesProTracePublicRespVO.java
index bf9329f..3921a13 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/pub/trace/vo/MesProTracePublicRespVO.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/controller/pub/trace/vo/MesProTracePublicRespVO.java
@@ -1,5 +1,6 @@
package cn.iocoder.yudao.module.mes.controller.pub.trace.vo;
+import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchFlowRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchProcessTraceRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchPurchaseSourceRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchSalesTargetRespVO;
@@ -14,7 +15,7 @@
* H5 鎵爜婧簮 - 鍏ㄧ▼婧簮淇℃伅 Response VO
* <p>
* 浠ャ�屼俊鎭尯鍧椼�嶆ā鍧楀寲缁勭粐锛屾牳蹇冧俊鎭紙鍝佺/鎵规/浜哄憳/璐ㄦ/鍏ュ簱锛夊缁堣繑鍥烇紱
- * 閲囪喘鏉ユ簮銆侀攢鍞幓鍚戙�佸姞宸ユ祦杞负鍙�夋墿灞曞尯鍧楋紙鏈夋暟鎹墠闈炵┖锛夈�傚悗缁柊澧炴暟鎹簮鎸夊悓涓�妯″紡杩藉姞鍖哄潡瀛楁銆�
+ * 閲囪喘鏉ユ簮銆侀攢鍞幓鍚戙�佺瀛愭祦鍚戯紙鎵规鍑哄叆搴撴祦姘达級銆佸姞宸ユ祦杞负鍙�夋墿灞曞尯鍧楋紙鏈夋暟鎹墠闈炵┖锛夈�傚悗缁柊澧炴暟鎹簮鎸夊悓涓�妯″紡杩藉姞鍖哄潡瀛楁銆�
*/
@Schema(description = "H5 鎵爜婧簮 - 鍏ㄧ▼婧簮淇℃伅 Response VO")
@Data
@@ -116,6 +117,9 @@
@Schema(description = "閿�鍞幓鍚戯紙鍙�夛級")
private List<MesWmBatchSalesTargetRespVO> salesTargets;
+ @Schema(description = "绉嶅瓙娴佸悜淇℃伅锛堟壒娆″嚭鍏ュ簱娴佹按锛氱敓浜у叆搴� 鈫� 閿�鍞嚭搴撶瓑锛屽彲閫夛級")
+ private List<MesWmBatchFlowRespVO> seedFlows;
+
@Schema(description = "鍔犲伐娴佽浆锛堝彲閫夛級")
private List<MesWmBatchProcessTraceRespVO> processTraces;
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/batch/MesWmBatchMapper.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/batch/MesWmBatchMapper.java
index 084e2ad..8308458 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/batch/MesWmBatchMapper.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/dal/mysql/wm/batch/MesWmBatchMapper.java
@@ -6,6 +6,7 @@
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchFlowRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchProcessTraceRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchPurchaseSourceRespVO;
@@ -205,6 +206,14 @@
List<MesWmBatchSalesTargetRespVO> selectSalesTargetList(String batchCode);
/**
+ * 鏌ヨ鎵规鍑哄叆搴撴祦姘达紙绉嶅瓙娴佸悜锛�
+ *
+ * @param batchCode 鎵规鍙�
+ * @return 鍑哄叆搴撴祦姘村垪琛�
+ */
+ List<MesWmBatchFlowRespVO> selectBatchFlowList(String batchCode);
+
+ /**
* 鏌ヨ鎵规宸ュ簭娴佽浆锛堜骇鍑�/鎶曞叆浜嬩欢锛�
*
* @param batchCode 鎵规鍙�
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/trace/MesProTracePublicServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/trace/MesProTracePublicServiceImpl.java
index 04ff12f..d4ef2c7 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/trace/MesProTracePublicServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/trace/MesProTracePublicServiceImpl.java
@@ -2,6 +2,7 @@
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.StrUtil;
+import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchFlowRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchProcessTraceRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchPurchaseSourceRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchSalesTargetRespVO;
@@ -333,12 +334,15 @@
resp.setPurchaseSources(CollUtil.isNotEmpty(purchaseSources) ? purchaseSources : List.of());
resp.setSalesTargets(CollUtil.isNotEmpty(salesTargets) ? salesTargets : List.of());
resp.setProcessTraces(CollUtil.isNotEmpty(processTraces) ? processTraces : List.of());
+ List<MesWmBatchFlowRespVO> seedFlows = mesWmBatchService.getBatchFlowList(batch.getCode());
+ resp.setSeedFlows(CollUtil.isNotEmpty(seedFlows) ? seedFlows : List.of());
} catch (Exception ex) {
// 浠撳簱鎵规浣撶郴锛堥噰璐�/閿�鍞�/娴佽浆锛夋湭鍚敤鏃跺閿欙紝涓嶅奖鍝嶆牳蹇冭拷婧�
log.warn("[fillOptionalModules][鎵规 {} 鎵╁睍妯″潡鏌ヨ澶辫触: {}]", batch.getCode(), ex.getMessage());
resp.setPurchaseSources(List.of());
resp.setSalesTargets(List.of());
resp.setProcessTraces(List.of());
+ resp.setSeedFlows(List.of());
}
}
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchService.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchService.java
index ebc00b9..464d525 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchService.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchService.java
@@ -1,6 +1,7 @@
package cn.iocoder.yudao.module.mes.service.wm.batch;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchFlowRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchGenerateReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchProcessTraceRespVO;
@@ -125,6 +126,14 @@
List<MesWmBatchProcessTraceRespVO> getProcessTraceList(String code);
/**
+ * 鑾峰緱鎵规鍑哄叆搴撴祦姘达紙绉嶅瓙娴佸悜锛氬叆搴� + 閿�鍞嚭搴撶瓑鍏ㄩ儴搴撳瓨浜嬪姟锛�
+ *
+ * @param code 鎵规鍙�
+ * @return 鍑哄叆搴撴祦姘村垪琛�
+ */
+ List<MesWmBatchFlowRespVO> getBatchFlowList(String code);
+
+ /**
* 鏍规嵁 SN 鐮佽幏寰楁壒娆�
*
* @param sn SN 鐮�
diff --git a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java
index f4ecec0..39a8381 100644
--- a/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java
+++ b/yudao-module-mes/src/main/java/cn/iocoder/yudao/module/mes/service/wm/batch/MesWmBatchServiceImpl.java
@@ -4,6 +4,7 @@
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchFlowRespVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchGenerateReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchPageReqVO;
import cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchProcessTraceRespVO;
@@ -409,6 +410,11 @@
}
@Override
+ public List<MesWmBatchFlowRespVO> getBatchFlowList(String code) {
+ return batchMapper.selectBatchFlowList(code);
+ }
+
+ @Override
public MesWmBatchDO getBatchBySn(String sn) {
MesWmSnDO snDO = snMapper.selectOne(MesWmSnDO::getCode, sn);
if (snDO == null || StrUtil.isBlank(snDO.getBatchCode())) {
diff --git a/yudao-module-mes/src/main/resources/mapper/wm/batch/MesWmBatchMapper.xml b/yudao-module-mes/src/main/resources/mapper/wm/batch/MesWmBatchMapper.xml
index 0eda416..aa5871c 100644
--- a/yudao-module-mes/src/main/resources/mapper/wm/batch/MesWmBatchMapper.xml
+++ b/yudao-module-mes/src/main/resources/mapper/wm/batch/MesWmBatchMapper.xml
@@ -55,16 +55,50 @@
WHERE rl.batch_code = #{batchCode} AND rl.deleted = 0
</select>
- <!-- 鎵规閿�鍞幓鍚戯細鎵规 鈫� 閿�鍞嚭搴撹 鈫� 閿�鍞嚭搴撳崟 鈫� OQC -->
+ <!--
+ 鎵规閿�鍞幓鍚戯紙绉嶅瓙娴佸悜锛夛細
+ 鈶� 琛岀骇鍖归厤锛氭壒娆� 鈫� 閿�鍞嚭搴撹 鈫� 閿�鍞嚭搴撳崟 鈫� OQC锛堣涓婄洿鎺ヨ褰曟壒娆$殑娴佺▼锛夛紱
+ 鈶� 鏄庣粏绾у尮閰嶏細鎵规 鈫� 鎵爜鍑哄簱鏄庣粏 鈫� 閿�鍞嚭搴撳崟 鈫� OQC锛堢瀛愯鐮�/鎵樼洏鎵爜鍑哄簱鏃舵壒娆″彧鍐欏叆鏄庣粏琛紝鎸夊崟鎹仛鍚堟暟閲忥級銆�
+ 鍚屼竴鍑哄簱琛岃嫢宸叉湁鏄庣粏绾у尮閰嶅垯涓嶅啀閲嶅鍑鸿绾ц褰曪紱鎺掗櫎宸插彇娑堬紙鐘舵�� 5锛夊崟鎹��
+ -->
<select id="selectSalesTargetList" parameterType="String"
resultType="cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchSalesTargetRespVO">
- SELECT s.code AS sales_code, s.sales_date, s.sales_order_code, s.client_id,
+ SELECT s.code AS sales_code, s.sales_date, s.sales_order_code, s.client_id, s.client_name,
oqc.code AS oqc_code, oqc.check_result AS check_result,
sl.batch_code, sl.item_id, sl.quantity, sl.quality_status
FROM mes_wm_product_sales_line sl
JOIN mes_wm_product_sales s ON s.id = sl.sales_id AND s.deleted = 0
LEFT JOIN mes_qc_oqc oqc ON oqc.id = sl.oqc_id AND oqc.deleted = 0
- WHERE sl.batch_code = #{batchCode} AND sl.deleted = 0
+ WHERE sl.batch_code = #{batchCode} AND sl.deleted = 0 AND s.status != 5
+ AND NOT EXISTS (SELECT 1 FROM mes_wm_product_sales_detail d
+ WHERE d.line_id = sl.id AND d.batch_code = #{batchCode} AND d.deleted = 0)
+ UNION ALL
+ SELECT s.code AS sales_code, s.sales_date, s.sales_order_code, s.client_id, s.client_name,
+ oqc.code AS oqc_code, oqc.check_result AS check_result,
+ d.batch_code, d.item_id, SUM(d.quantity) AS quantity, MAX(sl.quality_status) AS quality_status
+ FROM mes_wm_product_sales_detail d
+ JOIN mes_wm_product_sales s ON s.id = d.sales_id AND s.deleted = 0
+ JOIN mes_wm_product_sales_line sl ON sl.id = d.line_id AND sl.deleted = 0
+ LEFT JOIN mes_qc_oqc oqc ON oqc.id = sl.oqc_id AND oqc.deleted = 0
+ WHERE d.batch_code = #{batchCode} AND d.deleted = 0 AND s.status != 5
+ GROUP BY s.id, s.code, s.sales_date, s.sales_order_code, s.client_id, s.client_name,
+ oqc.code, oqc.check_result, d.batch_code, d.item_id
+ ORDER BY sales_date
+ </select>
+
+ <!-- 鎵规鍑哄叆搴撴祦姘达紙绉嶅瓙娴佸悜锛夛細搴撳瓨浜嬪姟 鈫� 浠撳簱/搴撳尯/搴撲綅 鈫� 閿�鍞嚭搴撳崟锛坆iz_type 119 甯﹀嚭瀹㈡埛鍚嶇О锛� -->
+ <select id="selectBatchFlowList" parameterType="String"
+ resultType="cn.iocoder.yudao.module.mes.controller.admin.wm.batch.vo.MesWmBatchFlowRespVO">
+ SELECT tx.type, tx.biz_type, tx.biz_code, tx.quantity, tx.transaction_time,
+ w.name AS warehouse_name, loc.name AS location_name, area.name AS area_name,
+ sales.client_name
+ FROM mes_wm_transaction tx
+ LEFT JOIN mes_wm_warehouse w ON w.id = tx.warehouse_id AND w.deleted = 0
+ LEFT JOIN mes_wm_warehouse_location loc ON loc.id = tx.location_id AND loc.deleted = 0
+ LEFT JOIN mes_wm_warehouse_area area ON area.id = tx.area_id AND area.deleted = 0
+ LEFT JOIN mes_wm_product_sales sales ON tx.biz_type = 119 AND sales.id = tx.biz_id AND sales.deleted = 0
+ WHERE tx.batch_code = #{batchCode} AND tx.deleted = 0
+ ORDER BY tx.transaction_time
</select>
<!-- 鎵规宸ュ簭娴佽浆锛氫骇鍑�(OUT)/鎶曞叆(IN) 浜嬩欢鑱氬悎锛屾棤闇�寤鸿〃 -->
diff --git a/yudao-server/src/main/resources/static/trace.html b/yudao-server/src/main/resources/static/trace.html
index afafce6..ec75dff 100644
--- a/yudao-server/src/main/resources/static/trace.html
+++ b/yudao-server/src/main/resources/static/trace.html
@@ -207,6 +207,14 @@
var BAG_STATUS = { 10: ['宸茬敓鎴�', 'gray'], 20: ['宸插鍑哄嵃鍒�', 'blue'], 30: ['宸蹭綔搴�', 'red'] };
var QUALITY_RESULT = { 0: ['澶勭悊涓�', 'gray'], 1: ['鍚堟牸', 'green'], 2: ['涓嶅悎鏍�', 'red'] };
var WORKER_TYPE = { 10: '缁勯暱', 20: '鎿嶄綔宸�', 30: '鍖呰宸�', 40: '璐ㄦ鍛�', 50: '鍏朵粬' };
+ var FLOW_DIRECTION = { 1: ['鍏ュ簱', 'green'], 2: ['鍑哄簱', 'blue'] };
+ var FLOW_BIZ_TYPE = {
+ 110: '閲囪喘鍏ュ簱', 111: '閲囪喘鍏ュ簱鍙栨秷', 112: '璋冩嫧鍑哄簱', 113: '璋冩嫧鍏ュ簱',
+ 114: '鍏朵粬鍑哄簱', 115: '鍏朵粬鍏ュ簱', 116: '鐢熶骇棰嗘枡', 117: '鐢熶骇閫�鏂�',
+ 118: '鐢熶骇鍏ュ簱', 119: '閿�鍞嚭搴�', 120: '閿�鍞��璐у叆搴�', 121: '澶栧崗鍙戞枡',
+ 122: '澶栧崗鍏ュ簱', 123: '鐢熶骇娑堣��', 124: '浜у搧浜у嚭', 125: '渚涘簲鍟嗛��璐у嚭搴�',
+ 126: '搴撳瓨璋冩暣鍏ュ簱', 127: '搴撳瓨璋冩暣鍑哄簱'
+ };
// ========== 宸ュ叿鍑芥暟 ==========
function esc(v) {
@@ -470,7 +478,7 @@
);
}
- // 鍖哄潡8锛氬彲閫夋墿灞曪紙閲囪喘鏉ユ簮 / 閿�鍞幓鍚� / 鍔犲伐娴佽浆锛夛紝鏈夋暟鎹墠灞曠ず
+ // 鍖哄潡8锛氬彲閫夋墿灞曪紙閲囪喘鏉ユ簮 / 绉嶅瓙娴佸悜淇℃伅锛堥攢鍞嚭搴擄級 / 鍔犲伐娴佽浆锛夛紝鏈夋暟鎹墠灞曠ず
function buildOptionalCard(d) {
var html = '';
if (!isEmptyList(d.purchaseSources)) {
@@ -481,13 +489,24 @@
rows += '</tbody></table>';
html += card('閲囪喘鏉ユ簮', null, rows, { collapsible: true, open: false });
}
- if (!isEmptyList(d.salesTargets)) {
- var rows2 = '<table class="mini-table"><thead><tr><th>閿�鍞嚭搴撳崟</th><th>瀹㈡埛</th><th>鏁伴噺</th><th>鏃ユ湡</th></tr></thead><tbody>';
- d.salesTargets.forEach(function (s) {
- rows2 += '<tr><td>' + text(s.outCode || s.salesOrderCode || '') + '</td><td>' + text(s.customerName) + '</td><td>' + fmtNum(s.quantity) + '</td><td>' + fmtDate(s.outTime) + '</td></tr>';
+ if (!isEmptyList(d.seedFlows)) {
+ var rows2 = '<table class="mini-table"><thead><tr><th>鏂瑰悜</th><th>涓氬姟</th><th>鏉ユ簮鍗曞彿</th><th>瀹㈡埛</th><th>鏁伴噺</th><th>鏃堕棿</th><th>浠撳簱/搴撳尯</th></tr></thead><tbody>';
+ d.seedFlows.forEach(function (f) {
+ var qty = (f.quantity === null || f.quantity === undefined) ? '-' : fmtNum(Math.abs(Number(f.quantity)));
+ var wh = [f.warehouseName, f.locationName].filter(Boolean).join(' / ') || '-';
+ rows2 += '<tr><td>' + statusBadge(FLOW_DIRECTION, f.type) + '</td><td>' + text(FLOW_BIZ_TYPE[f.bizType] || f.bizType) +
+ '</td><td>' + text(f.bizCode) + '</td><td>' + text(f.clientName) + '</td><td>' + qty + '</td><td>' +
+ fmtDate(f.transactionTime) + '</td><td>' + text(wh) + '</td></tr>';
});
rows2 += '</tbody></table>';
- html += card('閿�鍞幓鍚�', null, rows2, { collapsible: true, open: false });
+ html += card('绉嶅瓙娴佸悜淇℃伅', null, rows2, { collapsible: true, open: false });
+ } else if (!isEmptyList(d.salesTargets)) {
+ var rows2b = '<table class="mini-table"><thead><tr><th>閿�鍞嚭搴撳崟</th><th>瀹㈡埛</th><th>鏁伴噺</th><th>鏃ユ湡</th></tr></thead><tbody>';
+ d.salesTargets.forEach(function (s) {
+ rows2b += '<tr><td>' + text(s.salesCode || s.salesOrderCode || '') + '</td><td>' + text(s.clientName) + '</td><td>' + fmtNum(s.quantity) + '</td><td>' + fmtDate(s.salesDate) + '</td></tr>';
+ });
+ rows2b += '</tbody></table>';
+ html += card('绉嶅瓙娴佸悜淇℃伅', null, rows2b, { collapsible: true, open: false });
}
if (!isEmptyList(d.processTraces)) {
var rows3 = '<table class="mini-table"><thead><tr><th>鑺傜偣</th><th>璇存槑</th><th>鏃堕棿</th></tr></thead><tbody>';
--
Gitblit v1.9.3