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 00000000..cb17990a Binary files /dev/null and b/nflg-mobilebroken-admin/src/main/resources/templates/设备新增导入模板.xlsx differ 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 00000000..0ceb6075 Binary files /dev/null and b/nflg-mobilebroken-admin/src/main/resources/templates/设备更新导入模板.xlsx differ 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;