package com.dy.pmsPlatform.product; import cn.hutool.core.codec.Base64; import com.alibaba.excel.util.StringUtils; import com.dy.common.webUtil.QueryResultVo; import com.dy.pmsGlobal.daoOth.OthFileMapper; import com.dy.pmsGlobal.daoPlt.PltProParamsMapper; import com.dy.pmsGlobal.daoPlt.PltProductFileMapper; import com.dy.pmsGlobal.daoPlt.PltProductMapper; import com.dy.pmsGlobal.daoPlt.PltProductQualityInspectionItemsMapper; import com.dy.pmsGlobal.dyFile.FileOperate; import com.dy.pmsGlobal.dyFile.FileRestVo; import com.dy.pmsGlobal.pojoOth.OthFile; import com.dy.pmsGlobal.pojoPlt.PltProduct; import com.dy.pmsGlobal.pojoPlt.PltProductFile; import com.dy.pmsGlobal.util.QrCodeUtil; import com.google.zxing.WriterException; import jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; import org.apache.commons.collections4.CollectionUtils; import org.apache.dubbo.common.utils.PojoUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.dao.DuplicateKeyException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.IOException; import java.util.List; import java.util.Map; import java.util.stream.Stream; @Slf4j @Service public class ProductSv { private PltProductMapper dao; private PltProductFileMapper pfDao; private FileOperate fileOperate; private OthFileMapper othFileMapper; private PltProductQualityInspectionItemsMapper itemDao; private PltProParamsMapper paramDao; @Value("${dy.webFile.fmUrl}") private String fmUrl ; private static final String DEFAULT_CODE = "001"; private static final String CODE_FORMAT = "%03d"; @Autowired public void setFileOperate(FileOperate fileOperate){ this.fileOperate = fileOperate; } @Autowired public void setOthFileMapper(OthFileMapper othFileMapper){ this.othFileMapper = othFileMapper; } @Autowired public void setDao(PltProductMapper dao) { this.dao = dao; } @Autowired public void setPfDao(PltProductFileMapper pfDao) { this.pfDao = pfDao; } @Autowired public void setItemDao(PltProductQualityInspectionItemsMapper itemDao) { this.itemDao = itemDao; } @Autowired public void setParamDao(PltProParamsMapper paramDao) { this.paramDao = paramDao; } @Transactional public int save(PltProduct p) { //判断产品 名称和型号 不能重名 if (dao.exists(p.name.trim(), p.type.trim() ,p.id)) { throw new RuntimeException("已经存在相同的产品名称&型号"); } int flag=0; do { p.code = getNextCode(); try { int count = dao.insertSelective(p); if (count > 0) { saveProRel(p); return count; } } catch (DuplicateKeyException e) { // 如果出现唯一约束违反异常,尝试获取新的code并重试 log.warn("插入产品时遇到唯一约束异常,尝试获取新的code", e); } flag++; } while (flag<5); return 0; } private String getNextCode(){ log.info("获取产品编号"); String maxCode = dao.selectMaxCode(); if (StringUtils.isBlank(maxCode)) { return DEFAULT_CODE; } else { int nextCode = Integer.parseInt(maxCode) + 1; // 检查溢出 if (nextCode > 999) { throw new RuntimeException("产品编号溢出"); } return String.format(CODE_FORMAT, nextCode); } } @Transactional public int update(PltProduct p) { if (dao.exists(p.name.trim(), p.type.trim(),p.id)) { throw new RuntimeException("已经存在相同的产品名称&型号"); } int count = dao.updateByPrimaryKeySelective(p); //删除旧数据,重新插入 pfDao.deleteByProId(p.id); saveProRel(p); return count; } private void saveProRel(PltProduct p) { p.params.forEach(param->{ param.proId=p.id; if(param.id !=null){ paramDao.updateByPrimaryKeySelective(param); }else{ param.deleted=false; paramDao.insert(param); } }); saveRel(p, p.proFiles); } private void saveRel(PltProduct p, List docs) { docs.forEach(doc -> { doc.proId = p.id; pfDao.insertSelective(doc); }); } /** * 逻辑删除实体 * @param id 实体ID * @return 影响记录数量 */ @Transactional public int delete(Long id) { return dao.deleteLogicById(id); } public PltProduct selectById(String proId) { PltProduct pro=dao.selectByPrimaryKey(Long.valueOf(proId)); pro=addWebUrl(pro); return pro; } private PltProduct addWebUrl(PltProduct pro) { if (pro != null) { if (pro.image != null) { String filePathWithWebUrl = getFilePathWithWebUrl(pro.image); pro.imageWebPath = filePathWithWebUrl; pro.imageWebPathZip = fileOperate.getImgFileZipPath(filePathWithWebUrl); } pro.proFiles.stream().forEach(doc -> { OthFile file = othFileMapper.selectByPrimaryKey(doc.fileId); if (file == null) { return; } FileRestVo fileRestVo = fileOperate.parseHashcode(fmUrl, file.hash); doc.webUrl = fileRestVo.fileWebDownloadPath + doc.fileId; doc.orgName = file.orgName; doc.extName = file.extName; }); } return pro; } private String getFilePathWithWebUrl(Long fileId) { OthFile file = othFileMapper.selectByPrimaryKey(fileId); FileRestVo fileRestVo = fileOperate.parseHashcode(fmUrl, file.hash); return fileRestVo.fileWebUrl + file.filePath; } /** * 获取产品列表 */ public QueryResultVo> selectSome(QueryVo queryVo) { Map params = (Map) PojoUtils.generalize(queryVo); //查询符合条件的记录总数 Long itemTotal = dao.selectSomeCount(params); QueryResultVo> rsVo = new QueryResultVo<>(queryVo.pageSize, queryVo.pageCurr) ; //计算分页等信息 rsVo.calculateAndSet(itemTotal, params); //查询符合条件的记录 rsVo.obj = dao.selectSome(params) ; if(CollectionUtils.isNotEmpty(rsVo.obj)){ rsVo.obj.parallelStream().forEach(item->{ try { byte[] codes = QrCodeUtil.genQrCode(item.code); item.qrCode = "data:image/jpeg;base64," + Base64.encode(codes); item = addWebUrl(item); } catch (IOException e) { log.error("IOException:",e); } catch (WriterException e) { log.error("WriterException:",e); } }); } return rsVo ; } // /** // * 添加产品文档关联 // * @param proId 产品id // * @param fileId 文档id // * @return 更新数量 // */ // public int addDoc(long proId,long fileId,String fileType){ // PltProductFile pf=new PltProductFile(); // pf.fileId = fileId; // pf.proId = proId; // pf.fileType = fileType; // return pfDao.insertSelective(pf); // } // /** // * 查询产品关联文档 // * @param proId 产品id // * @return 返回关联文档集合 // */ // public List selectDoc(long proId){ // return othFileMapper.selectByProId(proId); // } public List selectAll(QueryVo queryVo) { Map params = (Map) PojoUtils.generalize(queryVo); return dao.selectAll(params); } public List getProduct(Long orderId) { return dao.selectByOrderId(orderId); } // public void downloadDoc(HttpServletResponse response) { // PltProduct pro=dao.selectByPrimaryKey(Long.valueOf(1)); // } }