package com.dy.pmsPlatform.product; 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 jakarta.servlet.http.HttpServletResponse; import lombok.extern.slf4j.Slf4j; 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.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) { 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) { 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{ paramDao.insert(param); } }); saveRel(p, p.processDocuments, "01"); saveRel(p, p.userManual, "02"); saveRel(p, p.materials, "03"); } private void saveRel(PltProduct p, List docs, String fileType) { docs.forEach(doc -> { doc.proId = p.id; doc.fileType = fileType; pfDao.insert(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); } Stream.concat( pro.userManual.stream(), Stream.concat(pro.processDocuments.stream(), pro.materials.stream()) ) .forEach(doc -> { String webUrl = getFilePathWithWebUrl(doc.fileId); doc.webUrl = webUrl; }); } 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) ; 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 void downloadDoc(HttpServletResponse response) { PltProduct pro=dao.selectByPrimaryKey(Long.valueOf(1)); } }