From 35313ffe430ad0ef6799c60316ce2d7bdfa8b855 Mon Sep 17 00:00:00 2001
From: pang.jiabao <pang_jiabao@163.com>
Date: 星期一, 02 九月 2024 13:55:08 +0800
Subject: [PATCH] excel导入单据

---
 src/main/resources/mapper/OrderDetlMapper.xml                  |   17 +++
 src/main/java/com/zy/asrs/controller/OrderController.java      |   31 ++++++
 src/main/java/com/zy/asrs/service/impl/DocTypeServiceImpl.java |   48 ++++-----
 src/main/java/com/zy/asrs/mapper/OrderDetlMapper.java          |    5 +
 src/main/java/com/zy/asrs/importexcle/ImportOrderListener.java |  150 ++++++++++++++++++++++++++++++
 src/main/java/com/zy/asrs/importexcle/ImportOrderDto.java      |   20 ++++
 src/main/webapp/views/order/order.html                         |   28 +++++
 7 files changed, 273 insertions(+), 26 deletions(-)

diff --git a/src/main/java/com/zy/asrs/controller/OrderController.java b/src/main/java/com/zy/asrs/controller/OrderController.java
index bf673f9..8465ddb 100644
--- a/src/main/java/com/zy/asrs/controller/OrderController.java
+++ b/src/main/java/com/zy/asrs/controller/OrderController.java
@@ -1,5 +1,6 @@
 package com.zy.asrs.controller;
 
+import com.alibaba.excel.EasyExcel;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
 import com.baomidou.mybatisplus.mapper.Wrapper;
@@ -11,16 +12,23 @@
 import com.zy.asrs.entity.param.OrderDomainParam;
 
 import com.zy.asrs.entity.result.WrkTraceVo;
+import com.zy.asrs.importexcle.ImportOrderDto;
+import com.zy.asrs.importexcle.ImportOrderListener;
+import com.zy.asrs.mapper.OrderDetlMapper;
 import com.zy.asrs.service.*;
 import com.zy.asrs.utils.FileSaveExampleUtil;
 import com.zy.common.model.DetlDto;
 import com.zy.common.web.BaseController;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
+import javax.annotation.Resource;
+import java.io.IOException;
 import java.util.*;
 
 @RestController
@@ -45,6 +53,29 @@
     @Autowired
     private WrkMastLogService wrkMastLogService;
 
+    @Resource
+    private OrderDetlMapper orderDetlMapper;
+
+    @PostMapping("/importOrder")
+    @ManagerAuth(memo = "鍗曟嵁瀵煎叆")
+    @ApiOperation(value = "鍗曟嵁瀵煎叆", produces = MediaType.APPLICATION_JSON_VALUE)
+    public R importOrderData(@RequestParam("file") MultipartFile multipartFile) {
+        try {
+            importOrder(multipartFile);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.error(e.getMessage());
+        }
+        return R.ok("瀵煎叆鎴愬姛");
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void importOrder(MultipartFile multipartFile) throws IOException {
+        // 鑰冩牳鏁版嵁鐨勫垽閲嶄娇鐢╫rder_id,check_type鐨勭粍鍚堝敮涓�绱㈠紩瑙e喅
+        EasyExcel.read(multipartFile.getInputStream(), ImportOrderDto.class,
+                new ImportOrderListener(orderService, orderDetlMapper,docTypeService, snowflakeIdWorker,getUserId())).sheet().doReadSync();
+    }
+
     @RequestMapping(value = "/order/nav/list/auth")
     @ManagerAuth
     public R navList(@RequestParam(required = false) String orderNo){
diff --git a/src/main/java/com/zy/asrs/importexcle/ImportOrderDto.java b/src/main/java/com/zy/asrs/importexcle/ImportOrderDto.java
new file mode 100644
index 0000000..8395d76
--- /dev/null
+++ b/src/main/java/com/zy/asrs/importexcle/ImportOrderDto.java
@@ -0,0 +1,20 @@
+package com.zy.asrs.importexcle;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import lombok.Data;
+
+/**
+ * @author pang.jiabao
+ * @description 瀵煎叆璁㈠崟dto
+ * @createDate 2024/9/2 9:55
+ */
+@Data
+public class ImportOrderDto {
+
+    @ExcelProperty(value = "鍖呰缁勫彿",index = 0)
+    private String column1;
+
+    @ExcelProperty(value = "鍑哄簱鍗曞彿/鍗曟嵁绫诲瀷",index = 1)
+    private String column2;
+
+}
diff --git a/src/main/java/com/zy/asrs/importexcle/ImportOrderListener.java b/src/main/java/com/zy/asrs/importexcle/ImportOrderListener.java
new file mode 100644
index 0000000..93226be
--- /dev/null
+++ b/src/main/java/com/zy/asrs/importexcle/ImportOrderListener.java
@@ -0,0 +1,150 @@
+package com.zy.asrs.importexcle;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.alibaba.excel.exception.ExcelAnalysisException;
+import com.alibaba.fastjson.JSON;
+import com.core.common.DateUtils;
+import com.core.common.SnowflakeIdWorker;
+import com.zy.asrs.entity.DocType;
+import com.zy.asrs.entity.Order;
+import com.zy.asrs.entity.OrderDetl;
+import com.zy.asrs.mapper.OrderDetlMapper;
+import com.zy.asrs.service.DocTypeService;
+import com.zy.asrs.service.OrderService;
+import lombok.SneakyThrows;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author pang.jiabao
+ * @description 瀵煎叆璁㈠崟鐩戝惉鍣�
+ * @createDate 2024/9/2 9:56
+ */
+@Slf4j
+public class ImportOrderListener extends AnalysisEventListener<ImportOrderDto> {
+    /**
+     * 姣忛殧1000鏉″瓨鍌ㄦ暟鎹簱锛屽疄闄呬娇鐢ㄤ腑鍙互3000鏉★紝鐒跺悗娓呯悊list 锛屾柟渚垮唴瀛樺洖鏀�
+     */
+    private static final int BATCH_COUNT = 400;
+
+    private int count = 0;
+
+    private String orderNo;
+
+    private long orderId;
+
+    List<ImportOrderDto> list = new ArrayList<>();
+    /**
+     * 鍋囪杩欎釜鏄竴涓狣AO锛屽綋鐒舵湁涓氬姟閫昏緫杩欎釜涔熷彲浠ユ槸涓�涓猻ervice銆傚綋鐒跺鏋滀笉鐢ㄥ瓨鍌ㄨ繖涓璞℃病鐢ㄣ��
+     */
+    private final OrderService orderService;
+    private final OrderDetlMapper orderDetlMapper;
+    private final DocTypeService docTypeService;
+    private final SnowflakeIdWorker snowflakeIdWorker;
+    private final Long userId;
+
+    /**
+     * 濡傛灉浣跨敤浜唖pring,璇蜂娇鐢ㄨ繖涓瀯閫犳柟娉曘�傛瘡娆″垱寤篖istener鐨勬椂鍊欓渶瑕佹妸spring绠$悊鐨勭被浼犺繘鏉�
+     */
+    public ImportOrderListener(OrderService orderService, OrderDetlMapper orderDetlMapper,DocTypeService docTypeService, SnowflakeIdWorker snowflakeIdWorker, Long userId) {
+        this.orderService = orderService;
+        this.orderDetlMapper = orderDetlMapper;
+        this.docTypeService = docTypeService;
+        this.snowflakeIdWorker = snowflakeIdWorker;
+        this.userId = userId;
+    }
+
+    /**
+     * 杩欎釜姣忎竴鏉℃暟鎹В鏋愰兘浼氭潵璋冪敤
+     */
+    @SneakyThrows
+    @Override
+    public void invoke(ImportOrderDto data, AnalysisContext context) {
+        log.info("瑙f瀽鍒扮 {} 鏉℃暟鎹�:{}", ++count, JSON.toJSONString(data));
+        list.add(data);
+        if (context.getCurrentRowNum() == 3) {
+            String time = DateUtils.convert(new Date(),DateUtils.yyyyMMddHHmmss_F);
+            Order order2 = orderService.selectByNo(list.get(0).getColumn2());
+            if(order2 != null) {
+                throw new ExcelAnalysisException("鍗曟嵁宸插瓨鍦紒");
+            }
+            DocType docType = docTypeService.selectOrAdd(list.get(1).getColumn2(), Boolean.FALSE);
+            if (docType == null) {
+                throw new ExcelAnalysisException("鍗曟嵁绫诲瀷閿欒锛�" + list.get(1).getColumn2());
+            }
+            orderNo = list.get(0).getColumn2();
+            Order order = new Order();
+            order.setUuid(String.valueOf(snowflakeIdWorker.nextId()));
+            order.setOrderNo(orderNo);
+            order.setOrderTime(time);
+            order.setDocType(docType.getDocId());
+            order.setSettle(1L);
+            order.setStatus(1);
+            order.setCreateBy(userId);
+            order.setCreateTime(new Date());
+            orderService.insert(order);
+            Order order1 = orderService.selectByNo(orderNo);
+            orderId = order1.getId();
+            list.clear();
+            return;
+        }
+
+        // 杈惧埌BATCH_COUNT浜嗭紝闇�瑕佸幓瀛樺偍涓�娆℃暟鎹簱锛岄槻姝㈡暟鎹嚑涓囨潯鏁版嵁鍦ㄥ唴瀛橈紝瀹规槗OOM
+        if (list.size() >= BATCH_COUNT) {
+            saveData();
+            // 瀛樺偍瀹屾垚娓呯悊 list
+            list.clear();
+        }
+    }
+
+    /**
+     * 鎵�鏈夋暟鎹В鏋愬畬鎴愪簡 閮戒細鏉ヨ皟鐢�
+     */
+    @Override
+    public void doAfterAllAnalysed(AnalysisContext context) {
+        // 杩欓噷涔熻淇濆瓨鏁版嵁锛岀‘淇濇渶鍚庨仐鐣欑殑鏁版嵁涔熷瓨鍌ㄥ埌鏁版嵁搴�
+        if (list.size() > 0) {
+            saveData();
+        }
+        log.info("鎵�鏈夋暟鎹В鏋愬畬鎴愶紒");
+    }
+
+    /**
+     * 鍔犱笂瀛樺偍鏁版嵁搴�
+     */
+    private void saveData() {
+        log.info("{}鏉℃暟鎹紝寮�濮嬪瓨鍌ㄦ暟鎹簱锛�", list.size());
+        log.info("鍗曟嵁鍙凤細{}锛屾暟鎹細{},",orderNo, JSON.toJSONString(list));
+        List<OrderDetl> orderDetlList = new ArrayList<>();
+        list.forEach(importOrderDto -> {
+            OrderDetl orderDetl = new OrderDetl();
+            orderDetl.setBrand(importOrderDto.getColumn1());
+            orderDetl.setBatch("");
+            orderDetl.setOrderId(orderId);
+            orderDetl.setOrderNo(orderNo);
+            orderDetl.setCreateBy(9527L);
+            orderDetl.setCreateTime(new Date());
+            orderDetl.setUpdateBy(9527L);
+            orderDetl.setUpdateTime(new Date());
+            orderDetl.setStatus(1);
+            orderDetl.setQty(0.0D);
+            orderDetl.setAnfme(1.0);
+            orderDetlList.add(orderDetl);
+        });
+        orderDetlMapper.batchDetls(orderDetlList);
+
+        log.info("瀛樺偍鏁版嵁搴撴垚鍔燂紒");
+    }
+    /**
+     *瑙f瀽鍑虹幇閿欒浼氳繘鍏ヨ鏂规硶 鍏蜂綋鐪嬫簮浠g爜鎴栨枃妗�
+     */
+    @Override
+    public void onException(Exception exception, AnalysisContext context) throws Exception {
+        log.error("澶勭悊寮傚父锛�" + exception.getMessage());
+        throw exception;
+    }
+}
diff --git a/src/main/java/com/zy/asrs/mapper/OrderDetlMapper.java b/src/main/java/com/zy/asrs/mapper/OrderDetlMapper.java
index e098f4e..48e8ddf 100644
--- a/src/main/java/com/zy/asrs/mapper/OrderDetlMapper.java
+++ b/src/main/java/com/zy/asrs/mapper/OrderDetlMapper.java
@@ -13,6 +13,11 @@
 @Repository
 public interface OrderDetlMapper extends BaseMapper<OrderDetl> {
 
+    /**
+     * 鎵归噺瀛樺偍鍗曟嵁鏄庣粏
+     */
+    int batchDetls(@Param("list") List<OrderDetl> list);
+
     OrderDetl selectItem(@Param("orderId") Long orderId, @Param("matnr") String matnr, @Param("batch") String batch);
 
     OrderDetl selectItemByOrderNo(@Param("orderNo") String orderNo, @Param("matnr") String matnr, @Param("batch") String batch);
diff --git a/src/main/java/com/zy/asrs/service/impl/DocTypeServiceImpl.java b/src/main/java/com/zy/asrs/service/impl/DocTypeServiceImpl.java
index 4f2a66d..4f7cc0e 100644
--- a/src/main/java/com/zy/asrs/service/impl/DocTypeServiceImpl.java
+++ b/src/main/java/com/zy/asrs/service/impl/DocTypeServiceImpl.java
@@ -1,15 +1,12 @@
 package com.zy.asrs.service.impl;
 
 import com.baomidou.mybatisplus.mapper.EntityWrapper;
-import com.core.common.Cools;
-import com.core.exception.CoolException;
-import com.zy.asrs.mapper.DocTypeMapper;
-import com.zy.asrs.entity.DocType;
-import com.zy.asrs.service.DocTypeService;
 import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.core.common.Cools;
+import com.zy.asrs.entity.DocType;
+import com.zy.asrs.mapper.DocTypeMapper;
+import com.zy.asrs.service.DocTypeService;
 import org.springframework.stereotype.Service;
-
-import java.util.Date;
 
 @Service("docTypeService")
 public class DocTypeServiceImpl extends ServiceImpl<DocTypeMapper, DocType> implements DocTypeService {
@@ -21,24 +18,25 @@
         }
         DocType docType = this.selectOne(new EntityWrapper<DocType>().eq("doc_name", docName));
         if (docType == null) {
-            long docId = 1L;
-            DocType last = this.selectOne(new EntityWrapper<DocType>().orderBy("doc_id", false));
-            if (last != null) {
-                docId = last.getDocId() + 1;
-            }
-            docType = new DocType();
-            docType.setDocId(docId);
-            docType.setDocName(docName);
-            if (null != pakin) {
-                docType.setPakin(pakin ? 1 : 0);
-                docType.setPakout(pakin ? 0 : 1);
-            }
-            docType.setStatus(1);
-            docType.setCreateTime(new Date());
-            docType.setUpdateTime(new Date());
-            if (!this.insert(docType)) {
-                throw new CoolException("鍗曟嵁绫诲瀷閿欒");
-            }
+            return null;
+//            long docId = 1L;
+//            DocType last = this.selectOne(new EntityWrapper<DocType>().orderBy("doc_id", false));
+//            if (last != null) {
+//                docId = last.getDocId() + 1;
+//            }
+//            docType = new DocType();
+//            docType.setDocId(docId);
+//            docType.setDocName(docName);
+//            if (null != pakin) {
+//                docType.setPakin(pakin ? 1 : 0);
+//                docType.setPakout(pakin ? 0 : 1);
+//            }
+//            docType.setStatus(1);
+//            docType.setCreateTime(new Date());
+//            docType.setUpdateTime(new Date());
+//            if (!this.insert(docType)) {
+//                throw new CoolException("鍗曟嵁绫诲瀷閿欒");
+//            }
         }
         return docType;
     }
diff --git a/src/main/resources/mapper/OrderDetlMapper.xml b/src/main/resources/mapper/OrderDetlMapper.xml
index 1fb8461..8c94d80 100644
--- a/src/main/resources/mapper/OrderDetlMapper.xml
+++ b/src/main/resources/mapper/OrderDetlMapper.xml
@@ -169,6 +169,23 @@
     <insert id="addToLogTable">
         INSERT INTO man_order_detl_log SELECT * FROM man_order_detl WHERE id = #{id}
     </insert>
+    <insert id="batchDetls">
+        INSERT INTO
+        man_order_detl(brand,batch,order_id,order_no,create_by,create_time,status,qty,anfme)
+        VALUES
+        <foreach collection="list" item="item" index="index" separator=",">
+            (
+            #{item.brand},
+            #{item.batch},
+            #{item.orderId},
+            #{item.orderNo},
+            #{item.createBy},
+            #{item.createTime},
+            #{item.status},
+            #{item.qty},
+            #{item.anfme}
+            )</foreach>
+    </insert>
 
     <update id="increaseQtyByOrderNo">
         update man_order_detl
diff --git a/src/main/webapp/views/order/order.html b/src/main/webapp/views/order/order.html
index 5e0a283..49cbd8b 100644
--- a/src/main/webapp/views/order/order.html
+++ b/src/main/webapp/views/order/order.html
@@ -82,6 +82,8 @@
                         </button>
 <!--                        <button id="orderAddBtn" class="layui-btn icon-btn btn-add"><i class="layui-icon">&#xe654;</i>娣诲姞-->
 <!--                        </button>-->
+                        <input type="file" id="fileInput" accept=".xlsx, .xls">
+                        <button onclick="exportExc()">瀵煎叆璁㈠崟</button>
                     </div>
                 </div>
             </div>
@@ -96,7 +98,31 @@
         </div>
     </div>
 </div>
+<script>
+    function exportExc() {
+        var fileInput = document.getElementById('fileInput');
+        var file = fileInput.files[0];
+        if (file === undefined) {
+            alert('璇峰厛閫夋嫨鏂囦欢')
+            return
+        }
+        var formData = new FormData();
+        formData.append('file', file);
 
+        fetch(baseUrl+'/importOrder', {
+            method: 'POST',
+            headers: {'token': localStorage.getItem('token')},
+            body: formData
+        }).then(response => {
+            response.text().then(data => {
+                var res = JSON.parse(data)
+                alert(res.msg)
+            })
+        }).catch(error => {
+            alert('瀵煎叆寮傚父');
+        });
+    }
+</script>
 <div id="myModal"  style="display: none">
     <div style="padding: 10px">
         <div class="layui-upload">
@@ -134,7 +160,7 @@
     <a class="layui-btn layui-btn-primary layui-border-blue layui-btn-xs btn-complete" lay-event="complete">瀹岀粨</a>
     {{# } }}
     {{# if (d.settle == 4 && d.tkType=='1') { }}
-        <a class="layui-btn layui-btn-danger layui-btn-xs btn-delete" lay-event="refundLoc">閫�搴�</a>
+<!--        <a class="layui-btn layui-btn-danger layui-btn-xs btn-delete" lay-event="refundLoc">閫�搴�</a>-->
     {{# } }}
 </script>
 <!-- 琛ㄦ牸鎿嶄綔鍒� -->

--
Gitblit v1.9.1