MaterialServiceImpl.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. package com.kcim.service.impl;
  2. import cn.afterturn.easypoi.excel.ExcelExportUtil;
  3. import cn.afterturn.easypoi.excel.ExcelImportUtil;
  4. import cn.afterturn.easypoi.excel.entity.ExportParams;
  5. import cn.afterturn.easypoi.excel.entity.ImportParams;
  6. import cn.afterturn.easypoi.excel.entity.result.ExcelVerifyHandlerResult;
  7. import cn.afterturn.easypoi.handler.inter.IExcelVerifyHandler;
  8. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  9. import com.kcim.common.constants.NumberConstant;
  10. import com.kcim.common.exception.CostException;
  11. import com.kcim.common.util.BeanUtil;
  12. import com.kcim.common.util.PageUtils;
  13. import com.kcim.common.util.UserContext;
  14. import com.kcim.common.util.excel.ExcelStyleUtil;
  15. import com.kcim.common.util.excel.entity.MaterialImportEntity;
  16. import com.kcim.dao.model.Material;
  17. import com.kcim.dao.model.OrderItemMap;
  18. import com.kcim.dao.repository.MaterialRepository;
  19. import com.kcim.service.MaterialService;
  20. import lombok.AllArgsConstructor;
  21. import lombok.SneakyThrows;
  22. import lombok.extern.slf4j.Slf4j;
  23. import org.apache.poi.ss.usermodel.Workbook;
  24. import org.springframework.stereotype.Service;
  25. import org.springframework.util.CollectionUtils;
  26. import org.springframework.util.ObjectUtils;
  27. import org.springframework.util.StringUtils;
  28. import org.springframework.web.multipart.MultipartFile;
  29. import javax.servlet.http.HttpServletResponse;
  30. import java.io.FileNotFoundException;
  31. import java.io.IOException;
  32. import java.io.InputStream;
  33. import java.net.URLEncoder;
  34. import java.util.ArrayList;
  35. import java.util.Date;
  36. import java.util.List;
  37. import java.util.Objects;
  38. /**
  39. * @program: CostAccount
  40. * @description: 材料成本管理接口实现类
  41. * @author: Wang.YS
  42. * @create: 2023-11-07 14:21
  43. **/
  44. @Service("MaterialService")
  45. @Slf4j
  46. @AllArgsConstructor
  47. public class MaterialServiceImpl implements MaterialService {
  48. MaterialRepository repository;
  49. /**
  50. * 获取列表数据
  51. * @param current 当前页
  52. * @param pageSize 页容量
  53. * @param name 项目名称
  54. * @param itemType 项目类型
  55. * @param stop 是否停用 0启用 1停用 默认 0
  56. * @return 列表
  57. */
  58. @Override
  59. public Object getMaterialList(Integer current, Integer pageSize, String name, Integer itemType, Integer stop) {
  60. Page<Material> page = repository.getPage(current, pageSize, name, itemType, stop);
  61. List<Material> records = page.getRecords();
  62. if(CollectionUtils.isEmpty(records)){
  63. return new PageUtils(new ArrayList<>(), NumberConstant.ZERO,pageSize,current);
  64. }
  65. for (Material record : records) {
  66. // 1 不计价材料 2高值材料 3 低值材料
  67. Integer type = record.getType();
  68. if(type.equals(NumberConstant.ONE)){
  69. record.setTypeName("不计价材料");
  70. } else if (type.equals(NumberConstant.TWO)) {
  71. record.setTypeName("高值材料");
  72. } else if (type.equals(NumberConstant.THREE)) {
  73. record.setTypeName("低值材料");
  74. }
  75. }
  76. return new PageUtils(records, Math.toIntExact(page.getTotal()),pageSize,current);
  77. }
  78. /**
  79. * 新增材料
  80. * @param request 新增入参
  81. */
  82. @Override
  83. public void addMaterial(Material request) {
  84. List<Material> materials = repository.getByCode(request.getCode());
  85. if(!CollectionUtils.isEmpty(materials)){
  86. throw new CostException("当前材料代码已存在,请修改后再保存");
  87. }
  88. request.setHospId(UserContext.getCurrentLoginHospId());
  89. request.setCreateTime(new Date());
  90. request.setCreateUser(String.valueOf(UserContext.getCurrentUser().getId()));
  91. if(request.getStatus() != null &&request.getStatus().equals(NumberConstant.ONE)){
  92. Date stopTime = request.getStopTime();
  93. if(stopTime == null){
  94. throw new CostException("当前材料停用标志为停用,停用时间必填");
  95. }
  96. }else {
  97. request.setStatus(NumberConstant.ZERO);
  98. }
  99. repository.save(request);
  100. }
  101. /**
  102. * 编辑材料
  103. * @param request 入参
  104. */
  105. @Override
  106. public void editMaterial(Material request) {
  107. Integer id = request.getId();
  108. if(id ==null){
  109. throw new CostException("编辑材料时,主键必填");
  110. }
  111. Material material = repository.getById(id);
  112. Material materialOne = repository.getOneByCode(request.getCode());
  113. if(Objects.nonNull(material)){
  114. if(Objects.isNull(materialOne)||materialOne.getId().equals(id)){
  115. BeanUtil.convertObj(request,material);
  116. material.setUpdateTime(new Date());
  117. material.setUpdateUser(String.valueOf(UserContext.getCurrentUser().getId()));
  118. if(material.getStatus() != null &&material.getStatus().equals(NumberConstant.ONE)){
  119. Date stopTime = request.getStopTime();
  120. if(stopTime == null){
  121. throw new CostException("当前材料停用标志为停用,停用时间必填");
  122. }
  123. }else {
  124. material.setStopTime(null);
  125. }
  126. repository.updateById(material);
  127. }else {
  128. throw new CostException("当前材料代码已存在,请修改后再保存");
  129. }
  130. }
  131. }
  132. /**
  133. * 删除材料
  134. * @param id 主键
  135. */
  136. @Override
  137. public void deleteMaterial(Integer id) {
  138. repository.deleteMaterial(id);
  139. }
  140. /**
  141. * 导出材料模版
  142. * @param response 出参
  143. * @return 模版出参
  144. */
  145. @SneakyThrows
  146. @Override
  147. public Object exportMaterial(HttpServletResponse response) {
  148. try {
  149. //配置excel 文件信息
  150. ExportParams params = new ExportParams();
  151. params.setTitle("说明:1、为了保证成功导入,请勿修改模板格式\n" +
  152. " 2、项目类型、停用字段为下拉选择字段,不可填写选项外的内容\n" +
  153. " 3、停用字段为是时,必须填写对应的停用时间,格式:yyyy-MM-dd HH:mm:ss");
  154. //设置导出样式
  155. params.setStyle(ExcelStyleUtil.class);
  156. //设置sheetName
  157. params.setTitleHeight((short) 15);
  158. params.setSheetName("材料项目");
  159. // FileOutputStream outputStream = new FileOutputStream("E:\\材料项目成本导入模版.xlsx");
  160. Workbook workbook = ExcelExportUtil.exportExcel(params, MaterialImportEntity.class,new ArrayList<>());
  161. response.setCharacterEncoding("UTF-8");
  162. response.setContentType("application/vnd.ms-excel");
  163. String fileName ="材料项目成本导入模版";
  164. response.setHeader("Content-Disposition", URLEncoder.encode(fileName, "UTF-8"));
  165. workbook.write(response.getOutputStream());
  166. // workbook.write(outputStream);
  167. // outputStream.close();
  168. workbook.close();
  169. log.info("导出文件:{}",fileName);
  170. } catch (FileNotFoundException e) {
  171. throw new CostException(e.getMessage());
  172. } catch (IOException e) {
  173. throw new RuntimeException(e);
  174. }
  175. return response.getOutputStream();
  176. }
  177. /**
  178. * 导入材料excel
  179. * @param file excel 文件
  180. */
  181. @Override
  182. public void importMaterial(MultipartFile file) {
  183. try {
  184. if (ObjectUtils.isEmpty(file) || file.getSize() == 0){
  185. throw new CostException("未获取到导入的excel文件内容");
  186. }
  187. log.info("接收到文件:{}",file.getOriginalFilename());
  188. // 参数1:文件流
  189. InputStream stream = file.getInputStream();
  190. // 参数2:导入类型
  191. ImportParams params = new ImportParams();
  192. //校验Excel 去掉空行
  193. params.setNeedVerify(true);
  194. IExcelVerifyHandler<MaterialImportEntity> handler = val ->{
  195. if(StringUtils.isEmpty(val.getCode())){
  196. return new ExcelVerifyHandlerResult(false,"材料项目代码不能为空");
  197. }
  198. if(StringUtils.isEmpty(val.getName())){
  199. return new ExcelVerifyHandlerResult(false,"材料名称不能为空");
  200. }
  201. return new ExcelVerifyHandlerResult(true);
  202. };
  203. params.setVerifyHandler(handler);
  204. // 标题占用多少行
  205. params.setTitleRows(1);
  206. // 头部属性占用多少行
  207. params.setHeadRows(1);
  208. List<MaterialImportEntity> materialImportEntities = ExcelImportUtil.importExcel(stream, MaterialImportEntity.class,params);
  209. if(!CollectionUtils.isEmpty(materialImportEntities)){
  210. List<Material> saveList = new ArrayList<>();
  211. Material materialCost = new Material();
  212. materialCost.setHospId(UserContext.getHospId());
  213. materialCost.setCreateTime(new Date());
  214. materialCost.setCreateUser(String.valueOf(UserContext.getCurrentUser().getId()));
  215. for (MaterialImportEntity entity : materialImportEntities) {
  216. Material material = BeanUtil.convertObj(materialCost, Material.class);
  217. material.setCode(entity.getCode());
  218. material.setName(entity.getName());
  219. material.setType(entity.getType());
  220. material.setStatus(entity.getStatus());
  221. material.setStopTime(entity.getStopTime());
  222. material.setPrice(entity.getPrice());
  223. material.setCost(entity.getCost());
  224. saveList.add(material);
  225. }
  226. if(!CollectionUtils.isEmpty(saveList)){
  227. check();
  228. repository.saveBatch(saveList,50);
  229. }
  230. }
  231. } catch (Exception e) {
  232. throw new CostException(e.getMessage());
  233. }
  234. }
  235. @Override
  236. public List<OrderItemMap> getItemDict(String name) {
  237. List<Material> list = repository.getList(name);
  238. if(CollectionUtils.isEmpty(list)){
  239. return new ArrayList<>();
  240. }
  241. List<OrderItemMap> returnList = new ArrayList<>();
  242. for (Material item : list) {
  243. OrderItemMap orderItemMap = new OrderItemMap();
  244. orderItemMap.setItemCode(item.getCode());
  245. orderItemMap.setItemName(item.getName());
  246. orderItemMap.setItemType(String.valueOf(NumberConstant.TWO));
  247. returnList.add(orderItemMap);
  248. }
  249. return returnList;
  250. }
  251. private void check() {
  252. List<Material> list = repository.getList();
  253. if(!CollectionUtils.isEmpty(list)){
  254. repository.removeList(list);
  255. }
  256. }
  257. }