Commit 635017c4 LN

工单上传功能。

1 个父辈 1e55b1ef
...@@ -5,9 +5,11 @@ import com.google.common.collect.Lists; ...@@ -5,9 +5,11 @@ import com.google.common.collect.Lists;
import com.neotel.smfcore.common.annotation.QueryCondition; import com.neotel.smfcore.common.annotation.QueryCondition;
import com.neotel.smfcore.common.bean.PageData; import com.neotel.smfcore.common.bean.PageData;
import com.neotel.smfcore.common.bean.ResultBean; import com.neotel.smfcore.common.bean.ResultBean;
import com.neotel.smfcore.common.csv.CsvReader;
import com.neotel.smfcore.common.exception.BadRequestException; import com.neotel.smfcore.common.exception.BadRequestException;
import com.neotel.smfcore.common.exception.ValidateException; import com.neotel.smfcore.common.exception.ValidateException;
import com.neotel.smfcore.common.utils.Constants; import com.neotel.smfcore.common.utils.Constants;
import com.neotel.smfcore.common.utils.FileUtil;
import com.neotel.smfcore.common.utils.QueryHelp; import com.neotel.smfcore.common.utils.QueryHelp;
import com.neotel.smfcore.common.utils.SecurityUtils; import com.neotel.smfcore.common.utils.SecurityUtils;
import com.neotel.smfcore.core.order.LiteOrderCache; import com.neotel.smfcore.core.order.LiteOrderCache;
...@@ -17,7 +19,12 @@ import com.neotel.smfcore.core.order.rest.bean.query.OrderQueryCondition; ...@@ -17,7 +19,12 @@ import com.neotel.smfcore.core.order.rest.bean.query.OrderQueryCondition;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderItemManager; import com.neotel.smfcore.core.order.service.manager.ILiteOrderItemManager;
import com.neotel.smfcore.core.order.service.manager.ILiteOrderManager; import com.neotel.smfcore.core.order.service.manager.ILiteOrderManager;
import com.neotel.smfcore.core.order.service.po.LiteOrder; import com.neotel.smfcore.core.order.service.po.LiteOrder;
import com.neotel.smfcore.core.order.service.po.LiteOrderItem;
import com.neotel.smfcore.core.storage.service.po.Storage;
import com.neotel.smfcore.core.storage.service.po.StoragePos;
import com.neotel.smfcore.core.system.rest.bean.mapstruct.TaskMapper; import com.neotel.smfcore.core.system.rest.bean.mapstruct.TaskMapper;
import com.neotel.smfcore.security.annotation.AnonymousAccess;
import com.neotel.smfcore.security.bean.FileProperties;
import com.neotel.smfcore.security.rest.bean.vo.UserPassVo; import com.neotel.smfcore.security.rest.bean.vo.UserPassVo;
import com.neotel.smfcore.security.service.manager.IGroupManager; import com.neotel.smfcore.security.service.manager.IGroupManager;
import com.neotel.smfcore.security.service.manager.IRoleManager; import com.neotel.smfcore.security.service.manager.IRoleManager;
...@@ -29,6 +36,7 @@ import io.swagger.annotations.Api; ...@@ -29,6 +36,7 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
...@@ -41,6 +49,8 @@ import org.springframework.validation.annotation.Validated; ...@@ -41,6 +49,8 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.List; import java.util.List;
import java.util.Set; import java.util.Set;
...@@ -69,6 +79,8 @@ public class OrderController { ...@@ -69,6 +79,8 @@ public class OrderController {
@Autowired @Autowired
private LiteOrderCache liteOrderCache; private LiteOrderCache liteOrderCache;
@Autowired
private final FileProperties properties;
// @ApiOperation("导出用户数据") // @ApiOperation("导出用户数据")
// @GetMapping(value = "/download") // @GetMapping(value = "/download")
// @PreAuthorize("@el.check('user:list')") // @PreAuthorize("@el.check('user:list')")
...@@ -78,9 +90,36 @@ public class OrderController { ...@@ -78,9 +90,36 @@ public class OrderController {
@ApiOperation("上传工单") @ApiOperation("上传工单")
@PostMapping(value = "/upload") @PostMapping(value = "/upload")
public ResultBean updateAvatar(@RequestParam MultipartFile orderFile){ @AnonymousAccess
public ResultBean updateAvatar(@RequestParam MultipartFile orderFile) {
return null; String image = "csv";
String fileType = FileUtil.getExtensionName(orderFile.getOriginalFilename());
if (fileType != null && !image.contains(fileType)) {
throw new BadRequestException("文件格式错误!, 仅支持 " + image + " 格式");
}
File folder = new File(properties.getPath(), "pos");
File localFile = FileUtil.upload(orderFile, folder.getAbsolutePath());
List<LiteOrderItem> liteOrderItems = handleOrderCsv(localFile.getAbsolutePath());
if (liteOrderItems == null || liteOrderItems.size() <= 0) {
throw new BadRequestException("文件解析失败");
}
LiteOrder liteOrder = new LiteOrder(localFile.getName(), liteOrderItems);
liteOrder.setSource(localFile.getAbsolutePath());
LiteOrder dbOrder = liteOrderManager.findByOrderNo(liteOrder.getOrderNo());
if (dbOrder == null) {
log.info("新增加订单:" + liteOrder.getOrderNo());
liteOrder = liteOrderManager.createWithItems(liteOrder);
// TaskService.liteOrderMap.put(liteOrder.getOrderNo(), liteOrder);
} else {
log.info("数据库中已存在工单号为[" + liteOrder.getOrderNo() + "],忽略文件:" + localFile.getAbsolutePath());
throw new BadRequestException("工单号[" + liteOrder.getOrderNo() + "]已存在");
}
return ResultBean.newOkResult("工单上传成功");
} }
@ApiOperation("工单出库") @ApiOperation("工单出库")
...@@ -95,22 +134,22 @@ public class OrderController { ...@@ -95,22 +134,22 @@ public class OrderController {
@ApiOperation("查询工单") @ApiOperation("查询工单")
@GetMapping @GetMapping
@PreAuthorize("@el.check('order:list')") @PreAuthorize("@el.check('order:list')")
public PageData<OrderDto> query(OrderQueryCondition criteria, Pageable pageable){ public PageData<OrderDto> query(OrderQueryCondition criteria, Pageable pageable) {
User user = userManager.findByUserName(SecurityUtils.getCurrentUsername()); User user = userManager.findByUserName(SecurityUtils.getCurrentUsername());
if(user != null){ if (user != null) {
//数据权限 //数据权限
if(!user.getIsAdmin()){ if (!user.getIsAdmin()) {
Set<String> groupIds = user.getGroups(); Set<String> groupIds = user.getGroups();
List<String> groupNames = Lists.newArrayList(); List<String> groupNames = Lists.newArrayList();
if(!ObjectUtils.isEmpty(groupIds)){ if (!ObjectUtils.isEmpty(groupIds)) {
for (String groupId : groupIds) { for (String groupId : groupIds) {
Group group = groupManager.get(groupId); Group group = groupManager.get(groupId);
groupNames.add(group.getGroupName()); groupNames.add(group.getGroupName());
} }
} }
//都没有权限,返回空 //都没有权限,返回空
if(ObjectUtils.isEmpty(groupNames)){ if (ObjectUtils.isEmpty(groupNames)) {
return new PageData<>(Lists.newArrayList(),0); return new PageData<>(Lists.newArrayList(), 0);
} }
criteria.setSourceList(groupNames); criteria.setSourceList(groupNames);
} }
...@@ -118,4 +157,66 @@ public class OrderController { ...@@ -118,4 +157,66 @@ public class OrderController {
PageData<LiteOrder> orderList = liteOrderManager.findByPage(QueryHelp.getQuery(criteria), pageable); PageData<LiteOrder> orderList = liteOrderManager.findByPage(QueryHelp.getQuery(criteria), pageable);
return orderMapper.toDto(orderList); return orderMapper.toDto(orderList);
} }
private int getCsvIndex(CsvReader csvReader, String titleName, String titleNameEn) {
int index = csvReader.getIndex(titleName, titleNameEn);
if (index == -1) {
log.info("未包含【" + titleName + "】或【" + titleNameEn + "】列");
throw new ValidateException("必须包含[" + titleNameEn + "]列");
}
return index;
}
protected List<LiteOrderItem> handleOrderCsv(String fileURL) {
try {
log.info("开始更解析上传的工单");
List<LiteOrderItem> items = Lists.newArrayList();
CsvReader csvRead = new CsvReader(fileURL);
csvRead.setSkipEmptyRecords(true);//忽略空行
csvRead.setTrimWhitespace(true);//去除空格
csvRead.readHeaders();
int partNumberIndex = csvRead.getIndex("PN", "PN");
int qtyIndex = csvRead.getIndex("NUM", "QTY");
int feederIndex = csvRead.getIndex("FEEDER", "FEEDER");
int row = 1;
int newRowCount = 0;
int updateRowCount = 0;
while (csvRead.readRecord()) {
row++;
String[] lineValues = csvRead.getValues();
String partNumber = lineValues[partNumberIndex];
if (partNumber.isEmpty()) {
log.warn("行[partNumber=" + partNumber + "]中PN 为空,此行忽略");
} else {
int num = 1;
if (qtyIndex != -1) {
String numStr = lineValues[qtyIndex];
if (Strings.isNotBlank(numStr)) {
try {
num = Integer.valueOf(numStr);
} catch (Exception e) {
log.error(partNumber + "的数量:" + numStr + " 不是数字,使用1");
}
}
}
String feeder = "";
if (feederIndex != -1) {
feeder = lineValues[feederIndex];
}
LiteOrderItem item = new LiteOrderItem();
item.setPn(partNumber);
item.setNeedNum(num);
item.setFeederInfo(feeder);
items.add(item);
}
}
return items;
} catch (Exception ex) {
log.error("解析上传的工单出错:" + ex.toString());
}
return null;
}
} }
支持 Markdown 格式
你添加了 0 到此讨论。请谨慎行事。
Finish editing this message first!