From 51889b97a85b070cbb80a5bb2893149c80448d5d Mon Sep 17 00:00:00 2001
From: 1 <1>
Date: 星期二, 30 十二月 2025 16:31:15 +0800
Subject: [PATCH] #导出优化

---
 src/main/java/com/zy/asrs/entity/param/ExportParam.java                 |   17 +++
 src/main/java/com/zy/asrs/mapper/LocDetlMapper.java                     |    4 
 src/main/java/com/zy/asrs/service/LocDetlService.java                   |    1 
 src/main/java/com/zy/asrs/controller/LocDetlController.java             |  113 +++++++++++----------
 src/main/webapp/static/js/locDetlStatis/locDetlStatis.js                |   60 +++++++----
 src/main/webapp/views/locDetlStatis/locDetlStatis.html                  |   11 ++
 src/main/resources/mapper/LocDetlMapper.xml                             |   74 +++++++++++---
 src/main/webapp/views/orderCargoGrouping/orderCargoGroupingOperate.html |   11 ++
 8 files changed, 195 insertions(+), 96 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/LocDetlController.java b/src/main/java/com/zy/asrs/controller/LocDetlController.java
index c71cc64..ad44284 100644
--- a/src/main/java/com/zy/asrs/controller/LocDetlController.java
+++ b/src/main/java/com/zy/asrs/controller/LocDetlController.java
@@ -17,6 +17,7 @@
 import com.zy.asrs.entity.LocOwner;
 import com.zy.asrs.entity.Mat;
 import com.zy.asrs.entity.param.AbnormalLocDetlParam;
+import com.zy.asrs.entity.param.ExportParam;
 import com.zy.asrs.entity.result.LocDetlAll;
 import com.zy.asrs.entity.result.LocDetlDTO;
 import com.zy.asrs.mapper.LocDetlMapper;
@@ -26,7 +27,7 @@
 import com.zy.common.web.BaseController;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
-
+import org.springframework.util.StringUtils;
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.net.URLEncoder;
@@ -297,51 +298,27 @@
         }
         List<LocDetl> list = locDetlService.selectList(wrapper);
         List<LocDetl> result = new ArrayList<>();
-
-        Page<LocDetl> groupLocDetl = locDetlService.getStockStatis2(toPage(1, 10000, param, LocDetl.class));
-//        for (LocDetl locDetl : groupLocDetl.getRecords()) {
         for (LocDetl locDetl : list) {
-//            AbnormalLocDetlParam abnormalLocDetlParam = new AbnormalLocDetlParam();
-//            Mat mat = matService.selectOne(new EntityWrapper<Mat>()
-//                    .eq("matnr", locDetl.getMatnr()));
-//            if (Cools.isEmpty(mat)) {
-//                continue;
-//            }
-//            if (!Cools.isEmpty(mat.getStoreMax()) || !Cools.isEmpty(mat.getStoreMin())) {
-//                abnormalLocDetlParam.setStoreMax(mat.getStoreMax());
-//                abnormalLocDetlParam.setStoreMaxDate(mat.getStoreMaxDate());
-//                abnormalLocDetlParam.setStoreMin(mat.getStoreMin());
-//                abnormalLocDetlParam.setAnfme(locDetl.getAnfme());//鏁伴噺
-//                abnormalLocDetlParam.setMaktx(mat.getMaktx());//鍟嗗搧鍚嶇О
-//                abnormalLocDetlParam.setMatnr(mat.getMatnr());//鍟嗗搧缂栧彿
-//                abnormalLocDetlParam.setSpecs(mat.getSpecs());
-//                abnormalLocDetlParam.setBatch(locDetl.getBatch());
-//                abnormalLocDetlParam.setLocNo(locDetl.getLocNo());//搴撲綅鍙�
-//                abnormalLocDetlParam.setZpallet(locDetl.getZpallet());//鎵樼洏鏉$爜
-//                abnormalLocDetlParam.setBarcode(locDetl.getStandby2());//鏉$爜upc
-//                abnormalLocDetlParam.setUnit(locDetl.getStandby1());//瀹㈡埛po
-//                abnormalLocDetlParam.setSku(locDetl.getSku());//瀹㈡埛sku
-//                abnormalLocDetlParam.setSupp(locDetl.getSupp());//渚涘簲鍟�
-//                abnormalLocDetlParam.setManu(locDetl.getBoxType1());//璐т富
-//                abnormalLocDetlParam.setOrderNo(locDetl.getOrderNo());//閲囪喘鍗曞彿
-//                abnormalLocDetlParam.setMemo(locDetl.getMemo());//澶囨敞
-//                abnormalLocDetlParam.setModiTime(locDetl.getModiTime());//淇敼鏃堕棿
-//                SimpleDateFormat simple = new SimpleDateFormat("yyyyMMdd");
-//                Date maxDate = simple.parse(locDetl.getBatch());
-//                long time = maxDate.getTime();
-//                Date now = new Date();
-//                long time1 = now.getTime();
-//                abnormalLocDetlParam.setNowTime((int) ((time1 - time) / (1000 * 60 * 60 * 24)));
-
-//                if (!Cools.isEmpty(mat.getStoreMax()) && locDetl.getAnfme() > mat.getStoreMax()) {
-                    result.add(locDetl);
-//                } else if (!Cools.isEmpty(mat.getStoreMin()) && locDetl.getAnfme() < mat.getStoreMin()) {
-//                    result.add(abnormalLocDetlParam);
-//                }
-//            }
+            result.add(locDetl);
         }
         return R.ok(exportSupport(result, fields));
     }
+//
+//    @RequestMapping(value = "/locDetl/statis/export/auth")
+//    @ManagerAuth(memo = "搴撳瓨缁熻瀵煎嚭锛堝綋鍓嶇瓫閫夋潯浠讹級")
+//    public R statisExport(@RequestBody JSONObject json) {
+//        // 鑾峰彇鍓嶇浼犵殑瀛楁鍒楄〃
+//        List<String> fields = JSONObject.parseArray(json.getJSONArray("fields").toJSONString(), String.class);
+//
+//        // 鑾峰彇鎼滅储鍙傛暟锛岃浆鎴� DTO
+//        ExportParam param = json.getJSONObject("locDetl").toJavaObject(ExportParam.class);
+//
+//        // 鐩存帴璋冪敤 Mapper 鏂规硶锛堝叏閲忔暟鎹紝涓嶅垎椤碉級
+//        List<LocDetl> list = locDetlMapper.selectStatisForExport(param);
+//
+//        // 瀵煎嚭
+//        return R.ok(exportSupport(list, fields));
+//    }
 
     @RequestMapping(value = "/locDetl/selectOwner/list/auth")
     @ManagerAuth
@@ -430,29 +407,57 @@
         }
         return R.ok().add(stockStatis);
     }
+    @RequestMapping(value = "/locDetl/statis/export/auth")
+    @ManagerAuth(memo = "搴撳瓨缁熻瀵煎嚭")
+    public R statisExport(@RequestBody JSONObject json) {
+        // 鑾峰彇鎼滅储鍙傛暟
+        ExportParam param = json.getJSONObject("locDetl").toJavaObject(ExportParam.class);
 
-    @Autowired
-    private LocDetlMapper LocDetlMapper;
+        // 鏌ヨ鍏ㄩ噺姹囨�绘暟鎹�
+        List<LocDetl> list = locDetlMapper.selectStockStatisExport(param);
 
-    @RequestMapping(value = "/locDetl/statis/export")
-//    @ManagerAuth
-    public void statisExport(HttpServletResponse response) throws IOException {
-        List<LocDetl> excel = LocDetlMapper.getStockStatisExcel();
-        for (LocDetl locDetl : excel) {
+        // 鍚屾鐗╂枡淇℃伅锛堜繚鎸佸師鏈夐�昏緫锛�
+        for (LocDetl locDetl : list) {
             Mat mat = matService.selectByMatnr(locDetl.getMatnr());
             if (mat != null) {
                 locDetl.sync(mat);
             }
         }
+
+        // 鐩存帴杩斿洖 JSON 鏁版嵁鏁扮粍
+        return R.ok(list);  // 鎴� R.ok().put("data", list)
+    }
+    private void exportExcel(HttpServletResponse response, List<LocDetl> list, List<String> fields, String fileName) throws Exception {
         response.setContentType("application/vnd.ms-excel");
         response.setCharacterEncoding("utf-8");
-        String fileName = URLEncoder.encode("搴撳瓨鏄庣粏缁熻鎶ヨ〃", "UTF-8");
-        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+        response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName + ".xlsx", "UTF-8"));
+
         EasyExcel.write(response.getOutputStream(), LocDetl.class)
-                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
-                .sheet("琛�1")
-                .doWrite(excel);
+                .sheet("搴撳瓨缁熻")
+                .doWrite(list);
     }
+    @Autowired
+    private LocDetlMapper LocDetlMapper;
+
+//    @RequestMapping(value = "/locDetl/statis/export")
+////    @ManagerAuth
+//    public void statisExport(HttpServletResponse response) throws IOException {
+//        List<LocDetl> excel = LocDetlMapper.getStockStatisExcel();
+//        for (LocDetl locDetl : excel) {
+//            Mat mat = matService.selectByMatnr(locDetl.getMatnr());
+//            if (mat != null) {
+//                locDetl.sync(mat);
+//            }
+//        }
+//        response.setContentType("application/vnd.ms-excel");
+//        response.setCharacterEncoding("utf-8");
+//        String fileName = URLEncoder.encode("搴撳瓨鏄庣粏缁熻鎶ヨ〃", "UTF-8");
+//        response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
+//        EasyExcel.write(response.getOutputStream(), LocDetl.class)
+//                .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
+//                .sheet("琛�1")
+//                .doWrite(excel);
+//    }
 
     /**
      * 鑾峰彇搴撳瓨鎬绘暟
diff --git a/src/main/java/com/zy/asrs/entity/param/ExportParam.java b/src/main/java/com/zy/asrs/entity/param/ExportParam.java
new file mode 100644
index 0000000..6bad5d7
--- /dev/null
+++ b/src/main/java/com/zy/asrs/entity/param/ExportParam.java
@@ -0,0 +1,17 @@
+package com.zy.asrs.entity.param;
+
+import com.zy.common.utils.Synchro;
+import lombok.Data;
+
+@Data
+public class ExportParam {
+    private Double anfme;
+    private String matnr;
+    private String standby1;
+    private String standby2;
+    private String boxType3;
+
+    public void sync(Object source) {
+        Synchro.Copy(source, this);
+    }
+}
diff --git a/src/main/java/com/zy/asrs/mapper/LocDetlMapper.java b/src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
index f72dbe8..71c9d85 100644
--- a/src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
+++ b/src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
@@ -2,6 +2,7 @@
 
 import com.baomidou.mybatisplus.mapper.BaseMapper;
 import com.zy.asrs.entity.LocDetl;
+import com.zy.asrs.entity.param.ExportParam;
 import com.zy.asrs.entity.result.LocDetlAll;
 import com.zy.asrs.entity.result.LocDetlDTO;
 import com.zy.asrs.entity.result.StockVo;
@@ -52,7 +53,8 @@
     List<String> selectSameDetlTodayBatch(@Param("matnr") String matnr,@Param("batch") String batch, @Param("start") Integer start, @Param("end") Integer end);
 
     List<LocDetl> getStockStatis(Map<String, Object> map);
-
+    List<LocDetl> selectStatisForExport(ExportParam param);
+    List<LocDetl> selectStockStatisExport( ExportParam param);
     Integer getStockStatisCount(Map<String, Object> map);
 
     List<LocDetl> getStockStatis2(Map<String, Object> map);
diff --git a/src/main/java/com/zy/asrs/service/LocDetlService.java b/src/main/java/com/zy/asrs/service/LocDetlService.java
index dfce28d..81c9de2 100644
--- a/src/main/java/com/zy/asrs/service/LocDetlService.java
+++ b/src/main/java/com/zy/asrs/service/LocDetlService.java
@@ -54,6 +54,7 @@
     List<String> getSameDetlToday(String matnr, String batch, Integer start, Integer end);
 
     Page<LocDetl> getStockStatis(Page<LocDetl> page);
+//    List<LocDetl> getStockStatisList(Page<LocDetl> page);
 
     Double getSumAnfme(String matnr);
 
diff --git a/src/main/resources/mapper/LocDetlMapper.xml b/src/main/resources/mapper/LocDetlMapper.xml
index aada17d..d32628d 100644
--- a/src/main/resources/mapper/LocDetlMapper.xml
+++ b/src/main/resources/mapper/LocDetlMapper.xml
@@ -358,7 +358,22 @@
             and a.standby3 like '%' + #{standby3} + '%'
         </if>
         <if test="boxType3!=null and boxType3!='' ">
-            and a.boxType3 like '%' + #{boxType3} + '%'
+            and a.box_type3 like '%' + #{boxType3} + '%'
+        </if>
+    </sql>
+
+    <sql id="stockOutCondition1">
+        <if test="matnr!=null and matnr!='' ">
+            and a.matnr like '%' + #{matnr} + '%'
+        </if>
+        <if test="standby1!=null and standby1!='' ">
+            and a.standby1 like '%' + #{standby1} + '%'
+        </if>
+        <if test="standby2!=null and standby2!='' ">
+            and a.standby2 like '%' + #{standby2} + '%'
+        </if>
+        <if test="boxType3!=null and boxType3!='' ">
+            and a.box_type3 like '%' + #{boxType3} + '%'
         </if>
     </sql>
 
@@ -386,21 +401,48 @@
         <include refid="stockOutCondition"></include>
     </select>
 
-    <select id="getStockStatis" resultType="com.zy.asrs.entity.LocDetl">
-        select * from
-        (
-            select
-            ROW_NUMBER() over (order by sum(a.anfme) desc) as row
-            , a.matnr
-            , a.batch
-            , a.standby1
-            , a.standby2
-            , sum(a.anfme) as anfme
-            from asr_loc_detl a
-            where 1=1
-            <include refid="stockOutCondition"></include>
-            group by a.matnr, a.batch, a.standby1, a.standby2
-         ) t where t.row between ((#{pageNumber}-1)*#{pageSize}+1) and (#{pageNumber}*#{pageSize})
+    <select id="getStockStatis" resultMap="BaseResultMap">
+        SELECT * FROM (
+            SELECT
+                ROW_NUMBER() OVER (ORDER BY SUM(a.anfme) DESC) AS row,
+                a.matnr,
+                a.batch,
+                a.standby1,
+                a.standby2,
+                MAX(a.box_type3) AS box_type3,  -- 鍏抽敭锛氱敤 MAX 閬垮厤 null 鎴栦笉纭畾鎬�
+                SUM(a.anfme) AS anfme
+                FROM asr_loc_detl a
+                WHERE 1=1
+                <include refid="stockOutCondition"/>
+                GROUP BY
+                a.matnr,
+                a.batch,
+                a.standby1,
+                a.standby2,
+                a.box_type3  -- 淇濈暀锛屽洜涓轰笟鍔¢渶瑕佹寜閲囪喘鍗曞尯鍒�
+            ) t
+        WHERE t.row BETWEEN ((#{pageNumber}-1)*#{pageSize}+1) AND (#{pageNumber}*#{pageSize})
+    </select>
+
+    <!-- 搴撳瓨缁熻瀵煎嚭锛氬叏閲忔眹鎬绘暟鎹紙涓嶅垎椤碉級 -->
+    <select id="selectStockStatisExport" resultMap="BaseResultMap">
+        SELECT
+        a.matnr,
+        a.batch,
+        a.standby1,
+        a.standby2,
+        MAX(a.box_type3) AS box_type3,
+        SUM(a.anfme) AS anfme
+        FROM asr_loc_detl a
+        WHERE 1=1
+        <include refid="stockOutCondition1"/>
+        GROUP BY
+        a.matnr,
+        a.batch,
+        a.standby1,
+        a.standby2,
+        a.box_type3
+        ORDER BY SUM(a.anfme) DESC
     </select>
 
     <select id="getStockStatisCount" parameterType="java.util.Map" resultType="java.lang.Integer">
diff --git a/src/main/webapp/static/js/locDetlStatis/locDetlStatis.js b/src/main/webapp/static/js/locDetlStatis/locDetlStatis.js
index fd1da33..a1adf70 100644
--- a/src/main/webapp/static/js/locDetlStatis/locDetlStatis.js
+++ b/src/main/webapp/static/js/locDetlStatis/locDetlStatis.js
@@ -5,6 +5,8 @@
     ];
     arrRemove(detlCols, "field", "anfme")
     arrRemove(detlCols, "field", "zpallet")
+    arrRemove(detlCols, "field", "orderNo")
+    arrRemove(detlCols, "field", "memo")
     cols.push.apply(cols, detlCols);
     // cols.push({field: 'anfme', align: 'center',title: '鏁伴噺', style: 'font-weight: bold'}
     // )
@@ -103,45 +105,55 @@
         var checkStatus = table.checkStatus(obj.config.id);
         switch(obj.event) {
             case 'exportAll':
-                layer.closeAll();
-                layer.load(1, {shade: [0.1,'#fff']});
-                location.href = baseUrl + "/locDetl/statis/export";
-                layer.closeAll('loading');
-                break;
-            case 'exportData':
-                layer.confirm('纭畾瀵煎嚭Excel鍚�', {shadeClose: true}, function(){
-                    var titles=[];
-                    var fields=[];
-                    obj.config.cols[0].map(function (col) {
-                        if (col.type === 'normal' && col.hide === false && col.toolbar == null) {
-                            titles.push(col.title);
-                            fields.push(col.field);
-                        }
-                    });
+                layer.confirm('纭畾瀵煎嚭Excel鍚楋紵', {shadeClose: true}, function(){
+                    // 鏀堕泦鎼滅储鏉′欢
                     var exportData = {};
                     $.each($('#search-box [name]').serializeArray(), function() {
                         exportData[this.name] = this.value;
                     });
+
                     var param = {
-                        'locDetl': exportData,
-                        'fields': fields
+                        locDetl: exportData
                     };
+
                     $.ajax({
-                        url: baseUrl+"/locDetl/export/auth",
+                        url: baseUrl + "/locDetl/statis/export/auth",
                         headers: {'token': localStorage.getItem('token')},
                         data: JSON.stringify(param),
-                        dataType:'json',
-                        contentType:'application/json;charset=UTF-8',
+                        dataType: 'json',
+                        contentType: 'application/json;charset=UTF-8',
                         method: 'POST',
                         success: function (res) {
                             layer.closeAll();
-                            if (res.code === 200) {
-                                table.exportFile(titles,res.data,'xls');
+                            if (res.code === 200 && res.data && res.data.length > 0) {
+                                var titles = ['搴撳瓨鏁伴噺', '鍟嗗搧缂栧彿', '鍟嗗搧鍚嶇О', '閲囪喘鍗曞彿', '鏉$爜UPC', '鍗曠鍑�閲�(kg)', '瀹㈡埛PO'];
+                                var fieldKeys = ['anfme', 'matnr', 'maktx', 'boxType3', 'standby2', 'weight', 'standby1'];
+
+                                var exportData = res.data.map(function(item) {
+                                    return [
+                                        item.anfme || '',
+                                        item.matnr || '',
+                                        item.maktx || '',  // 濡傛灉 maktx 涓虹┖鍙粯璁�
+                                        item.boxType3 || '',
+                                        item.standby2 || '',
+                                        item.weight || '',
+                                        item.standby1 || ''  // 濡傚瓧娈垫槸 order_no 鏀规垚 item.order_no
+                                    ];
+                                });
+
+                                table.exportFile(titles, exportData, 'xls');
+                                layer.msg('瀵煎嚭鎴愬姛锛屽叡 ' + res.data.length + ' 鏉℃暟鎹�', {icon: 1});
+                            } else if (res.code === 200) {
+                                layer.msg('娌℃湁绗﹀悎鏉′欢鐨勬暟鎹彲瀵煎嚭', {icon: 2});
                             } else if (res.code === 403) {
-                                top.location.href = baseUrl+"/";
+                                top.location.href = baseUrl + "/";
                             } else {
-                                layer.msg(res.msg)
+                                layer.msg(res.msg || '瀵煎嚭澶辫触');
                             }
+                        },
+                        error: function() {
+                            layer.closeAll();
+                            layer.msg('缃戠粶閿欒锛屽鍑哄け璐�');
                         }
                     });
                 });
diff --git a/src/main/webapp/views/locDetlStatis/locDetlStatis.html b/src/main/webapp/views/locDetlStatis/locDetlStatis.html
index a312e9c..93578b4 100644
--- a/src/main/webapp/views/locDetlStatis/locDetlStatis.html
+++ b/src/main/webapp/views/locDetlStatis/locDetlStatis.html
@@ -16,7 +16,16 @@
 <div id="search-box" class="layui-form layui-card-header">
     <div class="layui-inline">
         <div class="layui-input-inline">
-            <input class="layui-input" type="text" name="matnr" placeholder="鍟嗗搧缂栧彿" autocomplete="off">
+            <input class="layui-input" type="text" name="matnr" placeholder="SKU" autocomplete="off">
+        </div>
+        <div class="layui-input-inline">
+            <input class="layui-input" type="text" name="boxType3" placeholder="閲囪喘鍗曞彿" autocomplete="off">
+        </div>
+        <div class="layui-input-inline">
+            <input class="layui-input" type="text" name="standby2" placeholder="UPC" autocomplete="off">
+        </div>
+        <div class="layui-input-inline">
+            <input class="layui-input" type="text" name="standby1" placeholder="PO" autocomplete="off">
         </div>
     </div>
     <!-- 寰呮坊鍔� -->
diff --git a/src/main/webapp/views/orderCargoGrouping/orderCargoGroupingOperate.html b/src/main/webapp/views/orderCargoGrouping/orderCargoGroupingOperate.html
index bf74c2a..0467e6c 100644
--- a/src/main/webapp/views/orderCargoGrouping/orderCargoGroupingOperate.html
+++ b/src/main/webapp/views/orderCargoGrouping/orderCargoGroupingOperate.html
@@ -430,6 +430,17 @@
 					this.getTableDataA();
 				}, 10000);
 			},
+			handleDetailSearch() {
+				// 瑙﹀彂璁$畻灞炴�ч噸鏂拌绠楀嵆鍙紝鏃犻渶棰濆鎿嶄綔
+				this.$forceUpdate(); // 鍙�夛紝纭繚绔嬪嵆鍒锋柊锛堥�氬父涓嶉渶瑕侊級
+			},
+
+			// 鏄庣粏鎼滅储閲嶇疆
+			handleDetailReset() {
+				this.detailSearch.standby3 = '';
+				this.detailSearch.boxType3 = '';
+				// 閲嶇疆鍚庤〃鏍艰嚜鍔ㄦ仮澶嶅師鏁版嵁
+			},
 
 			// 鑾峰彇涓昏〃A鏁版嵁
 			getTableDataA() {

--
Gitblit v1.9.1