zy-asrs-admin/src/components/order/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/controller/OrderController.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/entity/template/OrderTemplate.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/OrderService.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-asrs-wms/src/main/java/com/zy/asrs/wms/asrs/service/impl/OrderServiceImpl.java | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
zy-asrs-wms/src/main/java/com/zy/asrs/wms/utils/ExcelUtil.java | ●●●●● 补丁 | 查看 | 原始文档 | 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; } }