From cd1775a29744e15806090e157062860f7ca24dc9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9B=B9=E9=B9=8F=E9=A3=9E?= Date: Sun, 6 Apr 2025 13:43:44 +0800 Subject: [PATCH] =?UTF-8?q?feat(device):=20=E6=96=B0=E5=A2=9E=E8=AE=BE?= =?UTF-8?q?=E5=A4=87=E5=AF=BC=E5=85=A5=E5=AF=BC=E5=87=BA=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增设备导入模板下载功能 - 实现设备新增导入功能,包括数据校验和错误反馈 - 添加设备更新导入功能,支持修改现有设备信息 - 优化设备导出功能,支持导出选中的设备- 新增设备状态和质保状态的字典项 --- .../admin/controller/DeviceController.java | 579 +++++++++++++++--- .../templates/设备新增导入模板.xlsx | Bin 0 -> 10477 bytes .../templates/设备更新导入模板.xlsx | Bin 0 -> 10534 bytes .../common/constant/Constant.java | 4 + .../common/pojo/dto/DeviceAddImportDTO.java | 88 +++ .../pojo/dto/DeviceUpdateImportDTO.java | 18 + .../common/util/DateTimeUtil.java | 7 + 7 files changed, 627 insertions(+), 69 deletions(-) create mode 100644 nflg-mobilebroken-admin/src/main/resources/templates/设备新增导入模板.xlsx create mode 100644 nflg-mobilebroken-admin/src/main/resources/templates/设备更新导入模板.xlsx create mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/dto/DeviceAddImportDTO.java create mode 100644 nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/dto/DeviceUpdateImportDTO.java diff --git a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/DeviceController.java b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/DeviceController.java index 1c2e58f1..9e4b1e48 100644 --- a/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/DeviceController.java +++ b/nflg-mobilebroken-admin/src/main/java/com/nflg/mobilebroken/admin/controller/DeviceController.java @@ -1,7 +1,10 @@ package com.nflg.mobilebroken.admin.controller; import cn.hutool.core.collection.CollUtil; +import cn.hutool.core.collection.CollectionUtil; 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.google.common.collect.Sets; 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.query.DeviceQuery; 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.common.constant.Constant; 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.PageData; -import com.nflg.mobilebroken.common.util.EecExcelUtil; -import com.nflg.mobilebroken.common.util.VUtils; -import com.nflg.mobilebroken.repository.entity.Device; -import com.nflg.mobilebroken.repository.entity.DictionaryItem; -import com.nflg.mobilebroken.repository.service.IDeviceService; -import com.nflg.mobilebroken.repository.service.IDictionaryItemService; +import com.nflg.mobilebroken.common.pojo.dto.DeviceAddImportDTO; +import com.nflg.mobilebroken.common.pojo.dto.DeviceUpdateImportDTO; +import com.nflg.mobilebroken.common.util.*; +import com.nflg.mobilebroken.repository.entity.*; +import com.nflg.mobilebroken.repository.service.*; 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.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.servlet.http.HttpServletResponse; import javax.validation.Valid; +import javax.validation.constraints.NotEmpty; import java.io.IOException; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Set; +import java.net.URLEncoder; +import java.nio.file.Paths; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.format.DateTimeParseException; +import java.util.*; import java.util.stream.Collectors; /** @@ -54,6 +64,18 @@ public class DeviceController extends ControllerBase { @Resource 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); } - @GetMapping("downTemplate") - @ApiMark(moduleName = "设备管理", apiName = "导入模板下载") -// @MethodInfoMark(value = "导入模板下载",menuName = "设备管理") - public void downTemplate(HttpServletResponse response) throws IOException { - EecExcelUtil.setResponseExcelHeader(response,"设备导入模板"); +// @GetMapping("downTemplate") +// @ApiMark(moduleName = "设备管理", apiName = "导入模板下载") +//// @MethodInfoMark(value = "导入模板下载",menuName = "设备管理") +// public void downTemplate(HttpServletResponse response) throws IOException { +// EecExcelUtil.setResponseExcelHeader(response,"设备导入模板"); +// +// final ListSheet listSheet = new ListSheet() { +// @Override +// protected List more() { +// return null; +// } +// }; +// EecExcelUtil.eecExcel("设备导入模板", listSheet, response); +// } - final ListSheet listSheet = new ListSheet() { - @Override - protected List more() { - return null; - } - }; - EecExcelUtil.eecExcel("设备导入模板", listSheet, response); - } +// /** +// * 导出设备 +// * @param response +// * @throws IOException +// */ +// @GetMapping("exportData") +//// @MethodInfoMark(value = "导出设备",menuName = "设备管理") +// @ApiMark(moduleName = "设备管理", apiName = "导出设备") +// public void exportData(HttpServletResponse response) throws IOException { +// +// EecExcelUtil.setResponseExcelHeader(response,"设备列表"); +// +// final ListSheet listSheet = new ListSheet() { +// int i=0; +// @Override +// protected List more() { +// +// List list = deviceService.list(); +// i++; +// return i>1?null : Convert.toList(DeviceExcelVO.class, list); +// } +// }; +// EecExcelUtil.eecExcel("设备列表", listSheet, response); +// } - /** - * 导出设备 - * @param response - * @throws IOException - */ - @GetMapping("exportData") -// @MethodInfoMark(value = "导出设备",menuName = "设备管理") - @ApiMark(moduleName = "设备管理", apiName = "导出设备") - public void exportData(HttpServletResponse response) throws IOException { - - EecExcelUtil.setResponseExcelHeader(response,"设备列表"); - - final ListSheet listSheet = new ListSheet() { - int i=0; - @Override - protected List more() { - - List 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 importData( @RequestParam(value = "file") MultipartFile file){ - - try { - List 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); - } +// /** +// * 导入设备 +// * @param file +// * @return +// */ +// @PostMapping("importData") +// @ApiMark(moduleName = "设备管理", apiName = "导入设备") +// public ApiResult importData( @RequestParam(value = "file") MultipartFile file){ +// +// try { +// List 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); } + /** + * 下载导入模板(新增) + */ + @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 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 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 data) { + List states = dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_DEVICE_STATE); + List warrantyStates = dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_DEVICE_WARRANTY_STATE); + List devices = new ArrayList<>(); + List deviceTypes = new ArrayList<>(); + List 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 ids) throws IOException { + List devices=deviceService.listByIds(ids); + List states = dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_DEVICE_STATE); + List 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 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 data) { + List states = dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_DEVICE_STATE); + List warrantyStates = dictionaryItemService.getListByDictionaryCode(Constant.DICTIONARY_DEVICE_WARRANTY_STATE); + List devices = new ArrayList<>(); + List deviceTypes = new ArrayList<>(); + List 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; + } + } diff --git a/nflg-mobilebroken-admin/src/main/resources/templates/设备新增导入模板.xlsx b/nflg-mobilebroken-admin/src/main/resources/templates/设备新增导入模板.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..cb17990ad438054ca19f094408c2d246657ae357 GIT binary patch literal 10477 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 literal 0 HcmV?d00001 diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/Constant.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/Constant.java index 422c0049..26e156b1 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/Constant.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/constant/Constant.java @@ -112,4 +112,8 @@ public class Constant { public static final String DICTIONARY_SOLUTION_MEASURES = "SolutionMeasures"; 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"; } diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/dto/DeviceAddImportDTO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/dto/DeviceAddImportDTO.java new file mode 100644 index 00000000..3016d3b2 --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/dto/DeviceAddImportDTO.java @@ -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; +} diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/dto/DeviceUpdateImportDTO.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/dto/DeviceUpdateImportDTO.java new file mode 100644 index 00000000..21924887 --- /dev/null +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/pojo/dto/DeviceUpdateImportDTO.java @@ -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; +} diff --git a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/util/DateTimeUtil.java b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/util/DateTimeUtil.java index f057bb27..65546537 100644 --- a/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/util/DateTimeUtil.java +++ b/nflg-mobilebroken-common/src/main/java/com/nflg/mobilebroken/common/util/DateTimeUtil.java @@ -27,6 +27,13 @@ public class DateTimeUtil { 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){ if (Objects.isNull(date)){ return null;