RepairConsumeController.java 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425
  1. package com.repair.controller;
  2. import com.repair.api.RepairConsumeControllerAPI;
  3. import com.repair.common.utils.ExcelExportUtil;
  4. import com.repair.common.utils.ExcelUtils;
  5. import com.repair.common.utils.TimeExchange;
  6. import com.repair.common.utils.paramUtils;
  7. import com.repair.model.enumModel.eFileType;
  8. import com.repair.model.enumModel.eRecordStatu;
  9. import com.repair.model.pojo.*;
  10. import com.repair.model.request.insertRepairAssociationRequest;
  11. import com.repair.model.request.insertRepairConsumeRequest;
  12. import com.repair.model.request.updateRepairConsumeRequest;
  13. import com.repair.model.result.CommonResult;
  14. import com.repair.model.result.PageUtils;
  15. import com.repair.model.vo.ChangePriceConsumeVo;
  16. import com.repair.model.vo.ConsumeVo;
  17. import com.repair.model.vo.RepairConsumeVo;
  18. import com.repair.model.vo.RepairSchoolVo;
  19. import com.repair.services.RepairAreaService;
  20. import com.repair.services.RepairArticleTypeService;
  21. import com.repair.services.RepairConsumeService;
  22. import com.repair.services.RepairRecordService;
  23. import org.apache.commons.lang3.StringUtils;
  24. import org.apache.poi.hpsf.Decimal;
  25. import org.apache.poi.hssf.usermodel.HSSFRow;
  26. import org.apache.poi.hssf.usermodel.HSSFSheet;
  27. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  28. import org.apache.poi.ss.usermodel.CellType;
  29. import org.apache.poi.ss.usermodel.DataFormatter;
  30. import org.apache.poi.ss.usermodel.Workbook;
  31. import org.apache.poi.xssf.usermodel.XSSFRow;
  32. import org.apache.poi.xssf.usermodel.XSSFSheet;
  33. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
  34. import org.springframework.beans.factory.annotation.Autowired;
  35. import org.springframework.validation.BindingResult;
  36. import org.springframework.web.bind.annotation.RestController;
  37. import org.springframework.web.multipart.MultipartFile;
  38. import javax.servlet.http.HttpServletResponse;
  39. import java.io.IOException;
  40. import java.io.InputStream;
  41. import java.lang.reflect.InvocationTargetException;
  42. import java.math.BigDecimal;
  43. import java.util.*;
  44. /**
  45. * <p>
  46. * 前端控制器
  47. * </p>
  48. *
  49. * @author ceshi
  50. * @since 2023-07-18
  51. */
  52. @RestController
  53. public class RepairConsumeController implements RepairConsumeControllerAPI {
  54. @Autowired
  55. private RepairAreaService repairAreaService;
  56. @Autowired
  57. private RepairRecordService repairRecordService;
  58. @Autowired
  59. private RepairConsumeService repairConsumeService;
  60. @Autowired
  61. private RepairArticleTypeService repairArticleTypeService;
  62. @Override
  63. public CommonResult InsertRepairAssociation(insertRepairAssociationRequest irc, BindingResult bindingResult) {
  64. if (bindingResult.hasErrors()) {
  65. String st = paramUtils.getParamError(bindingResult);
  66. return CommonResult.fail(st);
  67. }
  68. RepairConsume data = repairConsumeService.queryConsumeByName(irc.getName(), irc.getSchoolId());
  69. if (data != null) {
  70. return CommonResult.fail("该报修耗材已存在!");
  71. }
  72. RepairConsume rc = new RepairConsume()
  73. .setName(irc.getName())
  74. .setSchoolId(irc.getSchoolId())
  75. .setArticleId(irc.getArticleId())
  76. .setPrice(new BigDecimal(0));
  77. int result = repairConsumeService.insertRepairConsume(rc);
  78. return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
  79. }
  80. @Override
  81. public CommonResult InsertRepairConsume(insertRepairConsumeRequest ircr, BindingResult bindingResult) {
  82. if (bindingResult.hasErrors()) {
  83. String st = paramUtils.getParamError(bindingResult);
  84. return CommonResult.fail(st);
  85. }
  86. RepairConsume data = repairConsumeService.queryConsumeByName(ircr.getName(), ircr.getSchoolId());
  87. if (data != null) {
  88. return CommonResult.fail("该报修耗材已存在!");
  89. }
  90. RepairConsume rc = new RepairConsume()
  91. .setName(ircr.getName())
  92. .setSchoolId(ircr.getSchoolId())
  93. .setArticleId(StringUtils.join(ircr.getArticleIds(), ','))
  94. .setPrice(ircr.getPrice())
  95. .setContent(ircr.getContent());
  96. int result = repairConsumeService.insertRepairConsume(rc);
  97. return result > 0 ? CommonResult.ok("添加成功") : CommonResult.fail("添加失败");
  98. }
  99. @Override
  100. public CommonResult updateRepairConsumeById(updateRepairConsumeRequest urcr, BindingResult bindingResult) {
  101. if (bindingResult.hasErrors()) {
  102. String st = paramUtils.getParamError(bindingResult);
  103. return CommonResult.fail(st);
  104. }
  105. RepairConsume data = repairConsumeService.queryConsumeByName(urcr.getName(), urcr.getSchoolId());
  106. if (data != null && !data.getId().equals(urcr.getId())) {
  107. return CommonResult.fail("该报修耗材已存在!");
  108. }
  109. RepairConsume rc = new RepairConsume()
  110. .setId(urcr.getId())
  111. .setSchoolId(urcr.getSchoolId())
  112. .setName(urcr.getName())
  113. .setArticleId(StringUtils.join(urcr.getArticleIds(), ','))
  114. .setPrice(urcr.getPrice())
  115. .setContent(urcr.getContent());
  116. int result = repairConsumeService.updateRepairConsume(rc);
  117. return result > 0 ? CommonResult.ok("修改成功") : CommonResult.fail("修改失败");
  118. }
  119. @Override
  120. public CommonResult queryPageRepairConsumes(int currentPage, int pageCount, String name, String startTime, String endTime) {
  121. if (startTime != null && endTime != null) {
  122. try {
  123. startTime = TimeExchange.getStartOfDayStr(TimeExchange.StringToDate(startTime, "yyyy-MM-dd"));
  124. endTime = TimeExchange.getEndOfDayStr(TimeExchange.StringToDate(endTime, "yyyy-MM-dd"));
  125. } catch (Exception e) {
  126. }
  127. }
  128. PageUtils<RepairConsumeVo> result = repairConsumeService.queryPageRepairConsumes(currentPage, pageCount, name, startTime, endTime);
  129. for (RepairConsumeVo r : result.getList()) {
  130. if (r.getArticleId() != null) {
  131. r.setArticleIds(Arrays.asList(r.getArticleId().split(",")));
  132. }
  133. if (r.getArticleName() != null) {
  134. r.setArticleNames(Arrays.asList(r.getArticleName().split(",")));
  135. }
  136. }
  137. return CommonResult.ok(result);
  138. }
  139. @Override
  140. public CommonResult deleteRepairConsumeById(int id) {
  141. RepairConsume data = repairConsumeService.getRepairById(id);
  142. if (data == null) {
  143. return CommonResult.fail("当前数据不存在,删除失败!");
  144. }
  145. int result = repairConsumeService.deleteRepairConsumeById(id);
  146. return result > 0 ? CommonResult.ok("删除成功") : CommonResult.fail("删除失败");
  147. }
  148. @Override
  149. public void downloadRepairConsumeExcel(String name, String startTime, String endTime, HttpServletResponse response) throws NoSuchMethodException, InstantiationException, IllegalAccessException, InvocationTargetException {
  150. Map<String, String> map = new HashMap<>();
  151. //表头与键值对的映射关系
  152. map.put("id", "数据ID");
  153. map.put("name", "耗材名称");
  154. map.put("schoolName", "校区名称");
  155. map.put("price", "耗材单价");
  156. map.put("artileName", "物品类型");
  157. map.put("entryName", "录入人员");
  158. map.put("updateTimeStr", "录入时间");
  159. if (startTime != null && endTime != null) {
  160. try {
  161. startTime = TimeExchange.getStartOfDayStr(TimeExchange.StringToDate(startTime, "yyyy-MM-dd"));
  162. endTime = TimeExchange.getEndOfDayStr(TimeExchange.StringToDate(endTime, "yyyy-MM-dd"));
  163. } catch (Exception e) {
  164. }
  165. }
  166. List<ConsumeVo> datas = repairConsumeService.queryConsumeList(name, startTime, endTime);
  167. List<String> orderList = new ArrayList<>();
  168. orderList.add("id");
  169. orderList.add("name");
  170. orderList.add("schoolName");
  171. orderList.add("price");
  172. orderList.add("artileName");
  173. orderList.add("entryName");
  174. orderList.add("updateTimeStr");
  175. //导出逻辑 这里的list是从导入里面哪来的 map1与map不一样 orderList这里为空
  176. Workbook workbook = ExcelExportUtil.createWorkbook(datas, map, 1, "耗材管理表", orderList);
  177. ExcelUtils.excelDownload(workbook, "耗材管理.xlsx", response);
  178. }
  179. @Override
  180. public void downloadRepairConsumeModelExcel(HttpServletResponse response) {
  181. ExcelUtils.fileDownload("/耗材管理模板.xlsx", response);
  182. }
  183. @Override
  184. public CommonResult importRepairConsumeExcel(MultipartFile file) throws IOException {
  185. String ContentType = file.getContentType();
  186. InputStream inputStream = file.getInputStream();
  187. List<RepairConsume> result = new ArrayList<>();
  188. //xls格式文件
  189. if (ContentType.equals(eFileType.Xls.getValue())) {
  190. CommonResult<List<RepairConsume>> resultData = readXls(inputStream);
  191. if (!resultData.isSuccess()) {
  192. return resultData;
  193. }
  194. result = resultData.getData();
  195. } else if (ContentType.equals(eFileType.Xlsx.getValue())) {
  196. CommonResult<List<RepairConsume>> resultData = readXlsx(inputStream);
  197. if (!resultData.isSuccess()) {
  198. return resultData;
  199. }
  200. result = resultData.getData();
  201. } else {
  202. return CommonResult.fail("耗材数据导入只支持Xls、Xlsx");
  203. }
  204. boolean resultBool = repairConsumeService.saveBatch(result);
  205. return resultBool ? CommonResult.ok("导入成功") : CommonResult.fail("导入失败");
  206. }
  207. private CommonResult<List<RepairConsume>> readXls(InputStream inputStream) throws IOException {
  208. HSSFWorkbook sheets = new HSSFWorkbook(inputStream);
  209. List<RepairConsume> result = new ArrayList<>();
  210. List<String> ConsumeNames = new ArrayList<>();
  211. //读取第一张sheet
  212. HSSFSheet sheetAt = sheets.getSheetAt(0);
  213. //获取校区数据
  214. List<RepairSchoolVo> schools = repairAreaService.queryRepairSchools();
  215. //报修物品
  216. List<RepairArticleType> articles = repairArticleTypeService.getRepairArticleTypes();
  217. DataFormatter dataFormatter = new DataFormatter();
  218. //sheetAt.getLastRowNum():从0开始统计数量 所以得+1
  219. for (int rowNum = 1; rowNum < sheetAt.getLastRowNum() + 1; rowNum++) {
  220. HSSFRow row = sheetAt.getRow(rowNum);
  221. if (rowNum == 1) {
  222. String name = dataFormatter.formatCellValue(row.getCell(0));//耗材名称
  223. if (!name.equals("名称")) {
  224. return CommonResult.fail("导入数据第一列为名称");
  225. }
  226. String schoolName = dataFormatter.formatCellValue(row.getCell(1));//校区名称
  227. if (!schoolName.equals("校区")) {
  228. return CommonResult.fail("导入数据第二列为校区");
  229. }
  230. String ArticleName = dataFormatter.formatCellValue(row.getCell(2));//报修物品类别
  231. if (!ArticleName.equals("类别")) {
  232. return CommonResult.fail("导入数据第三列为类别");
  233. }
  234. String price = dataFormatter.formatCellValue(row.getCell(3));//耗材单价
  235. if (!price.equals("价格(元)")) {
  236. return CommonResult.fail("导入数据第四列为价格");
  237. }
  238. } else {
  239. RepairConsume data = new RepairConsume();
  240. //耗材名称
  241. String name = dataFormatter.formatCellValue(row.getCell(0));
  242. ConsumeNames.add(name);
  243. if (ConsumeNames.stream().distinct().count() != ConsumeNames.size()) {
  244. return CommonResult.fail("导入的Excel中" + name + "存在重复数据");
  245. }
  246. data.setName(name);
  247. //校区
  248. String schoolName = dataFormatter.formatCellValue(row.getCell(1));
  249. Optional<RepairSchoolVo> school = schools.stream().filter(e -> e.getName().equals(schoolName)).findFirst();
  250. if (school != null && school.isPresent()) {
  251. data.setSchoolId(school.get().getId());
  252. } else {
  253. return CommonResult.fail(name + "的" + schoolName + "校区数据在数据库中不存在");
  254. }
  255. //报修物品(类别)
  256. String article = dataFormatter.formatCellValue(row.getCell(2));
  257. String[] articleStrs = null;
  258. if (article.contains("、")) {
  259. articleStrs = article.split("、");
  260. } else if (article.contains(",")) {
  261. articleStrs = article.split(",");
  262. } else {
  263. articleStrs = new String[1];
  264. articleStrs[0] = article;
  265. }
  266. List<String> ass = new ArrayList<>();
  267. for (String as : articleStrs) {
  268. if (!as.equals("")) {
  269. Optional<RepairArticleType> shiftData = articles.stream().filter(e -> e.getName().equals(as)).findFirst();
  270. if (shiftData != null && shiftData.isPresent()) {
  271. ass.add(shiftData.get().getId().toString());
  272. } else {
  273. return CommonResult.fail(name + "的" + as + "数据不存在");
  274. }
  275. }
  276. data.setArticleId(StringUtils.join(ass, ','));
  277. result.add(data);
  278. }
  279. //价格
  280. BigDecimal price = new BigDecimal(String.valueOf(row.getCell(3))).stripTrailingZeros();
  281. data.setPrice(price);
  282. }
  283. }
  284. return CommonResult.ok(result);
  285. }
  286. private CommonResult<List<RepairConsume>> readXlsx(InputStream inputStream) throws IOException {
  287. XSSFWorkbook sheets = new XSSFWorkbook(inputStream);
  288. List<RepairConsume> result = new ArrayList<>();
  289. List<String> ConsumeNames = new ArrayList<>();
  290. //读取第一张sheet
  291. XSSFSheet sheetAt = sheets.getSheetAt(0);
  292. //获取校区数据
  293. List<RepairSchoolVo> schools = repairAreaService.queryRepairSchools();
  294. //报修物品
  295. List<RepairArticleType> articles = repairArticleTypeService.getRepairArticleTypes();
  296. DataFormatter dataFormatter = new DataFormatter();
  297. //sheetAt.getLastRowNum():从0开始统计数量 所以得+1
  298. for (int rowNum = 1; rowNum < sheetAt.getLastRowNum() + 1; rowNum++) {
  299. XSSFRow row = sheetAt.getRow(rowNum);
  300. if (rowNum == 1) {
  301. String name = dataFormatter.formatCellValue(row.getCell(0));//耗材名称
  302. if (!name.equals("名称")) {
  303. return CommonResult.fail("导入数据第一列为名称");
  304. }
  305. String schoolName = dataFormatter.formatCellValue(row.getCell(1));//校区名称
  306. if (!schoolName.equals("校区")) {
  307. return CommonResult.fail("导入数据第二列为校区");
  308. }
  309. String ArticleName = dataFormatter.formatCellValue(row.getCell(2));//报修物品类别
  310. if (!ArticleName.equals("类别")) {
  311. return CommonResult.fail("导入数据第三列为类别");
  312. }
  313. String price = dataFormatter.formatCellValue(row.getCell(3));//耗材单价
  314. if (!price.equals("价格(元)")) {
  315. return CommonResult.fail("导入数据第四列为价格");
  316. }
  317. } else {
  318. RepairConsume data = new RepairConsume();
  319. //耗材名称
  320. String name = dataFormatter.formatCellValue(row.getCell(0));
  321. ConsumeNames.add(name);
  322. if (ConsumeNames.stream().distinct().count() != ConsumeNames.size()) {
  323. return CommonResult.fail("导入的Excel中" + name + "存在重复数据");
  324. }
  325. data.setName(name);
  326. //校区
  327. String schoolName = dataFormatter.formatCellValue(row.getCell(1));
  328. Optional<RepairSchoolVo> school = schools.stream().filter(e -> e.getName().equals(schoolName)).findFirst();
  329. if (school != null && school.isPresent()) {
  330. data.setSchoolId(school.get().getId());
  331. } else {
  332. return CommonResult.fail(name + "的" + schoolName + "校区数据在数据库中不存在");
  333. }
  334. //报修物品(类别)
  335. String article = dataFormatter.formatCellValue(row.getCell(2));
  336. String[] articleStrs = null;
  337. if (article.contains("、")) {
  338. articleStrs = article.split("、");
  339. } else if (article.contains(",")) {
  340. articleStrs = article.split(",");
  341. } else {
  342. articleStrs = new String[1];
  343. articleStrs[0] = article;
  344. }
  345. List<String> ass = new ArrayList<>();
  346. for (String as : articleStrs) {
  347. if (!as.equals("")) {
  348. Optional<RepairArticleType> shiftData = articles.stream().filter(e -> e.getName().equals(as)).findFirst();
  349. if (shiftData != null && shiftData.isPresent()) {
  350. ass.add(shiftData.get().getId().toString());
  351. } else {
  352. return CommonResult.fail(name + "的" + as + "数据不存在");
  353. }
  354. }
  355. data.setArticleId(StringUtils.join(ass, ','));
  356. result.add(data);
  357. }
  358. //价格
  359. BigDecimal price = new BigDecimal(dataFormatter.formatCellValue(row.getCell(3)));
  360. data.setPrice(price);
  361. }
  362. }
  363. return CommonResult.ok(result);
  364. }
  365. }