package com.repair.controller;
import com.repair.api.RepairConsumeControllerAPI;
import com.repair.common.utils.ExcelExportUtil;
import com.repair.common.utils.ExcelUtils;
import com.repair.common.utils.TimeExchange;
import com.repair.common.utils.paramUtils;
import com.repair.model.enumModel.eFileType;
import com.repair.model.enumModel.eRecordStatu;
import com.repair.model.pojo.*;
import com.repair.model.request.insertRepairAssociationRequest;
import com.repair.model.request.insertRepairConsumeRequest;
import com.repair.model.request.updateRepairConsumeRequest;
import com.repair.model.result.CommonResult;
import com.repair.model.result.PageUtils;
import com.repair.model.vo.ChangePriceConsumeVo;
import com.repair.model.vo.ConsumeVo;
import com.repair.model.vo.RepairConsumeVo;
import com.repair.model.vo.RepairSchoolVo;
import com.repair.services.RepairAreaService;
import com.repair.services.RepairArticleTypeService;
import com.repair.services.RepairConsumeService;
import com.repair.services.RepairRecordService;
import org.apache.commons.lang3.StringUtils;
import org.apache.poi.hpsf.Decimal;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.math.BigDecimal;
import java.util.*;
/**
*
* 前端控制器
*
*
* @author ceshi
* @since 2023-07-18
*/
@RestController
public class RepairConsumeController implements RepairConsumeControllerAPI {
@Autowired
private RepairAreaService repairAreaService;
@Autowired
private RepairRecordService repairRecordService;
@Autowired
private RepairConsumeService repairConsumeService;
@Autowired
private RepairArticleTypeService repairArticleTypeService;
@Override
public CommonResult InsertRepairAssociation(insertRepairAssociationRequest irc, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
String st = paramUtils.getParamError(bindingResult);
return CommonResult.fail(st);
}
RepairConsume data = repairConsumeService.queryConsumeByName(irc.getName(), irc.getSchoolId());
if (data != null) {
return CommonResult.fail("该报修耗材已存在!");
}
RepairConsume rc = new RepairConsume()
.setName(irc.getName())
.setSchoolId(irc.getSchoolId())
.setArticleId(irc.getArticleId())
.setPrice(new BigDecimal(0));
int result = repairConsumeService.insertRepairConsume(rc);
return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
}
@Override
public CommonResult InsertRepairConsume(insertRepairConsumeRequest ircr, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
String st = paramUtils.getParamError(bindingResult);
return CommonResult.fail(st);
}
RepairConsume data = repairConsumeService.queryConsumeByName(ircr.getName(), ircr.getSchoolId());
if (data != null) {
return CommonResult.fail("该报修耗材已存在!");
}
RepairConsume rc = new RepairConsume()
.setName(ircr.getName())
.setSchoolId(ircr.getSchoolId())
.setArticleId(StringUtils.join(ircr.getArticleIds(), ','))
.setPrice(ircr.getPrice())
.setContent(ircr.getContent());
int result = repairConsumeService.insertRepairConsume(rc);
return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
}
@Override
public CommonResult updateRepairConsumeById(updateRepairConsumeRequest urcr, BindingResult bindingResult) {
if (bindingResult.hasErrors()) {
String st = paramUtils.getParamError(bindingResult);
return CommonResult.fail(st);
}
RepairConsume data = repairConsumeService.queryConsumeByName(urcr.getName(), urcr.getSchoolId());
if (data != null && !data.getId().equals(urcr.getId())) {
return CommonResult.fail("该报修耗材已存在!");
}
RepairConsume rc = new RepairConsume()
.setId(urcr.getId())
.setSchoolId(urcr.getSchoolId())
.setName(urcr.getName())
.setArticleId(StringUtils.join(urcr.getArticleIds(), ','))
.setPrice(urcr.getPrice())
.setContent(urcr.getContent());
int result = repairConsumeService.updateRepairConsume(rc);
return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
}
@Override
public CommonResult queryPageRepairConsumes(int currentPage, int pageCount, String name, String startTime, String endTime) {
if (startTime != null && endTime != null) {
try {
startTime = TimeExchange.getStartOfDayStr(TimeExchange.StringToDate(startTime, "yyyy-MM-dd"));
endTime = TimeExchange.getEndOfDayStr(TimeExchange.StringToDate(endTime, "yyyy-MM-dd"));
} catch (Exception e) {
}
}
PageUtils result = repairConsumeService.queryPageRepairConsumes(currentPage, pageCount, name, startTime, endTime);
for (RepairConsumeVo r : result.getList()) {
if (r.getArticleId() != null) {
r.setArticleIds(Arrays.asList(r.getArticleId().split(",")));
}
if (r.getArticleName() != null) {
r.setArticleNames(Arrays.asList(r.getArticleName().split(",")));
}
}
return CommonResult.ok(result);
}
@Override
public CommonResult deleteRepairConsumeById(int id) {
RepairConsume data = repairConsumeService.getRepairById(id);
if (data == null) {
return CommonResult.fail("当前数据不存在,删除失败!");
}
int result = repairConsumeService.deleteRepairConsumeById(id);
return result > 0 ? CommonResult.ok("删除成功") : CommonResult.fail("删除失败");
}
@Override
public void downloadRepairConsumeExcel(String name, String startTime, String endTime, HttpServletResponse response) throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
Map map = new HashMap<>();
//表头与键值对的映射关系
map.put("id", "数据ID");
map.put("name", "耗材名称");
map.put("schoolName", "校区名称");
map.put("price", "耗材单价");
map.put("artileName", "物品类型");
map.put("entryName", "录入人员");
map.put("updateTimeStr", "录入时间");
if (startTime != null && endTime != null) {
try {
startTime = TimeExchange.getStartOfDayStr(TimeExchange.StringToDate(startTime, "yyyy-MM-dd"));
endTime = TimeExchange.getEndOfDayStr(TimeExchange.StringToDate(endTime, "yyyy-MM-dd"));
} catch (Exception e) {
}
}
List datas = repairConsumeService.queryConsumeList(name, startTime, endTime);
List orderList = new ArrayList<>();
orderList.add("id");
orderList.add("name");
orderList.add("schoolName");
orderList.add("price");
orderList.add("artileName");
orderList.add("entryName");
orderList.add("updateTimeStr");
//导出逻辑 这里的list是从导入里面哪来的 map1与map不一样 orderList这里为空
Workbook workbook = ExcelExportUtil.createWorkbook(datas, map, 1, "耗材管理表", orderList);
ExcelUtils.excelDownload(workbook, "耗材管理.xlsx", response);
}
@Override
public void downloadRepairConsumeModelExcel(HttpServletResponse response) {
ExcelUtils.fileDownload("/耗材管理模板.xlsx", response);
}
@Override
public CommonResult importRepairConsumeExcel(MultipartFile file) throws IOException {
String ContentType = file.getContentType();
InputStream inputStream = file.getInputStream();
List result = new ArrayList<>();
//xls格式文件
if (ContentType.equals(eFileType.Xls.getValue())) {
CommonResult> resultData = readXls(inputStream);
if (!resultData.isSuccess()) {
return resultData;
}
result = resultData.getData();
} else if (ContentType.equals(eFileType.Xlsx.getValue())) {
CommonResult> resultData = readXlsx(inputStream);
if (!resultData.isSuccess()) {
return resultData;
}
result = resultData.getData();
} else {
return CommonResult.fail("耗材数据导入只支持Xls、Xlsx");
}
boolean resultBool = repairConsumeService.saveBatch(result);
return resultBool ? CommonResult.ok("导入成功") : CommonResult.fail("导入失败");
}
private CommonResult> readXls(InputStream inputStream) throws IOException {
HSSFWorkbook sheets = new HSSFWorkbook(inputStream);
List result = new ArrayList<>();
List ConsumeNames = new ArrayList<>();
//读取第一张sheet
HSSFSheet sheetAt = sheets.getSheetAt(0);
//获取校区数据
List schools = repairAreaService.queryRepairSchools();
//报修物品
List articles = repairArticleTypeService.getRepairArticleTypes();
DataFormatter dataFormatter = new DataFormatter();
//sheetAt.getLastRowNum():从0开始统计数量 所以得+1
for (int rowNum = 1; rowNum < sheetAt.getLastRowNum() + 1; rowNum++) {
HSSFRow row = sheetAt.getRow(rowNum);
if (rowNum == 1) {
String name = dataFormatter.formatCellValue(row.getCell(0));//耗材名称
if (!name.equals("名称")) {
return CommonResult.fail("导入数据第一列为名称");
}
String schoolName = dataFormatter.formatCellValue(row.getCell(1));//校区名称
if (!schoolName.equals("校区")) {
return CommonResult.fail("导入数据第二列为校区");
}
String ArticleName = dataFormatter.formatCellValue(row.getCell(2));//报修物品类别
if (!ArticleName.equals("类别")) {
return CommonResult.fail("导入数据第三列为类别");
}
String price = dataFormatter.formatCellValue(row.getCell(3));//耗材单价
if (!price.equals("价格(元)")) {
return CommonResult.fail("导入数据第四列为价格");
}
} else {
RepairConsume data = new RepairConsume();
//耗材名称
String name = dataFormatter.formatCellValue(row.getCell(0));
ConsumeNames.add(name);
if (ConsumeNames.stream().distinct().count() != ConsumeNames.size()) {
return CommonResult.fail("导入的Excel中" + name + "存在重复数据");
}
data.setName(name);
//校区
String schoolName = dataFormatter.formatCellValue(row.getCell(1));
Optional school = schools.stream().filter(e -> e.getName().equals(schoolName)).findFirst();
if (school != null && school.isPresent()) {
data.setSchoolId(school.get().getId());
} else {
return CommonResult.fail(name + "的" + schoolName + "校区数据在数据库中不存在");
}
//报修物品(类别)
String article = dataFormatter.formatCellValue(row.getCell(2));
String[] articleStrs = null;
if (article.contains("、")) {
articleStrs = article.split("、");
} else if (article.contains(",")) {
articleStrs = article.split(",");
} else {
articleStrs = new String[1];
articleStrs[0] = article;
}
List ass = new ArrayList<>();
for (String as : articleStrs) {
if (!as.equals("")) {
Optional shiftData = articles.stream().filter(e -> e.getName().equals(as)).findFirst();
if (shiftData != null && shiftData.isPresent()) {
ass.add(shiftData.get().getId().toString());
} else {
return CommonResult.fail(name + "的" + as + "数据不存在");
}
}
data.setArticleId(StringUtils.join(ass, ','));
result.add(data);
}
//价格
BigDecimal price = new BigDecimal(String.valueOf(row.getCell(3))).stripTrailingZeros();
data.setPrice(price);
}
}
return CommonResult.ok(result);
}
private CommonResult> readXlsx(InputStream inputStream) throws IOException {
XSSFWorkbook sheets = new XSSFWorkbook(inputStream);
List result = new ArrayList<>();
List ConsumeNames = new ArrayList<>();
//读取第一张sheet
XSSFSheet sheetAt = sheets.getSheetAt(0);
//获取校区数据
List schools = repairAreaService.queryRepairSchools();
//报修物品
List articles = repairArticleTypeService.getRepairArticleTypes();
DataFormatter dataFormatter = new DataFormatter();
//sheetAt.getLastRowNum():从0开始统计数量 所以得+1
for (int rowNum = 1; rowNum < sheetAt.getLastRowNum() + 1; rowNum++) {
XSSFRow row = sheetAt.getRow(rowNum);
if (rowNum == 1) {
String name = dataFormatter.formatCellValue(row.getCell(0));//耗材名称
if (!name.equals("名称")) {
return CommonResult.fail("导入数据第一列为名称");
}
String schoolName = dataFormatter.formatCellValue(row.getCell(1));//校区名称
if (!schoolName.equals("校区")) {
return CommonResult.fail("导入数据第二列为校区");
}
String ArticleName = dataFormatter.formatCellValue(row.getCell(2));//报修物品类别
if (!ArticleName.equals("类别")) {
return CommonResult.fail("导入数据第三列为类别");
}
String price = dataFormatter.formatCellValue(row.getCell(3));//耗材单价
if (!price.equals("价格(元)")) {
return CommonResult.fail("导入数据第四列为价格");
}
} else {
RepairConsume data = new RepairConsume();
//耗材名称
String name = dataFormatter.formatCellValue(row.getCell(0));
ConsumeNames.add(name);
if (ConsumeNames.stream().distinct().count() != ConsumeNames.size()) {
return CommonResult.fail("导入的Excel中" + name + "存在重复数据");
}
data.setName(name);
//校区
String schoolName = dataFormatter.formatCellValue(row.getCell(1));
Optional school = schools.stream().filter(e -> e.getName().equals(schoolName)).findFirst();
if (school != null && school.isPresent()) {
data.setSchoolId(school.get().getId());
} else {
return CommonResult.fail(name + "的" + schoolName + "校区数据在数据库中不存在");
}
//报修物品(类别)
String article = dataFormatter.formatCellValue(row.getCell(2));
String[] articleStrs = null;
if (article.contains("、")) {
articleStrs = article.split("、");
} else if (article.contains(",")) {
articleStrs = article.split(",");
} else {
articleStrs = new String[1];
articleStrs[0] = article;
}
List ass = new ArrayList<>();
for (String as : articleStrs) {
if (!as.equals("")) {
Optional shiftData = articles.stream().filter(e -> e.getName().equals(as)).findFirst();
if (shiftData != null && shiftData.isPresent()) {
ass.add(shiftData.get().getId().toString());
} else {
return CommonResult.fail(name + "的" + as + "数据不存在");
}
}
data.setArticleId(StringUtils.join(ass, ','));
result.add(data);
}
//价格
BigDecimal price = new BigDecimal(dataFormatter.formatCellValue(row.getCell(3)));
data.setPrice(price);
}
}
return CommonResult.ok(result);
}
}