feat(device): 新增设备导入导出功能
- 新增设备导入模板下载功能 - 实现设备新增导入功能,包括数据校验和错误反馈 - 添加设备更新导入功能,支持修改现有设备信息 - 优化设备导出功能,支持导出选中的设备- 新增设备状态和质保状态的字典项
This commit is contained in:
parent
63a587f39e
commit
cd1775a297
|
|
@ -1,7 +1,10 @@
|
||||||
package com.nflg.mobilebroken.admin.controller;
|
package com.nflg.mobilebroken.admin.controller;
|
||||||
|
|
||||||
import cn.hutool.core.collection.CollUtil;
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.hutool.core.collection.CollectionUtil;
|
||||||
import cn.hutool.core.convert.Convert;
|
import cn.hutool.core.convert.Convert;
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import cn.hutool.json.JSONUtil;
|
||||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
import com.nflg.mobilebroken.admin.annotation.ApiMark;
|
import com.nflg.mobilebroken.admin.annotation.ApiMark;
|
||||||
|
|
@ -9,31 +12,38 @@ import com.nflg.mobilebroken.admin.pojo.dto.DeviceDTO;
|
||||||
import com.nflg.mobilebroken.admin.pojo.dto.SyncFromCrmDTO;
|
import com.nflg.mobilebroken.admin.pojo.dto.SyncFromCrmDTO;
|
||||||
import com.nflg.mobilebroken.admin.pojo.query.DeviceQuery;
|
import com.nflg.mobilebroken.admin.pojo.query.DeviceQuery;
|
||||||
import com.nflg.mobilebroken.admin.pojo.vo.DeviceDetailResultVO;
|
import com.nflg.mobilebroken.admin.pojo.vo.DeviceDetailResultVO;
|
||||||
import com.nflg.mobilebroken.admin.pojo.vo.DeviceExcelVO;
|
|
||||||
import com.nflg.mobilebroken.admin.service.AdminDeviceService;
|
import com.nflg.mobilebroken.admin.service.AdminDeviceService;
|
||||||
|
import com.nflg.mobilebroken.common.constant.Constant;
|
||||||
import com.nflg.mobilebroken.common.constant.STATE;
|
import com.nflg.mobilebroken.common.constant.STATE;
|
||||||
import com.nflg.mobilebroken.common.exception.NflgException;
|
|
||||||
import com.nflg.mobilebroken.common.pojo.ApiResult;
|
import com.nflg.mobilebroken.common.pojo.ApiResult;
|
||||||
import com.nflg.mobilebroken.common.pojo.PageData;
|
import com.nflg.mobilebroken.common.pojo.PageData;
|
||||||
import com.nflg.mobilebroken.common.util.EecExcelUtil;
|
import com.nflg.mobilebroken.common.pojo.dto.DeviceAddImportDTO;
|
||||||
import com.nflg.mobilebroken.common.util.VUtils;
|
import com.nflg.mobilebroken.common.pojo.dto.DeviceUpdateImportDTO;
|
||||||
import com.nflg.mobilebroken.repository.entity.Device;
|
import com.nflg.mobilebroken.common.util.*;
|
||||||
import com.nflg.mobilebroken.repository.entity.DictionaryItem;
|
import com.nflg.mobilebroken.repository.entity.*;
|
||||||
import com.nflg.mobilebroken.repository.service.IDeviceService;
|
import com.nflg.mobilebroken.repository.service.*;
|
||||||
import com.nflg.mobilebroken.repository.service.IDictionaryItemService;
|
|
||||||
import com.nflg.mobilebroken.starter.annotation.MethodInfoMark;
|
import com.nflg.mobilebroken.starter.annotation.MethodInfoMark;
|
||||||
|
import org.springframework.core.io.ClassPathResource;
|
||||||
|
import org.springframework.http.HttpHeaders;
|
||||||
|
import org.springframework.http.MediaType;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
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 org.ttzero.excel.entity.ListSheet;
|
import org.ttzero.excel.entity.TemplateSheet;
|
||||||
|
import org.ttzero.excel.entity.Workbook;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
|
import javax.validation.constraints.NotEmpty;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.List;
|
import java.net.URLEncoder;
|
||||||
import java.util.Map;
|
import java.nio.file.Paths;
|
||||||
import java.util.Objects;
|
import java.time.LocalDate;
|
||||||
import java.util.Set;
|
import java.time.LocalDateTime;
|
||||||
|
import java.time.format.DateTimeFormatter;
|
||||||
|
import java.time.format.DateTimeParseException;
|
||||||
|
import java.util.*;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -54,6 +64,18 @@ public class DeviceController extends ControllerBase {
|
||||||
@Resource
|
@Resource
|
||||||
IDictionaryItemService dictionaryItemService;
|
IDictionaryItemService dictionaryItemService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private ITBaseCustomerService customerService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private ITBaseAreaService areaService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private ITBaseDeviceTypeService deviceTypeService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private IDeviceComponentService deviceComponentService;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取设备列表
|
* 获取设备列表
|
||||||
|
|
@ -156,64 +178,64 @@ public class DeviceController extends ControllerBase {
|
||||||
return ApiResult.success(true);
|
return ApiResult.success(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("downTemplate")
|
// @GetMapping("downTemplate")
|
||||||
@ApiMark(moduleName = "设备管理", apiName = "导入模板下载")
|
// @ApiMark(moduleName = "设备管理", apiName = "导入模板下载")
|
||||||
// @MethodInfoMark(value = "导入模板下载",menuName = "设备管理")
|
//// @MethodInfoMark(value = "导入模板下载",menuName = "设备管理")
|
||||||
public void downTemplate(HttpServletResponse response) throws IOException {
|
// public void downTemplate(HttpServletResponse response) throws IOException {
|
||||||
EecExcelUtil.setResponseExcelHeader(response,"设备导入模板");
|
// EecExcelUtil.setResponseExcelHeader(response,"设备导入模板");
|
||||||
|
//
|
||||||
|
// final ListSheet<DeviceExcelVO> listSheet = new ListSheet<DeviceExcelVO>() {
|
||||||
|
// @Override
|
||||||
|
// protected List<DeviceExcelVO> more() {
|
||||||
|
// return null;
|
||||||
|
// }
|
||||||
|
// };
|
||||||
|
// EecExcelUtil.eecExcel("设备导入模板", listSheet, response);
|
||||||
|
// }
|
||||||
|
|
||||||
final ListSheet<DeviceExcelVO> listSheet = new ListSheet<DeviceExcelVO>() {
|
// /**
|
||||||
@Override
|
// * 导出设备
|
||||||
protected List<DeviceExcelVO> more() {
|
// * @param response
|
||||||
return null;
|
// * @throws IOException
|
||||||
}
|
// */
|
||||||
};
|
// @GetMapping("exportData")
|
||||||
EecExcelUtil.eecExcel("设备导入模板", listSheet, response);
|
//// @MethodInfoMark(value = "导出设备",menuName = "设备管理")
|
||||||
}
|
// @ApiMark(moduleName = "设备管理", apiName = "导出设备")
|
||||||
|
// public void exportData(HttpServletResponse response) throws IOException {
|
||||||
|
//
|
||||||
|
// EecExcelUtil.setResponseExcelHeader(response,"设备列表");
|
||||||
|
//
|
||||||
|
// final ListSheet<DeviceExcelVO> listSheet = new ListSheet<DeviceExcelVO>() {
|
||||||
|
// int i=0;
|
||||||
|
// @Override
|
||||||
|
// protected List<DeviceExcelVO> more() {
|
||||||
|
//
|
||||||
|
// List<Device> list = deviceService.list();
|
||||||
|
// i++;
|
||||||
|
// return i>1?null : Convert.toList(DeviceExcelVO.class, list);
|
||||||
|
// }
|
||||||
|
// };
|
||||||
|
// EecExcelUtil.eecExcel("设备列表", listSheet, response);
|
||||||
|
// }
|
||||||
|
|
||||||
/**
|
// /**
|
||||||
* 导出设备
|
// * 导入设备
|
||||||
* @param response
|
// * @param file
|
||||||
* @throws IOException
|
// * @return
|
||||||
*/
|
// */
|
||||||
@GetMapping("exportData")
|
// @PostMapping("importData")
|
||||||
// @MethodInfoMark(value = "导出设备",menuName = "设备管理")
|
// @ApiMark(moduleName = "设备管理", apiName = "导入设备")
|
||||||
@ApiMark(moduleName = "设备管理", apiName = "导出设备")
|
// public ApiResult<Boolean> importData( @RequestParam(value = "file") MultipartFile file){
|
||||||
public void exportData(HttpServletResponse response) throws IOException {
|
//
|
||||||
|
// try {
|
||||||
EecExcelUtil.setResponseExcelHeader(response,"设备列表");
|
// List<DeviceExcelVO> data = EecExcelUtil.getExcelContext(file.getInputStream(), DeviceExcelVO.class);
|
||||||
|
// VUtils.trueThrowBusinessError(CollUtil.isEmpty(data)).throwMessage("导入文件内容为空");
|
||||||
final ListSheet<DeviceExcelVO> listSheet = new ListSheet<DeviceExcelVO>() {
|
// adminDeviceService.importData(data);
|
||||||
int i=0;
|
// } catch (IOException e) {
|
||||||
@Override
|
// throw new NflgException(STATE.BusinessError, "导出失败:"+e.getMessage());
|
||||||
protected List<DeviceExcelVO> more() {
|
// }
|
||||||
|
// return ApiResult.success(true);
|
||||||
List<Device> list = deviceService.list();
|
// }
|
||||||
i++;
|
|
||||||
return i>1?null : Convert.toList(DeviceExcelVO.class, list);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
EecExcelUtil.eecExcel("设备列表", listSheet, response);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 导入设备
|
|
||||||
* @param file
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
@PostMapping("importData")
|
|
||||||
@ApiMark(moduleName = "设备管理", apiName = "导入设备")
|
|
||||||
public ApiResult<Boolean> importData( @RequestParam(value = "file") MultipartFile file){
|
|
||||||
|
|
||||||
try {
|
|
||||||
List<DeviceExcelVO> data = EecExcelUtil.getExcelContext(file.getInputStream(), DeviceExcelVO.class);
|
|
||||||
VUtils.trueThrowBusinessError(CollUtil.isEmpty(data)).throwMessage("导入文件内容为空");
|
|
||||||
adminDeviceService.importData(data);
|
|
||||||
} catch (IOException e) {
|
|
||||||
throw new NflgException(STATE.BusinessError, "导出失败:"+e.getMessage());
|
|
||||||
}
|
|
||||||
return ApiResult.success(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -228,4 +250,423 @@ public class DeviceController extends ControllerBase {
|
||||||
return ApiResult.success(true);
|
return ApiResult.success(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 下载导入模板(新增)
|
||||||
|
*/
|
||||||
|
@GetMapping("downTemplateForAdd")
|
||||||
|
@ApiMark(moduleName = "设备管理", apiName = "下载导入模板(新增)")
|
||||||
|
public void downTemplateForAdd(HttpServletResponse response) throws Exception {
|
||||||
|
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
|
||||||
|
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode("设备新增导入模板.xlsx", "UTF-8"));
|
||||||
|
ClassPathResource resource = new ClassPathResource("templates/设备新增导入模板.xlsx");
|
||||||
|
List<DeviceAddImportDTO> datas = new ArrayList<>();
|
||||||
|
new Workbook()
|
||||||
|
.addSheet(new TemplateSheet(Paths.get(resource.getURI()))
|
||||||
|
.setData(datas)
|
||||||
|
.setData("@list:deviceStateDesc", dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_DEVICE_STATE)
|
||||||
|
.stream().map(DictionaryItem::getName).collect(Collectors.toList())))
|
||||||
|
.writeTo(response.getOutputStream());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 新增导入
|
||||||
|
* @param file 文件
|
||||||
|
*/
|
||||||
|
@Transactional
|
||||||
|
@PostMapping("importForAdd")
|
||||||
|
@ApiMark(moduleName = "设备管理", apiName = "新增导入")
|
||||||
|
public void importForAdd(HttpServletResponse response, @RequestParam(value = "file") MultipartFile file) throws IOException {
|
||||||
|
List<DeviceAddImportDTO> data = EecExcelUtil.getExcelContext(file.getInputStream(), DeviceAddImportDTO.class);
|
||||||
|
VUtils.trueThrowBusinessError(CollectionUtil.isEmpty(data)).throwMessage("导入文件内容为空");
|
||||||
|
if (addCheckAndImport(data)) {
|
||||||
|
response.setContentType("application/json");
|
||||||
|
response.setCharacterEncoding("UTF-8");
|
||||||
|
byte[] datas = StrUtil.bytes(JSONUtil.toJsonStr(ApiResult.success()));
|
||||||
|
response.getOutputStream().write(datas, 0, datas.length);
|
||||||
|
} else {
|
||||||
|
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
|
||||||
|
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode("设备新增.xlsx", "UTF-8"));
|
||||||
|
ClassPathResource resource = new ClassPathResource("templates/设备新增导入模板.xlsx");
|
||||||
|
new Workbook()
|
||||||
|
.addSheet(new TemplateSheet(Paths.get(resource.getURI()))
|
||||||
|
.setData(data)
|
||||||
|
.setData("@list:deviceStateDesc", dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_DEVICE_STATE)
|
||||||
|
.stream().map(DictionaryItem::getName).collect(Collectors.toList())))
|
||||||
|
.writeTo(response.getOutputStream());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
public boolean addCheckAndImport(List<DeviceAddImportDTO> data) {
|
||||||
|
List<DictionaryItem> states = dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_DEVICE_STATE);
|
||||||
|
List<DictionaryItem> warrantyStates = dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_DEVICE_WARRANTY_STATE);
|
||||||
|
List<Device> devices = new ArrayList<>();
|
||||||
|
List<TBaseDeviceType> deviceTypes = new ArrayList<>();
|
||||||
|
List<DeviceComponent> deviceComponents = new ArrayList<>();
|
||||||
|
for (DeviceAddImportDTO dto : data) {
|
||||||
|
Device device = new Device();
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
device.setDeviceNo(dto.getDeviceNo());
|
||||||
|
if (StrUtil.isBlank(dto.getDeviceNo())) {
|
||||||
|
sb.append("设备编号不能为空;");
|
||||||
|
}
|
||||||
|
device.setDeviceName(dto.getDeviceName());
|
||||||
|
device.setDeviceType(dto.getDeviceType());
|
||||||
|
if (StrUtil.isBlank(dto.getDeviceType())) {
|
||||||
|
sb.append("设备类型不能为空;");
|
||||||
|
}
|
||||||
|
device.setDeviceTypeSub(dto.getDeviceTypeSub());
|
||||||
|
if (StrUtil.isBlank(dto.getDeviceTypeSub())) {
|
||||||
|
sb.append("设备类型细分不能为空;");
|
||||||
|
}
|
||||||
|
device.setModelNo(dto.getModelNo());
|
||||||
|
if (StrUtil.isBlank(dto.getModelNo())) {
|
||||||
|
sb.append("设备机型不能为空;");
|
||||||
|
}
|
||||||
|
if (StrUtil.isBlank(dto.getDeviceStateDesc())) {
|
||||||
|
sb.append("设备状态不能为空;");
|
||||||
|
} else {
|
||||||
|
DictionaryItem state = states.stream().filter(s -> StrUtil.equals(s.getName(), dto.getDeviceStateDesc())).findFirst().orElse(null);
|
||||||
|
if (Objects.isNull(state)) {
|
||||||
|
sb.append("设备状态无效;");
|
||||||
|
} else {
|
||||||
|
device.setDeviceState(state.getId());
|
||||||
|
if (StrUtil.isNotBlank(dto.getDeviceNo()) && StrUtil.equals(state.getCode(), "Normal")
|
||||||
|
&& deviceService.lambdaQuery().eq(Device::getDeviceNo, dto.getDeviceNo()).eq(Device::getDeviceState, state.getId()).exists()) {
|
||||||
|
sb.append("设备已存在;");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
device.setCustomerId(0);
|
||||||
|
device.setCustomerName(dto.getCustomerName());
|
||||||
|
if (StrUtil.isNotBlank(dto.getAgentName())) {
|
||||||
|
TBaseCustomer customer = customerService.lambdaQuery()
|
||||||
|
.eq(TBaseCustomer::getDelIs, 0)
|
||||||
|
.eq(TBaseCustomer::getAgencyCompanyName, dto.getAgentName())
|
||||||
|
.one();
|
||||||
|
if (Objects.isNull(customer)) {
|
||||||
|
sb.append("代理商不存在;");
|
||||||
|
} else if (customer.getEnableState() == 0) {
|
||||||
|
sb.append("代理商状态为禁用;");
|
||||||
|
} else {
|
||||||
|
device.setAgentName(customer.getAgencyCompanyName());
|
||||||
|
device.setAgentCode(customer.getAgencyCompanyCode());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (StrUtil.isNotBlank(dto.getAreaName())) {
|
||||||
|
TBaseArea area = areaService.lambdaQuery().eq(TBaseArea::getDelIs, 0).eq(TBaseArea::getAreaName, dto.getAreaName()).one();
|
||||||
|
if (Objects.isNull(area)) {
|
||||||
|
sb.append("区域不存在;");
|
||||||
|
} else if (area.getAreaState().intValue() == 0) {
|
||||||
|
sb.append("区域为禁用;");
|
||||||
|
} else {
|
||||||
|
device.setAreaName(area.getAreaName());
|
||||||
|
device.setAreaCode(area.getAreaCode());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (StrUtil.isNotBlank(dto.getShipmentDate())) {
|
||||||
|
try {
|
||||||
|
LocalDate date = LocalDate.parse(dto.getShipmentDate(), DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
||||||
|
device.setShipmentDate(DateTimeUtil.asSystemDate(date));
|
||||||
|
} catch (DateTimeParseException e) {
|
||||||
|
sb.append("发货日期无效;");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (StrUtil.isNotBlank(dto.getStartWarrantyDate())) {
|
||||||
|
try {
|
||||||
|
LocalDate date = LocalDate.parse(dto.getStartWarrantyDate(), DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
||||||
|
device.setStartWarrantyDate(DateTimeUtil.asSystemDate(date));
|
||||||
|
if (StrUtil.isBlank(dto.getWarrantyMonth())) {
|
||||||
|
sb.append("质保期不能为空;");
|
||||||
|
} else {
|
||||||
|
int month = Integer.parseInt(dto.getWarrantyMonth());
|
||||||
|
device.setWarrantyMonth(month);
|
||||||
|
if (date.isAfter(LocalDate.now())) {
|
||||||
|
device.setWarrantyState(warrantyStates.stream().filter(s -> StrUtil.equals(s.getCode(), "NotStarted")).findFirst().get().getId());
|
||||||
|
} else if (date.plusMonths(month).isAfter(LocalDate.now())) {
|
||||||
|
device.setWarrantyState(warrantyStates.stream().filter(s -> StrUtil.equals(s.getCode(), "WithinWarranty")).findFirst().get().getId());
|
||||||
|
} else {
|
||||||
|
device.setWarrantyState(warrantyStates.stream().filter(s -> StrUtil.equals(s.getCode(), "OutsideWarranty")).findFirst().get().getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (DateTimeParseException e) {
|
||||||
|
sb.append("开始质保日期无效;");
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
sb.append("质保期无效;");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
device.setDataValidState(true);
|
||||||
|
device.setSourceFrom(3);
|
||||||
|
device.setCreateBy(AdminUserUtil.getUserName());
|
||||||
|
device.setCreateTime(LocalDateTime.now());
|
||||||
|
device.setRemark("从excel新增");
|
||||||
|
dto.setError(sb.toString());
|
||||||
|
if (StrUtil.isBlank(dto.getError())){
|
||||||
|
devices.add(device);
|
||||||
|
if (!deviceTypeService.lambdaQuery().eq(TBaseDeviceType::getDeviceType, dto.getDeviceType()).exists()){
|
||||||
|
TBaseDeviceType ent = new TBaseDeviceType();
|
||||||
|
ent.setDeviceTypeCode(UniqueSequenceGenerator.generateCode(com.nflg.mobilebroken.admin.constant.Constant.DeviceTypeCodePrefix));
|
||||||
|
ent.setDeviceType(dto.getDeviceType());
|
||||||
|
ent.setDeviceState(Boolean.TRUE);
|
||||||
|
ent.setDataCreateUserNo(AdminUserUtil.getUserNo());
|
||||||
|
ent.setDataCreateUserName(AdminUserUtil.getUserName());
|
||||||
|
ent.setDataCreateTime(LocalDateTime.now());
|
||||||
|
ent.setDataModifyUserNo(AdminUserUtil.getUserNo());
|
||||||
|
ent.setDataModifyUserName(AdminUserUtil.getUserName());
|
||||||
|
ent.setDataModifyTime(LocalDateTime.now());
|
||||||
|
deviceTypes.add(ent);
|
||||||
|
}
|
||||||
|
if (!deviceComponentService.lambdaQuery().eq(DeviceComponent::getModelNo, dto.getModelNo()).exists()){
|
||||||
|
DeviceComponent ent = new DeviceComponent();
|
||||||
|
ent.setModelNo(dto.getModelNo());
|
||||||
|
ent.setComponent("");
|
||||||
|
ent.setEnable(true);
|
||||||
|
ent.setCreateBy(AdminUserUtil.getUserName());
|
||||||
|
ent.setCreateTime(LocalDateTime.now());
|
||||||
|
deviceComponents.add(ent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (data.stream().noneMatch(dto -> StrUtil.isNotBlank(dto.getError()))){
|
||||||
|
deviceService.saveBatch(devices);
|
||||||
|
if (CollUtil.isNotEmpty(deviceTypes)){
|
||||||
|
deviceTypeService.saveBatch(deviceTypes);
|
||||||
|
}
|
||||||
|
if (CollUtil.isNotEmpty(deviceComponents)){
|
||||||
|
deviceComponentService.saveBatch(deviceComponents);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 导出选中的设备
|
||||||
|
* @param ids 选中的id集合
|
||||||
|
*/
|
||||||
|
@PostMapping("exportSelect")
|
||||||
|
@ApiMark(moduleName = "设备管理", apiName = "导出选中的设备")
|
||||||
|
public void exportSelect(HttpServletResponse response,@Valid @RequestBody @NotEmpty List<Integer> ids) throws IOException {
|
||||||
|
List<Device> devices=deviceService.listByIds(ids);
|
||||||
|
List<DictionaryItem> states = dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_DEVICE_STATE);
|
||||||
|
List<DeviceUpdateImportDTO> datas=devices.stream().map(d->{
|
||||||
|
DeviceUpdateImportDTO dto= new DeviceUpdateImportDTO();
|
||||||
|
dto.setId(d.getId());
|
||||||
|
dto.setDeviceNo(d.getDeviceNo());
|
||||||
|
dto.setDeviceName(d.getDeviceName());
|
||||||
|
dto.setDeviceType(d.getDeviceType());
|
||||||
|
dto.setDeviceTypeSub(d.getDeviceTypeSub());
|
||||||
|
dto.setModelNo(d.getModelNo());
|
||||||
|
dto.setDeviceStateDesc(states.stream().filter(s->Objects.equals(s.getId(),d.getDeviceState())).findFirst().get().getName());
|
||||||
|
dto.setCustomerName(d.getCustomerName());
|
||||||
|
dto.setAgentName(d.getAgentName());
|
||||||
|
dto.setAreaName(d.getAreaName());
|
||||||
|
dto.setShipmentDate(DateTimeUtil.format(d.getShipmentDate(), "yyyy-MM-dd"));
|
||||||
|
dto.setStartWarrantyDate(DateTimeUtil.format(d.getStartWarrantyDate(), "yyyy-MM-dd"));
|
||||||
|
if (Objects.nonNull(d.getWarrantyMonth())) {
|
||||||
|
dto.setWarrantyMonth(String.valueOf(d.getWarrantyMonth()));
|
||||||
|
}
|
||||||
|
return dto;
|
||||||
|
}).collect(Collectors.toList());
|
||||||
|
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
|
||||||
|
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode("设备更新.xlsx", "UTF-8"));
|
||||||
|
ClassPathResource resource = new ClassPathResource("templates/设备更新导入模板.xlsx");
|
||||||
|
new Workbook()
|
||||||
|
.addSheet(new TemplateSheet(Paths.get(resource.getURI()))
|
||||||
|
.setData(datas)
|
||||||
|
.setData("@list:deviceStateDesc", dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_DEVICE_STATE)
|
||||||
|
.stream().map(DictionaryItem::getName).collect(Collectors.toList())))
|
||||||
|
.writeTo(response.getOutputStream());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新导入
|
||||||
|
* @param file 文件
|
||||||
|
*/
|
||||||
|
@Transactional
|
||||||
|
@PostMapping("importForUpdate")
|
||||||
|
@ApiMark(moduleName = "设备管理", apiName = "更新导入")
|
||||||
|
public void importForUpdate(HttpServletResponse response, @RequestParam(value = "file") MultipartFile file) throws IOException {
|
||||||
|
List<DeviceUpdateImportDTO> data = EecExcelUtil.getExcelContext(file.getInputStream(), DeviceUpdateImportDTO.class);
|
||||||
|
VUtils.trueThrowBusinessError(CollectionUtil.isEmpty(data)).throwMessage("导入文件内容为空");
|
||||||
|
if (updateCheckAndImport(data)) {
|
||||||
|
response.setContentType("application/json");
|
||||||
|
response.setCharacterEncoding("UTF-8");
|
||||||
|
byte[] datas = StrUtil.bytes(JSONUtil.toJsonStr(ApiResult.success()));
|
||||||
|
response.getOutputStream().write(datas, 0, datas.length);
|
||||||
|
} else {
|
||||||
|
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
|
||||||
|
response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment;filename=" + URLEncoder.encode("设备更新.xlsx", "UTF-8"));
|
||||||
|
ClassPathResource resource = new ClassPathResource("templates/设备更新导入模板.xlsx");
|
||||||
|
new Workbook()
|
||||||
|
.addSheet(new TemplateSheet(Paths.get(resource.getURI()))
|
||||||
|
.setData(data)
|
||||||
|
.setData("@list:deviceStateDesc", dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_DEVICE_STATE)
|
||||||
|
.stream().map(DictionaryItem::getName).collect(Collectors.toList())))
|
||||||
|
.writeTo(response.getOutputStream());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Transactional
|
||||||
|
public boolean updateCheckAndImport(List<DeviceUpdateImportDTO> data) {
|
||||||
|
List<DictionaryItem> states = dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_DEVICE_STATE);
|
||||||
|
List<DictionaryItem> warrantyStates = dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_DEVICE_WARRANTY_STATE);
|
||||||
|
List<Device> devices = new ArrayList<>();
|
||||||
|
List<TBaseDeviceType> deviceTypes = new ArrayList<>();
|
||||||
|
List<DeviceComponent> deviceComponents = new ArrayList<>();
|
||||||
|
for (DeviceUpdateImportDTO dto : data) {
|
||||||
|
Device device = new Device();
|
||||||
|
StringBuilder sb = new StringBuilder();
|
||||||
|
if (Objects.isNull(dto.getId())) {
|
||||||
|
sb.append("id不能为空;");
|
||||||
|
}else {
|
||||||
|
device=deviceService.getById(dto.getId());
|
||||||
|
if (Objects.isNull(device)){
|
||||||
|
sb.append("设备不存在;");
|
||||||
|
device = new Device();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
device.setDeviceNo(dto.getDeviceNo());
|
||||||
|
if (StrUtil.isBlank(dto.getDeviceNo())) {
|
||||||
|
sb.append("设备编号不能为空;");
|
||||||
|
}
|
||||||
|
device.setDeviceName(dto.getDeviceName());
|
||||||
|
device.setDeviceType(dto.getDeviceType());
|
||||||
|
if (StrUtil.isBlank(dto.getDeviceType())) {
|
||||||
|
sb.append("设备类型不能为空;");
|
||||||
|
}
|
||||||
|
device.setDeviceTypeSub(dto.getDeviceTypeSub());
|
||||||
|
if (StrUtil.isBlank(dto.getDeviceTypeSub())) {
|
||||||
|
sb.append("设备类型细分不能为空;");
|
||||||
|
}
|
||||||
|
device.setModelNo(dto.getModelNo());
|
||||||
|
if (StrUtil.isBlank(dto.getModelNo())) {
|
||||||
|
sb.append("设备机型不能为空;");
|
||||||
|
}
|
||||||
|
if (StrUtil.isBlank(dto.getDeviceStateDesc())) {
|
||||||
|
sb.append("设备状态不能为空;");
|
||||||
|
} else {
|
||||||
|
DictionaryItem state = states.stream().filter(s -> StrUtil.equals(s.getName(), dto.getDeviceStateDesc())).findFirst().orElse(null);
|
||||||
|
if (Objects.isNull(state)) {
|
||||||
|
sb.append("设备状态无效;");
|
||||||
|
} else {
|
||||||
|
device.setDeviceState(state.getId());
|
||||||
|
if (StrUtil.isNotBlank(dto.getDeviceNo()) && StrUtil.equals(state.getCode(), "Normal")
|
||||||
|
&& deviceService.lambdaQuery().ne(Device::getId, device.getId()).eq(Device::getDeviceNo, dto.getDeviceNo()).eq(Device::getDeviceState, state.getId()).exists()) {
|
||||||
|
sb.append("设备已存在;");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
device.setCustomerId(0);
|
||||||
|
device.setCustomerName(dto.getCustomerName());
|
||||||
|
if (StrUtil.isNotBlank(dto.getAgentName())) {
|
||||||
|
TBaseCustomer customer = customerService.lambdaQuery()
|
||||||
|
.eq(TBaseCustomer::getDelIs, 0)
|
||||||
|
.eq(TBaseCustomer::getAgencyCompanyName, dto.getAgentName())
|
||||||
|
.one();
|
||||||
|
if (Objects.isNull(customer)) {
|
||||||
|
sb.append("代理商不存在;");
|
||||||
|
} else if (customer.getEnableState() == 0) {
|
||||||
|
sb.append("代理商状态为禁用;");
|
||||||
|
} else {
|
||||||
|
device.setAgentName(customer.getAgencyCompanyName());
|
||||||
|
device.setAgentCode(customer.getAgencyCompanyCode());
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
device.setAgentName("");
|
||||||
|
device.setAgentCode("");
|
||||||
|
}
|
||||||
|
if (StrUtil.isNotBlank(dto.getAreaName())) {
|
||||||
|
TBaseArea area = areaService.lambdaQuery().eq(TBaseArea::getDelIs, 0).eq(TBaseArea::getAreaName, dto.getAreaName()).one();
|
||||||
|
if (Objects.isNull(area)) {
|
||||||
|
sb.append("区域不存在;");
|
||||||
|
} else if (area.getAreaState().intValue() == 0) {
|
||||||
|
sb.append("区域为禁用;");
|
||||||
|
} else {
|
||||||
|
device.setAreaName(area.getAreaName());
|
||||||
|
device.setAreaCode(area.getAreaCode());
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
device.setAreaName("");
|
||||||
|
device.setAreaCode("");
|
||||||
|
}
|
||||||
|
if (StrUtil.isNotBlank(dto.getShipmentDate())) {
|
||||||
|
try {
|
||||||
|
LocalDate date = LocalDate.parse(dto.getShipmentDate(), DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
||||||
|
device.setShipmentDate(DateTimeUtil.asSystemDate(date));
|
||||||
|
} catch (DateTimeParseException e) {
|
||||||
|
sb.append("发货日期无效;");
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
device.setShipmentDate(null);
|
||||||
|
}
|
||||||
|
if (StrUtil.isNotBlank(dto.getStartWarrantyDate())) {
|
||||||
|
try {
|
||||||
|
LocalDate date = LocalDate.parse(dto.getStartWarrantyDate(), DateTimeFormatter.ofPattern("yyyy-MM-dd"));
|
||||||
|
device.setStartWarrantyDate(DateTimeUtil.asSystemDate(date));
|
||||||
|
if (StrUtil.isBlank(dto.getWarrantyMonth())) {
|
||||||
|
sb.append("质保期不能为空;");
|
||||||
|
} else {
|
||||||
|
int month = Integer.parseInt(dto.getWarrantyMonth());
|
||||||
|
device.setWarrantyMonth(month);
|
||||||
|
if (date.isAfter(LocalDate.now())) {
|
||||||
|
device.setWarrantyState(warrantyStates.stream().filter(s -> StrUtil.equals(s.getCode(), "NotStarted")).findFirst().get().getId());
|
||||||
|
} else if (date.plusMonths(month).isAfter(LocalDate.now())) {
|
||||||
|
device.setWarrantyState(warrantyStates.stream().filter(s -> StrUtil.equals(s.getCode(), "WithinWarranty")).findFirst().get().getId());
|
||||||
|
} else {
|
||||||
|
device.setWarrantyState(warrantyStates.stream().filter(s -> StrUtil.equals(s.getCode(), "OutsideWarranty")).findFirst().get().getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (DateTimeParseException e) {
|
||||||
|
sb.append("开始质保日期无效;");
|
||||||
|
} catch (NumberFormatException e) {
|
||||||
|
sb.append("质保期无效;");
|
||||||
|
}
|
||||||
|
}else {
|
||||||
|
device.setStartWarrantyDate(null);
|
||||||
|
device.setWarrantyState(null);
|
||||||
|
}
|
||||||
|
device.setUpdateBy(AdminUserUtil.getUserName());
|
||||||
|
device.setUpdateTime(LocalDateTime.now());
|
||||||
|
device.setRemark("从excel更新");
|
||||||
|
dto.setError(sb.toString());
|
||||||
|
if (StrUtil.isBlank(dto.getError())){
|
||||||
|
devices.add(device);
|
||||||
|
if (!deviceTypeService.lambdaQuery().eq(TBaseDeviceType::getDeviceType, dto.getDeviceType()).exists()){
|
||||||
|
TBaseDeviceType ent = new TBaseDeviceType();
|
||||||
|
ent.setDeviceTypeCode(UniqueSequenceGenerator.generateCode(com.nflg.mobilebroken.admin.constant.Constant.DeviceTypeCodePrefix));
|
||||||
|
ent.setDeviceType(dto.getDeviceType());
|
||||||
|
ent.setDeviceState(Boolean.TRUE);
|
||||||
|
ent.setDataCreateUserNo(AdminUserUtil.getUserNo());
|
||||||
|
ent.setDataCreateUserName(AdminUserUtil.getUserName());
|
||||||
|
ent.setDataCreateTime(LocalDateTime.now());
|
||||||
|
ent.setDataModifyUserNo(AdminUserUtil.getUserNo());
|
||||||
|
ent.setDataModifyUserName(AdminUserUtil.getUserName());
|
||||||
|
ent.setDataModifyTime(LocalDateTime.now());
|
||||||
|
deviceTypes.add(ent);
|
||||||
|
}
|
||||||
|
if (!deviceComponentService.lambdaQuery().eq(DeviceComponent::getModelNo, dto.getModelNo()).exists()){
|
||||||
|
DeviceComponent ent = new DeviceComponent();
|
||||||
|
ent.setModelNo(dto.getModelNo());
|
||||||
|
ent.setComponent("");
|
||||||
|
ent.setEnable(true);
|
||||||
|
ent.setCreateBy(AdminUserUtil.getUserName());
|
||||||
|
ent.setCreateTime(LocalDateTime.now());
|
||||||
|
deviceComponents.add(ent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (data.stream().noneMatch(dto -> StrUtil.isNotBlank(dto.getError()))){
|
||||||
|
deviceService.updateBatchById(devices);
|
||||||
|
if (CollUtil.isNotEmpty(deviceTypes)){
|
||||||
|
deviceTypeService.saveBatch(deviceTypes);
|
||||||
|
}
|
||||||
|
if (CollUtil.isNotEmpty(deviceComponents)){
|
||||||
|
deviceComponentService.saveBatch(deviceComponents);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Binary file not shown.
Binary file not shown.
|
|
@ -112,4 +112,8 @@ public class Constant {
|
||||||
|
|
||||||
public static final String DICTIONARY_SOLUTION_MEASURES = "SolutionMeasures";
|
public static final String DICTIONARY_SOLUTION_MEASURES = "SolutionMeasures";
|
||||||
public static final String DICTIONARY_SOLUTION_REVIEW_DEPARTMENT = "SolutionReviewDepartment";
|
public static final String DICTIONARY_SOLUTION_REVIEW_DEPARTMENT = "SolutionReviewDepartment";
|
||||||
|
|
||||||
|
public static final String DICTIONARY_DEVICE_STATE ="deviceState";
|
||||||
|
|
||||||
|
public static final String DICTIONARY_DEVICE_WARRANTY_STATE ="deviceWarrantyState";
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,88 @@
|
||||||
|
package com.nflg.mobilebroken.common.pojo.dto;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
import org.ttzero.excel.annotation.ExcelColumn;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class DeviceAddImportDTO {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备编号
|
||||||
|
*/
|
||||||
|
@ExcelColumn("设备编号*")
|
||||||
|
private String deviceNo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备名称
|
||||||
|
*/
|
||||||
|
@ExcelColumn("设备名称")
|
||||||
|
private String deviceName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备类型
|
||||||
|
*/
|
||||||
|
@ExcelColumn("设备类型*")
|
||||||
|
private String deviceType;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备类型细分
|
||||||
|
*/
|
||||||
|
@ExcelColumn("设备类型细分*")
|
||||||
|
private String deviceTypeSub;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备机型
|
||||||
|
*/
|
||||||
|
@ExcelColumn("设备机型*")
|
||||||
|
private String modelNo;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 设备状态-来自字典
|
||||||
|
*/
|
||||||
|
@ExcelColumn("设备状态*")
|
||||||
|
private String deviceStateDesc;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 客户名称
|
||||||
|
*/
|
||||||
|
@ExcelColumn("客户名称")
|
||||||
|
private String customerName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 代理商名称
|
||||||
|
*/
|
||||||
|
@ExcelColumn("代理商")
|
||||||
|
private String agentName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 区域名称
|
||||||
|
*/
|
||||||
|
@ExcelColumn("区域")
|
||||||
|
private String areaName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 发货日期
|
||||||
|
*/
|
||||||
|
@ExcelColumn("发货日期")
|
||||||
|
private String shipmentDate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 开始质保日期
|
||||||
|
*/
|
||||||
|
@ExcelColumn("开始质保日期")
|
||||||
|
private String startWarrantyDate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 质保期(月)
|
||||||
|
*/
|
||||||
|
@ExcelColumn("质保期(月)")
|
||||||
|
private String warrantyMonth;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 错误信息
|
||||||
|
*/
|
||||||
|
@ExcelColumn("错误信息")
|
||||||
|
private String error;
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
package com.nflg.mobilebroken.common.pojo.dto;
|
||||||
|
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.experimental.Accessors;
|
||||||
|
import org.ttzero.excel.annotation.ExcelColumn;
|
||||||
|
|
||||||
|
@EqualsAndHashCode(callSuper = false)
|
||||||
|
@Data
|
||||||
|
@Accessors(chain = true)
|
||||||
|
public class DeviceUpdateImportDTO extends DeviceAddImportDTO{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* id
|
||||||
|
*/
|
||||||
|
@ExcelColumn("id*")
|
||||||
|
private Integer id;
|
||||||
|
}
|
||||||
|
|
@ -27,6 +27,13 @@ public class DateTimeUtil {
|
||||||
return dateTime.format(DateTimeFormatter.ofPattern(pattern));
|
return dateTime.format(DateTimeFormatter.ofPattern(pattern));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static String format(LocalDate date,String pattern){
|
||||||
|
if (Objects.isNull(date)){
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
return date.format(DateTimeFormatter.ofPattern(pattern));
|
||||||
|
}
|
||||||
|
|
||||||
public static LocalDate asSystemDate(LocalDate date){
|
public static LocalDate asSystemDate(LocalDate date){
|
||||||
if (Objects.isNull(date)){
|
if (Objects.isNull(date)){
|
||||||
return null;
|
return null;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue