package com.whyc.service; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.github.pagehelper.PageHelper; import com.github.pagehelper.PageInfo; import com.whyc.constant.UserOperation; import com.whyc.dto.FileDirPath; import com.whyc.dto.Response; import com.whyc.dto.ZipUtils; import com.whyc.mapper.AttachLockMapper; import com.whyc.mapper.MaterialMapper; import com.whyc.mapper.ProductBomMapper; import com.whyc.mapper.ProductMapper; import com.whyc.pojo.*; import com.whyc.util.ActionUtil; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.usermodel.ClientAnchor; import org.apache.poi.ss.usermodel.IndexedColors; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.RequestParam; import javax.imageio.ImageIO; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.awt.image.BufferedImage; import java.io.*; import java.net.URLEncoder; import java.util.ArrayList; import java.util.Date; import java.util.LinkedList; import java.util.List; @Service public class ProductBomService { @Autowired(required = false) private ProductBomMapper mapper; @Autowired(required = false) private MaterialMapper cponentMapper; @Autowired(required = false) private ProductMapper productMapper; @Autowired(required = false) private AttachLockMapper attachLockMapper; @Autowired private DocLogService logService; //图纸分类检索 public Response searchCadDrawer(ProductBom productBom,int pageCurr,int pageSize) { PageHelper.startPage(pageCurr,pageSize); List list=mapper.searchCadDrawer(productBom); PageInfo pageInfo=new PageInfo(list); return new Response().setII(1,list.size()>0,pageInfo,"数据返回"); } /* //图纸文件下载 public void downloadCadDrawer(HttpServletRequest req, HttpServletResponse resp, List boms) { HSSFWorkbook wb = new HSSFWorkbook(); //字体格式-加粗 HSSFCellStyle cellStyle = wb.createCellStyle(); HSSFFont font = wb.createFont(); font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); cellStyle.setFont(font); //生成excel并将dwg文件放在同一报下压缩 creatBomExcel(req,resp,boms,wb,"pic"); //记录日志 DocUser docUser= ActionUtil.getUser(); String operationDetail="具体图纸为数量:"+boms.size(); String opreationMsg="执行了文件打包下载操作"; String terminalIp=req.getRemoteAddr(); logService.recordOperationLog(docUser.getId(),docUser.getName(), UserOperation.TYPE_DOWNLOAD.getType(),new Date(),terminalIp,opreationMsg,operationDetail); }*/ //根据子件code获取最终的信息 public Response getBomBySubcode(String scode) { QueryWrapper wrapper=new QueryWrapper(); wrapper.eq("sub_code",scode); wrapper.last("limit 1"); ProductBom productBom=mapper.selectOne(wrapper); return new Response().setII(1,productBom!=null,productBom,"返回数据"); } /**获取产品的信息(不包含子料)*/ public ProductBom getProduct(String parentModel){ QueryWrapper query = Wrappers.query(); query.eq("parent_model",parentModel).last(" limit 1"); return mapper.selectOne(query); } /** 删除旧的bom,增加新的bom*/ @Transactional public void updateNewBom(List newBomHistoryList) { UpdateWrapper update = Wrappers.update(); //lxw注释 //update.eq("parent_model",newBomHistoryList.get(0).getParentModel()); mapper.delete(update); List newBomList = new LinkedList<>(); newBomHistoryList.forEach(newBomHis->{ ProductBom newBom = new ProductBom(); newBom.setCategory(newBomHis.getCategory()); newBom.setCreateDate(new Date()); newBom.setDwgUrl(newBomHis.getDwgUrl()); newBom.setFileUrl(newBomHis.getFileUrl()); newBom.setMaterial(newBomHis.getMaterial()); newBom.setNotes(newBomHis.getNotes()); //newBom.setParentCode(newBomHis.getParentCode()); //newBom.setParentModel(newBomHis.getParentModel()); //newBom.setParentName(newBomHis.getParentName()); //newBom.setParentVersion(newBomHis.getParentVersion()); newBom.setPictureUrl(newBomHis.getPictureUrl()); newBom.setProducer(newBomHis.getProducer()); newBom.setQuantity(newBomHis.getQuantity()); newBom.setSubCode(newBomHis.getSubCode()); newBom.setSubModel(newBomHis.getSubModel()); newBom.setSubName(newBomHis.getSubName()); newBom.setSurfaceDetail(newBomHis.getSurfaceDetail()); newBom.setThickness(newBomHis.getThickness()); newBom.setType(newBomHis.getType()); newBom.setUnit(newBomHis.getUnit()); //newBom.setUpUserId(newBomHis.getUpUserId()); //newBom.setVersion(newBomHis.getEVersion()); newBomList.add(newBom); }); mapper.insertBatchSomeColumn(newBomList); } //将选中的文件存入指定目录下 public void copyFile(File source,String dest ){ //创建目的地文件夹 File destfile = new File(dest); if(!destfile.exists()) { destfile.mkdir(); }/*else{ if(i==0){ ZipUtils.delDir(dest); } }*/ //source是文件,则用字节输入输出流复制文件 try { if(source.isFile()){ FileInputStream fis = new FileInputStream(source); //创建新的文件,保存复制内容,文件名称与源文件名称一致 File dfile = new File(dest+File.separator+source.getName()); if(!dfile.exists()){ dfile.createNewFile(); } FileOutputStream fos = new FileOutputStream(dfile); // 读写数据 // 定义数组 byte[] b = new byte[1024]; // 定义长度 int len; // 循环读取 while ((len = fis.read(b))!=-1) { // 写出数据 fos.write(b, 0 , len); } //关闭资源 fos.close(); fis.close(); } } catch (IOException e) { e.printStackTrace(); } } //文件夹的拷贝 public void copyDir(String sourcePathDir, String newPathDir) { File start = new File(sourcePathDir); File end = new File(newPathDir); if(!start.exists()) { return; } String[] filePath = start.list();//获取该文件夹下的所有文件以及目录的名字 if(!end.exists()) { end.mkdir(); } if(filePath.length>=0){ for(String temp : filePath) { //添加满足情况的条件 if(new File(sourcePathDir + File.separator + temp ).isFile()) { //为文件则进行拷贝 copyFile(new File(sourcePathDir + File.separator + temp ), newPathDir ); } } } } //文件夹的拷贝移除productId对应的被锁定的 public void copyDirWithOutProductId(String sourcePathDir, String newPathDir,int productId) { File start = new File(sourcePathDir); File end = new File(newPathDir); if(!start.exists()) { return; } String[] filePath = start.list();//获取该文件夹下的所有文件以及目录的名字 if(!end.exists()) { end.mkdir(); } if(filePath.length>=0){ for(String temp : filePath) { //添加满足情况的条件 if(new File(sourcePathDir + File.separator + temp ).isFile()) { QueryWrapper wrapper=new QueryWrapper(); wrapper.eq("product_id",productId); wrapper.eq("attach_name",temp); wrapper.eq("lock_flag",1); wrapper.last("limit 1"); AttachLock attachLock=attachLockMapper.selectOne(wrapper); if(attachLock==null){ //为文件则进行拷贝 copyFile(new File(sourcePathDir + File.separator + temp ), newPathDir ); } } } } } public void updateUrl(List fileBomApprovingList) { mapper.updateUrl(fileBomApprovingList); } /** * 获取所有产品信息*/ /*public Response getAllBom(String parentCode,String parentName,String parentModel, int pageCurr,int pageSize) { PageHelper.startPage(pageCurr,pageSize); QueryWrapper wrapper=new QueryWrapper(); wrapper.select("distinct parent_code","parent_name","parent_model","version").orderByAsc("id"); if(parentCode!=null&&!parentCode.isEmpty()){ wrapper.like("parent_code",parentCode); } if(parentName!=null&&!parentName.isEmpty()){ wrapper.like("parent_name",parentName); } if(parentModel!=null&&!parentModel.isEmpty()){ wrapper.like("parent_model",parentModel); } List list=mapper.selectList(wrapper); PageInfo pageInfo=new PageInfo(list); return new Response().setII(1,list!=null,pageInfo,"返回数据"); }*/ //产品下载(产品id和版本) public void downloadProduct(HttpServletRequest req, HttpServletResponse resp, int productId , int version , @RequestParam String oprateReason, @RequestParam String oprateInfo) { HSSFWorkbook wb = new HSSFWorkbook(); //读取产品信息 QueryWrapper wrapper=new QueryWrapper(); wrapper.eq("id",productId); wrapper.eq("version",version); wrapper.last("limit 1"); Product product=productMapper.selectOne(wrapper); //读取产品的子件和关联的物料信息 List list=mapper.getBomAndMaterial(productId,version); //处理存在关联关系的物料 List endList=new ArrayList<>(); list.stream().forEach(bom -> { bom.setConnFlag(0); if(bom.getDwgUrl()!=null){ QueryWrapper qwrapper=new QueryWrapper(); qwrapper.eq("material_id",bom.getMaterialId()); qwrapper.eq("attach_name",bom.getDwgUrl().substring(bom.getDwgUrl().lastIndexOf("\\")+1)); qwrapper.eq("lock_flag",1); qwrapper.last("limit 1"); AttachLock attachLock=attachLockMapper.selectOne(qwrapper); if(attachLock!=null){ bom.setDwgUrl(""); } } endList.add(bom); if(bom.getMaterials()!=null&&bom.getMaterials().size()>0){ for (Material m:bom.getMaterials()) { //将物料存放为一个bom为下载做准备 ProductBom copyBom=copyMaterialToBom(m); endList.add(copyBom); } } }); //将没有管理BOM的dwg文件拷贝下载 String withOutDwg="doc_file/product"+File.separator+product.getParentModel(); if(product.getCustomCode()!=null&&!product.getCustomCode().isEmpty()){ withOutDwg+=File.separator+product.getCustomCode()+File.separator+version; }else{ withOutDwg+=File.separator+"standard"+File.separator+version; } //生成excel并将dwg文件放在同一报下压缩 creatBomExcel(req,resp,product,endList,wb,withOutDwg,ActionUtil.sdfwithALL.format(product.getVersionTime()),oprateReason,oprateInfo); } //根据产品信息创建excel表格并存放在指定目录 private void creatBomExcel(HttpServletRequest req, HttpServletResponse resp,Product product,List list, HSSFWorkbook wb,String withOutDwg , String oprateVersion, @RequestParam String oprateReason, @RequestParam String oprateInfo){ String fileDirName = FileDirPath.getFileDirName(); String rootFace=""; String excelName=""; String[] titleNames=new String[]{"序列","母物料编码","母物料名称","母物料型号","类别","子件编码","子件名称","子件型号" ,"基本单位","子件数量","生产商","封装类型/材质","元件编号/料厚","表面处理/物料详情","备注","图片"}; //字体格式-加粗 HSSFCellStyle cellStyle = wb.createCellStyle(); cellStyle.setFillForegroundColor(IndexedColors.GOLD.getIndex());//添加前景色,内容看的清楚 cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); HSSFFont font = wb.createFont(); font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //font.setColor(HSSFFont.COLOR_RED); cellStyle.setFont(font); //创建单个sheet HSSFSheet sheet = wb.createSheet("产品信息"); sheet.setColumnWidth(1,5000); sheet.setColumnWidth(2,5000); sheet.setColumnWidth(3,5000); sheet.setColumnWidth(4,5000); sheet.setColumnWidth(6,5000); sheet.setColumnWidth(7,5000); sheet.setColumnWidth(8,5000); sheet.setColumnWidth(16,6000); sheet.setDefaultRowHeight((short)(1000)); //图片元素 HSSFPatriarch patriarch = sheet.createDrawingPatriarch(); int rownum = 1; HSSFRow row=sheet.createRow(rownum); HSSFCell cell=row.createCell(0); if(titleNames.length>0){ for (int i=0;i0){ for (int i=0;i0){ out.write(buffer,0,len); } in.close(); out.close(); file.delete(); ZipUtils.delDir(rootFace); } catch (FileNotFoundException | UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } //记录日志 logService.recordOperationLogDownLoad(ActionUtil.getUser().getId(),ActionUtil.getUser().getName(), UserOperation.TYPE_DOWNLOAD_PRODUCT.getType(),new Date(),req.getRemoteAddr() ,excelName+".zip",rootFace+".zip",oprateReason,oprateInfo,oprateVersion); } //查询所有产品中没有与指定散装件关联的子件 public Response getAllSubWithOutMaterial(int materialId) { List list=mapper.getAllSubWithOutMaterial(materialId); return new Response().setII(1,list.size()>0,list,"返回数据"); } //根据母料型号查询子件信息及有最新版本关联的散装件信息 /*public Response getSubByMaterialProduct(String parentModel) { List list=mapper.getSubByMaterialProduct(parentModel); //查询出存在替换关系得散装件 List replaceBoms=cponentMapper.getReplaceMaterial(parentModel); if(replaceBoms!=null&&replaceBoms.size()>0){ replaceBoms.stream().forEach(replaceBom->{ //如果存在替换关系,查询出原子件的关联关系(将原子件名称放在oldSubName中) if(replaceBom!=null&&!replaceBom.getSubName().isEmpty()) { //replaceBom表示为替换件 replaceBom.setReplaceStatus(1); if (replaceBom.getOldSubName() != null && !replaceBom.getOldSubName().isEmpty()) { //查询出存在的旧的关联子件,还要与原BOM版本一致 List oldCponent = mapper.getOldMaterial(replaceBom.getOldSubName()); replaceBom.setMaterials(oldCponent); } } list.add(replaceBom); } ); } return new Response().setII(1,list.size()>0,list,"返回数据"); }*/ //根据产品id查询子件及其关联的物料信息 public Response getBomAndMaterial(int productId,int version) { List list=mapper.getBomAndMaterial(productId,version); if(list!=null&&list.size()>0){ list.stream().forEach(bom -> { if(bom.getDwgUrl()!=null){ QueryWrapper wrapper=new QueryWrapper(); wrapper.eq("material_id",bom.getMaterialId()); wrapper.eq("attach_name",bom.getDwgUrl().substring(bom.getDwgUrl().lastIndexOf("\\")+1)); wrapper.last("limit 1"); AttachLock attachLock=attachLockMapper.selectOne(wrapper); if(attachLock!=null){ bom.setDwgUrl(""); } } }); } return new Response().setII(1,list.size()>0,list,"返回物料信息及关联物料"); } //将物料存放为一个bom为下载做准备 private ProductBom copyMaterialToBom(Material m) { ProductBom bom=new ProductBom(); bom.setType(m.getType()); //bom.setCategory(m.getCategory()); bom.setSubCode(m.getSubCode()); bom.setSubName(m.getSubName()); bom.setSubModel(m.getSubModel()); bom.setUnit(m.getUnit()); //bom.setQuantity(m.getQuantity()); //bom.setProducer(m.getProducer()); //bom.setMaterial(m.getMaterial()); //bom.setThickness(m.getThickness()); //bom.setSurfaceDetail(m.getSurfaceDetail()); //bom.setNotes(m.getNotes()); bom.setPictureUrl(m.getPictureUrl()); bom.setDwgUrl(m.getDwgUrl()); bom.setFileUrl(m.getFileUrl()); bom.setCreateDate(m.getCreateDate()); bom.setConnFlag(1); return bom; } public void insertBatch(List productBomList) { mapper.insertBatchSomeColumn(productBomList); } public List getBomByProductId(Integer productId) { QueryWrapper query = Wrappers.query(); query.eq("product_id",productId); return mapper.selectList(query); } public void deleteByProductId(Integer productId) { UpdateWrapper update = Wrappers.update(); update.eq("product_id",productId); mapper.delete(update); } public List getListByCodeAndModelList2(List bomList) { return mapper.getListByCodeAndModelList2(bomList); } public List getEnabledBomListByParentCodeAndCustomCode(String parentCode, String customCode) { return mapper.getEnabledBomListByParentCodeAndCustomCode(parentCode,customCode); } public void updateMaterialField2Bom() { List bomList = mapper.selectListWithMaterialField(); mapper.updateMaterialField2BomBatch(bomList); } }