From 925d49633816fb3b3b25adffa3c31a705f8d5bbb Mon Sep 17 00:00:00 2001
From: Junjie <540245094@qq.com>
Date: 星期六, 03 八月 2024 15:18:53 +0800
Subject: [PATCH] #

---
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/template/OrderTemplate.java |   79 +++++++++++++
 zy-asrs-admin/src/components/order/index.vue                                      |   33 ++++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/OrderService.java          |    4 
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/OrderServiceImpl.java |   29 ++++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderController.java    |   68 +++++++++++
 zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/ExcelUtil.java                    |  102 +++++++++++++++-
 6 files changed, 298 insertions(+), 17 deletions(-)

diff --git a/zy-asrs-admin/src/components/order/index.vue b/zy-asrs-admin/src/components/order/index.vue
index ad5dfd0..21d27e4 100644
--- a/zy-asrs-admin/src/components/order/index.vue
+++ b/zy-asrs-admin/src/components/order/index.vue
@@ -3,13 +3,15 @@
 import { useRouter } from "vue-router";
 import { get, post, postBlob } from '@/utils/request.js'
 import { message, Modal } from 'ant-design-vue';
-import { logout } from '@/config.js';
+import { globalState, logout } from '@/config.js';
 import EditView from './edit.vue'
 import { formatMessage } from '@/utils/localeUtils.js';
 import useTableSearch from '@/utils/tableUtils.jsx';
 import ShowOrderDetlComponent from '@/components/orderDetl/show.vue';
 import {
   DownOutlined,
+  UploadOutlined,
+  DownloadOutlined,
 } from "@ant-design/icons-vue";
 const context = getCurrentInstance()?.appContext.config.globalProperties;
 
@@ -241,6 +243,23 @@
   })
 }
 
+const fileList = ref([]);
+const handleUploadChange = info => {
+  if (info.file.status !== 'uploading') {
+    // console.log(info.file, info.fileList);
+  }
+  if (info.file.status === 'done') {
+    let result = info.file.response;
+    if(result.code == 200) {
+      message.success(`${info.file.name} ${formatMessage('page.upload.success', '涓婁紶鎴愬姛')}`);
+    }else {
+      message.error(result.msg);
+    }
+  } else if (info.file.status === 'error') {
+    message.error(`${info.file.name} file upload failed.`);
+  }
+};
+
 </script>
 
 <script>
@@ -261,11 +280,17 @@
           <template #overlay>
             <a-menu @click="handleSyncOrderClick">
               <a-menu-item key="import">
-                <UserOutlined />
-                {{ formatMessage('page.order.import', '鍗曟嵁瀵煎叆') }}
+                <a-upload v-model:file-list="fileList" name="file" action="/api/order/upload"
+                  @change="handleUploadChange" :showUploadList="false" :headers="{
+                    Authorization: globalState.token
+                  }">
+                  <UploadOutlined />
+                  {{ formatMessage('page.order.import', '鍗曟嵁瀵煎叆') }}
+                </a-upload>
               </a-menu-item>
+
               <a-menu-item key="export">
-                <UserOutlined />
+                <DownloadOutlined />
                 {{ formatMessage('page.order.export.template', '瀵煎嚭妯℃澘') }}
               </a-menu-item>
             </a-menu>
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderController.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderController.java
index 7a1dbf9..326c0ef 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderController.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderController.java
@@ -5,9 +5,13 @@
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.common.R;
 import com.zy.asrs.framework.exception.CoolException;
+import com.zy.asrs.wms.asrs.entity.MatField;
 import com.zy.asrs.wms.asrs.entity.OrderType;
+import com.zy.asrs.wms.asrs.entity.enums.OrderSettleType;
 import com.zy.asrs.wms.asrs.entity.param.CreateOrderParam;
 import com.zy.asrs.wms.asrs.entity.param.UpdateOrderParam;
+import com.zy.asrs.wms.asrs.entity.template.OrderTemplate;
+import com.zy.asrs.wms.asrs.service.MatFieldService;
 import com.zy.asrs.wms.asrs.service.OrderTypeService;
 import com.zy.asrs.wms.common.annotation.OperationLog;
 import com.zy.asrs.wms.common.domain.BaseParam;
@@ -21,6 +25,7 @@
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
 import java.util.*;
@@ -33,6 +38,8 @@
     private OrderService orderService;
     @Autowired
     private OrderTypeService orderTypeService;
+    @Autowired
+    private MatFieldService matFieldService;
 
     @PreAuthorize("hasAuthority('asrs:order:list')")
     @PostMapping("/order/page")
@@ -170,8 +177,65 @@
     @PreAuthorize("hasAuthority('asrs:order:list')")
     @PostMapping("/order/exportTemplate")
     public void exportTemplate(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
-        ArrayList<Order> list = new ArrayList<>();
-        ExcelUtil.build(ExcelUtil.create(list, Order.class), response);
+        ArrayList<OrderTemplate> list = new ArrayList<>();
+        List<MatField> locFields = matFieldService.getLocFields();
+        ExcelUtil.build(ExcelUtil.create(list, OrderTemplate.class, locFields), response);
+    }
+
+    @PostMapping("/order/upload")
+    public R upload(@RequestParam("file") MultipartFile file) {
+        List<OrderTemplate> list = ExcelUtil.parseExcelFile(file, OrderTemplate.class);
+
+        HashMap<String, Object> map = new HashMap<>();
+        for (OrderTemplate orderTemplate : list) {
+            if (!map.containsKey(orderTemplate.getOrderNo())) {
+                OrderType orderType = orderTypeService.getOne(new LambdaQueryWrapper<OrderType>().eq(OrderType::getName, orderTemplate.getOrderType()));
+                if (orderType == null) {
+                    throw new CoolException("璁㈠崟绫诲瀷涓嶅瓨鍦�");
+                }
+
+                HashMap<String, Object> paramMap = new HashMap<>();
+                ArrayList<HashMap<String, Object>> paramList = new ArrayList<>();
+                paramList.add(paramMap);
+
+                paramMap.put("matnr", orderTemplate.getMatnr());
+                paramMap.put("batch", orderTemplate.getBatch());
+                paramMap.put("anfme", orderTemplate.getAnfme());
+                paramMap.put("memo", orderTemplate.getMemo());
+                paramMap.putAll(orderTemplate.getDynamicFields());
+
+                CreateOrderParam orderParam = new CreateOrderParam();
+                orderParam.setOrderNo(orderTemplate.getOrderNo());
+                orderParam.setOrderType(orderType.getId());
+                orderParam.setOrderSettle(OrderSettleType.INIT.val());
+                orderParam.setList(paramList);
+
+                map.put(orderTemplate.getOrderNo(), orderParam);
+            }else {
+                CreateOrderParam orderParam = (CreateOrderParam) map.get(orderTemplate.getOrderNo());
+
+                HashMap<String, Object> paramMap = new HashMap<>();
+                paramMap.put("matnr", orderTemplate.getMatnr());
+                paramMap.put("batch", orderTemplate.getBatch());
+                paramMap.put("anfme", orderTemplate.getAnfme());
+                paramMap.put("memo", orderTemplate.getMemo());
+                paramMap.putAll(orderTemplate.getDynamicFields());
+
+                List<HashMap<String, Object>> paramList = orderParam.getList();
+                paramList.add(paramMap);
+
+                orderParam.setList(paramList);
+                map.put(orderTemplate.getOrderNo(), orderParam);
+            }
+        }
+
+        ArrayList<CreateOrderParam> orderParams = new ArrayList<>();
+        for (Map.Entry<String, Object> entry : map.entrySet()) {
+            CreateOrderParam orderParam = (CreateOrderParam) entry.getValue();
+            orderParams.add(orderParam);
+        }
+        orderService.createOrder(orderParams);
+        return R.ok();
     }
 
 }
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/template/OrderTemplate.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/template/OrderTemplate.java
new file mode 100644
index 0000000..2c39b94
--- /dev/null
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/template/OrderTemplate.java
@@ -0,0 +1,79 @@
+package com.zy.asrs.wms.asrs.entity.template;
+
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.zy.asrs.common.utils.Synchro;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Map;
+
+@Data
+public class OrderTemplate {
+
+    //璁㈠崟缂栧彿
+    @ApiModelProperty(value= "璁㈠崟缂栧彿")
+    private String orderNo;
+
+    //鍗曟嵁绫诲瀷
+    @ApiModelProperty(value= "鍗曟嵁绫诲瀷")
+    private String orderType;
+
+    //鐗╂枡鍙�
+    @ApiModelProperty(value= "鐗╂枡鍙�")
+    private String matnr;
+
+    //鎵瑰彿
+    @ApiModelProperty(value= "鎵瑰彿")
+    private String batch;
+
+    //鏁伴噺
+    @ApiModelProperty(value= "鏁伴噺")
+    private Double anfme;
+
+    //澶囨敞
+    @ApiModelProperty(value= "澶囨敞")
+    private String memo;
+
+    public void sync(Object source) {
+        Synchro.Copy(source, this);
+    }
+
+    //鍔ㄦ�佹墿灞曞瓧娈�
+    public transient Map<String, Object> dynamicFields = new HashMap<>();
+
+    @JsonAnyGetter
+    public Map<String,Object> getDynamicFields() {
+        return dynamicFields;
+    }
+
+    public void syncFieldMap(Map<String, Object> map) {
+        ArrayList<String> keys = new ArrayList<>();
+        Field[] fields = this.getClass().getDeclaredFields();
+        for (Field field : fields) {
+            keys.add(field.getName());
+        }
+        keys.add("detlId");
+
+        Map<String, Object> dynamicFields = new HashMap<>();
+        for (Map.Entry<String, Object> entry : map.entrySet()) {
+            if (keys.contains(entry.getKey())) {
+                continue;
+            }
+            dynamicFields.put(entry.getKey(), entry.getValue());
+        }
+
+        this.dynamicFields = dynamicFields;
+    }
+
+    public String getFieldString(String key) {
+        return dynamicFields.get(key).toString();
+    }
+
+    public void setField(String key, Object value) {
+        dynamicFields.put(key, value);
+    }
+
+}
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/OrderService.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/OrderService.java
index 5ef9147..1baa557 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/OrderService.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/OrderService.java
@@ -5,10 +5,14 @@
 import com.zy.asrs.wms.asrs.entity.param.CreateOrderParam;
 import com.zy.asrs.wms.asrs.entity.param.UpdateOrderParam;
 
+import java.util.List;
+
 public interface OrderService extends IService<Order> {
 
     boolean createOrder(CreateOrderParam param);
 
+    boolean createOrder(List<CreateOrderParam> list);
+
     boolean updateOrder(UpdateOrderParam param);
 
     boolean deleteOrder(Long orderId);
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/OrderServiceImpl.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/OrderServiceImpl.java
index b7dbae7..8ad4656 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/OrderServiceImpl.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/OrderServiceImpl.java
@@ -1,6 +1,7 @@
 package com.zy.asrs.wms.asrs.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.framework.exception.CoolException;
 import com.zy.asrs.wms.asrs.entity.*;
 import com.zy.asrs.wms.asrs.entity.param.CreateOrderParam;
@@ -28,6 +29,17 @@
     private OrderDetlService orderDetlService;
     @Autowired
     private OrderDetlFieldService orderDetlFieldService;
+    @Autowired
+    private OrderNoRuleService orderNoRuleService;
+
+    @Override
+    @Transactional
+    public boolean createOrder(List<CreateOrderParam> list) {
+        for (CreateOrderParam orderParam : list) {
+            createOrder(orderParam);
+        }
+        return true;
+    }
 
     @Override
     @Transactional
@@ -39,8 +51,13 @@
             throw new CoolException("璁㈠崟宸插瓨鍦�");
         }
 
+        String orderNo = param.getOrderNo();
+        if (Cools.isEmpty(param.getOrderNo())) {
+            orderNo = orderNoRuleService.getOrderNo(param.getOrderType().intValue());
+        }
+
         Order order = new Order();
-        order.setOrderNo(param.getOrderNo());
+        order.setOrderNo(orderNo);
         order.setOrderType(param.getOrderType());
         order.setOrderSettle(param.getOrderSettle());
         order.setOrderTime(format.format(new Date()));
@@ -55,8 +72,14 @@
             double anfme = Double.parseDouble(map.get("anfme").toString());
             String batch = map.get("batch").toString();
             String matnr = map.get("matnr").toString();
-            Double qty = Double.parseDouble(map.get("qty").toString());
-            Double workQty = Double.parseDouble(map.get("workQty").toString());
+            Double qty = 0D;
+            Double workQty = 0D;
+            if (map.containsKey("qty")) {
+                qty = Double.parseDouble(map.get("qty").toString());
+            }
+            if (map.containsKey("workQty")) {
+                workQty = Double.parseDouble(map.get("workQty").toString());
+            }
             String memo = map.getOrDefault("memo", "").toString();
             Mat mat = matService.getOne(new LambdaQueryWrapper<Mat>().eq(Mat::getMatnr, matnr));
             if (mat == null) {
diff --git a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/ExcelUtil.java b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/ExcelUtil.java
index 1fc6dce..b0dcfa6 100644
--- a/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/ExcelUtil.java
+++ b/zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/ExcelUtil.java
@@ -2,21 +2,22 @@
 
 import com.zy.asrs.framework.common.Cools;
 import com.zy.asrs.wms.asrs.entity.MatField;
+import com.zy.asrs.wms.asrs.entity.template.OrderTemplate;
 import io.swagger.annotations.ApiModelProperty;
 import org.apache.poi.hssf.usermodel.HSSFWorkbook;
-import org.apache.poi.ss.usermodel.Row;
-import org.apache.poi.ss.usermodel.Sheet;
-import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.ss.usermodel.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.lang.reflect.Field;
+import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.net.URLEncoder;
 import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 /**
  * Created by vincent on 2/17/2024
@@ -52,7 +53,7 @@
             }
             String memo = "鏈煡";
             if (field.isAnnotationPresent(ApiModelProperty.class)) {
-                memo = field.getAnnotation(ApiModelProperty.class).value();
+                memo = field.getAnnotation(ApiModelProperty.class).value() + "[" + field.getName() + "]";
             }
             header.createCell(headerIdx).setCellValue(memo);
             headerIdx++;
@@ -61,7 +62,7 @@
         //鍔ㄦ�佸瓧娈�
         if(dynamicFields != null){
             for (MatField field : dynamicFields) {
-                header.createCell(headerIdx).setCellValue(field.getDescribe());
+                header.createCell(headerIdx).setCellValue(field.getDescribe() + "[" + field.getName() + "]");
                 headerIdx++;
             }
         }
@@ -125,6 +126,91 @@
         return workbook;
     }
 
+    public static <T> List<T> parseExcelFile(MultipartFile file, Class<T> clz) {
+        List<T> dataList = new ArrayList<>();
+        try (Workbook workbook = new HSSFWorkbook(file.getInputStream())) {
+            ArrayList<HashMap<String, Object>> list = new ArrayList<>();
+            ArrayList<String> fields = new ArrayList<>();
 
+            Sheet sheet = workbook.getSheetAt(0);
+            for (Row row : sheet) {
+                HashMap<String, Object> map = new HashMap<>();
+                if (!fields.isEmpty()) {
+                    for (String field : fields) {
+                        map.put(field, null);
+                    }
+                    list.add(map);
+                }
+
+                for (Cell cell : row) {
+                    if (cell.getRowIndex() == 0) {
+                        Pattern pattern = Pattern.compile("\\[(.*?)\\]");
+                        Matcher matcher = pattern.matcher(cell.getStringCellValue());
+                        while (matcher.find()) {
+                            fields.add(matcher.group(1));
+                        }
+                    }else {
+                        String value = "";
+                        if(cell.getCellType() == CellType.NUMERIC.getCode()) {
+                            // 鍏堝皢鏁板瓧杞崲涓哄瓧绗︿覆
+                            value = String.valueOf(cell.getNumericCellValue());
+                            // 澶勭悊瀛楃涓瞯alue
+                        } else if(cell.getCellType() == CellType.STRING.getCode()) {
+                            // 鐩存帴鑾峰彇瀛楃涓插��
+                            value = cell.getStringCellValue();
+                            // 澶勭悊瀛楃涓瞯alue
+                        }
+                        map.put(fields.get(cell.getColumnIndex()), value);
+                    }
+                }
+
+            }
+
+            for (HashMap<String, Object> map : list) {
+                T t = ExcelUtil.parseData(clz, map);
+                dataList.add(t);
+            }
+
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        return dataList;
+    }
+
+    public static <T> T parseData(Class<T> clz, Map<String, Object> map) {
+        try {
+            T newInstance = clz.newInstance();
+            Field[] fields = Cools.getAllFields(clz);
+            for (Field field : fields) {
+                field.setAccessible(true);
+                if (!map.containsKey(field.getName())) {
+                    if (Modifier.isTransient(field.getModifiers()) && field.getName().equals("dynamicFields")) {
+                        Method method = clz.getMethod("syncFieldMap", Map.class);
+                        method.invoke(newInstance, map);
+                    }
+                    continue;
+                }
+                if (map.get(field.getName()) == null) {
+                    continue;
+                }
+                // 鍒ゆ柇瀛楁绫诲瀷骞惰祴鍊�
+                if (field.getType() == String.class) {
+                    field.set(newInstance, String.valueOf(map.get(field.getName())));
+                } else if (field.getType() == Integer.class) {
+                    field.set(newInstance, Integer.parseInt(map.get(field.getName()).toString()));
+                } else if (field.getType() == Float.class) {
+                    field.set(newInstance, Float.parseFloat(map.get(field.getName()).toString()));
+                } else if (field.getType() == Double.class) {
+                    field.set(newInstance, Double.parseDouble(map.get(field.getName()).toString()));
+                } else if (field.getType() == Boolean.class) {
+                    field.set(newInstance, Boolean.parseBoolean(map.get(field.getName()).toString()));
+                }
+            }
+            return newInstance;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
 
 }

--
Gitblit v1.9.1