#
Junjie
2024-08-03 925d49633816fb3b3b25adffa3c31a705f8d5bbb
#
1个文件已添加
5个文件已修改
315 ■■■■■ 已修改文件
zy-asrs-admin/src/components/order/index.vue 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderController.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/template/OrderTemplate.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/OrderService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/OrderServiceImpl.java 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/ExcelUtil.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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>
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();
    }
}
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/template/OrderTemplate.java
New file
@@ -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);
    }
}
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);
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) {
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());
                            // 处理字符串value
                        } else if(cell.getCellType() == CellType.STRING.getCode()) {
                            // 直接获取字符串值
                            value = cell.getStringCellValue();
                            // 处理字符串value
                        }
                        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;
    }
}