feat(trace): 添加种子流向信息展示功能
- 在 MesProTracePublicRespVO 中新增 seedFlows 字段用于存储批次出入库流水
- 实现 getBatchFlowList 方法查询批次出入库流水数据
- 在 H5 溯源页面添加种子流向信息展示区块,显示入库出库流水详情
- 修复销售去向查询逻辑,支持按明细表批次号聚合匹配销售出库信息
- 更新 trace.html 静态页面支持新的种子流向信息展示格式
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # ç§åæµåä¿¡æ¯ï¼éå®åºåºåºå
¥åºæµæ°´ï¼ - H5 溯æºèè°è¯´æ |
| | | |
| | | ## èæ¯ |
| | | |
| | | H5 æ«ç 溯æºé¡µï¼`mes.trace-base-url` æåç `trace.html`ï¼æ°å¢ãç§åæµåä¿¡æ¯ãåºåï¼ |
| | | æ**æ¹æ¬¡å
¨æµæ°´**å±ç¤ºè¯¥æ¹æ¬¡çå
¥åºä¸åºåºè®°å½ï¼æ°æ®æºä¸ºéå®åºåº `/sales-outbound/product-sales` 模å对åºçåºåäºå¡ï¼ã |
| | | |
| | | åæ¶ä¿®å¤æ¢æãéå®å»åãæ°æ®é¾è·¯ï¼ç§åéå®åºåºæè¢ç /æçæ«ç æ£è´§æ¶ï¼æ¹æ¬¡å·åªåå
¥åºåº**æç»è¡¨** |
| | | ï¼`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` åæ®µååï¼åæ¥å£ï¼ååå
¼å®¹ï¼ï¼** |
| | | |
| | | - æ¥è¯¢å£å¾æ©å±ï¼æ¹æ¬¡å·é¤å¹é
åºåºè¡å¤ï¼åæ¶æåºåºæç»èåå¹é
ï¼æé¤å·²åæ¶åæ®ï¼ã |
| | | - æ°å¢å¡«å
`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` å**ï¼è½åäºä»£ç ï¼ï¼ä½¿ç¨ local ç¯å¢æ¶éå
è¡¥åã |
| | | 3. åå²åºåºåä¸ä¼è¡¥çææµæ°´ï¼ä»
æ°åºåºå¯çå°å®æ´å
¥+åºè®°å½ï¼æ æµæ°´æ¶åéå±ç¤ºéå®åºåºåã |
| | | |
| | | ## éªè¯æ°æ®ï¼mom-thzyï¼ |
| | | |
| | | æ¹æ¬¡ `PC20260819twoITEM_001`ï¼å
¥åº 100ï¼äº§å产åºï¼èæçº¿è¾¹ä»åºï¼â åºåº 1ï¼éå®åºåº SL_20260901002ï¼æååæ ¼åºï¼åé客æ·ï¼ã |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | 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 æ¹æ¬¡åºå
¥åºæµæ°´ï¼ç§åæµåï¼Response 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; |
| | | |
| | | } |
| | |
| | | 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; |
| | |
| | | * H5 æ«ç æº¯æº - å
¨ç¨æº¯æºä¿¡æ¯ Response VO |
| | | * <p> |
| | | * 以ãä¿¡æ¯åºåãæ¨¡ååç»ç»ï¼æ ¸å¿ä¿¡æ¯ï¼åç§/æ¹æ¬¡/人å/è´¨æ£/å
¥åºï¼å§ç»è¿åï¼ |
| | | * éè´æ¥æºãéå®å»åãå å·¥æµè½¬ä¸ºå¯éæ©å±åºåï¼ææ°æ®æé空ï¼ãåç»æ°å¢æ°æ®æºæå䏿¨¡å¼è¿½å åºååæ®µã |
| | | * éè´æ¥æºãéå®å»åãç§åæµåï¼æ¹æ¬¡åºå
¥åºæµæ°´ï¼ãå å·¥æµè½¬ä¸ºå¯éæ©å±åºåï¼ææ°æ®æé空ï¼ãåç»æ°å¢æ°æ®æºæå䏿¨¡å¼è¿½å åºååæ®µã |
| | | */ |
| | | @Schema(description = "H5 æ«ç æº¯æº - å
¨ç¨æº¯æºä¿¡æ¯ Response VO") |
| | | @Data |
| | |
| | | @Schema(description = "éå®å»åï¼å¯éï¼") |
| | | private List<MesWmBatchSalesTargetRespVO> salesTargets; |
| | | |
| | | @Schema(description = "ç§åæµåä¿¡æ¯ï¼æ¹æ¬¡åºå
¥åºæµæ°´ï¼ç产å
¥åº â éå®åºåºçï¼å¯éï¼") |
| | | private List<MesWmBatchFlowRespVO> seedFlows; |
| | | |
| | | @Schema(description = "å å·¥æµè½¬ï¼å¯éï¼") |
| | | private List<MesWmBatchProcessTraceRespVO> processTraces; |
| | | |
| | |
| | | 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; |
| | |
| | | List<MesWmBatchSalesTargetRespVO> selectSalesTargetList(String batchCode); |
| | | |
| | | /** |
| | | * æ¥è¯¢æ¹æ¬¡åºå
¥åºæµæ°´ï¼ç§åæµåï¼ |
| | | * |
| | | * @param batchCode æ¹æ¬¡å· |
| | | * @return åºå
¥åºæµæ°´å表 |
| | | */ |
| | | List<MesWmBatchFlowRespVO> selectBatchFlowList(String batchCode); |
| | | |
| | | /** |
| | | * æ¥è¯¢æ¹æ¬¡å·¥åºæµè½¬ï¼äº§åº/æå
¥äºä»¶ï¼ |
| | | * |
| | | * @param batchCode æ¹æ¬¡å· |
| | |
| | | |
| | | 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; |
| | |
| | | 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()); |
| | | } |
| | | } |
| | | |
| | |
| | | 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; |
| | |
| | | List<MesWmBatchProcessTraceRespVO> getProcessTraceList(String code); |
| | | |
| | | /** |
| | | * è·å¾æ¹æ¬¡åºå
¥åºæµæ°´ï¼ç§åæµåï¼å
¥åº + éå®åºåºçå
¨é¨åºåäºå¡ï¼ |
| | | * |
| | | * @param code æ¹æ¬¡å· |
| | | * @return åºå
¥åºæµæ°´å表 |
| | | */ |
| | | List<MesWmBatchFlowRespVO> getBatchFlowList(String code); |
| | | |
| | | /** |
| | | * æ ¹æ® SN ç è·å¾æ¹æ¬¡ |
| | | * |
| | | * @param sn SN ç |
| | |
| | | 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; |
| | |
| | | } |
| | | |
| | | @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())) { |
| | |
| | | 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> |
| | | |
| | | <!-- æ¹æ¬¡åºå
¥åºæµæ°´ï¼ç§åæµåï¼ï¼åºåäºå¡ â ä»åº/åºåº/åºä½ â éå®åºåºåï¼biz_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) äºä»¶èåï¼æ é建表 --> |
| | |
| | | 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) { |
| | |
| | | ); |
| | | } |
| | | |
| | | // åºå8ï¼å¯éæ©å±ï¼éè´æ¥æº / éå®å»å / å å·¥æµè½¬ï¼ï¼ææ°æ®æå±ç¤º |
| | | // åºå8ï¼å¯éæ©å±ï¼éè´æ¥æº / ç§åæµåä¿¡æ¯ï¼éå®åºåºï¼ / å å·¥æµè½¬ï¼ï¼ææ°æ®æå±ç¤º |
| | | function buildOptionalCard(d) { |
| | | var html = ''; |
| | | if (!isEmptyList(d.purchaseSources)) { |
| | |
| | | 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>'; |