package com.dy.pmsProduct.taskPlan; import cn.hutool.core.date.DateUtil; import com.alibaba.excel.util.StringUtils; import com.dy.common.webFilter.UserTokenContext; import com.dy.common.webUtil.QueryResultVo; import com.dy.pmsGlobal.daoPlt.PltProductMapper; import com.dy.pmsGlobal.daoPr.PrAssemblyPlanMapper; import com.dy.pmsGlobal.daoPr.PrBatchNumberMapper; import com.dy.pmsGlobal.daoPr.PrEquipMapper; import com.dy.pmsGlobal.pojoBa.BaUser; import com.dy.pmsGlobal.pojoPlt.PltProduct; import com.dy.pmsGlobal.pojoPr.PrAssemblyPlan; import com.dy.pmsGlobal.pojoPr.PrBatchNumber; import com.dy.pmsGlobal.pojoPr.PrEquip; import com.dy.pmsGlobal.util.QrCodeUtil; import com.dy.pmsGlobal.util.UserUtil; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.common.utils.PojoUtils; import org.apache.ibatis.session.SqlSessionFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.Date; import java.util.List; import java.util.Map; @Slf4j @Service public class AssemblySv { private static final int BATCH_SIZE = 100; // 批量处理大小 private static final String CODE_FORMAT = "%03d"; private static final String CODE_FORMAT_7 = "%07d"; private static final String TYPE_CODE_EQUIP = "110"; private PrAssemblyPlanMapper assemblyDao; private UserUtil userUtil; private PrBatchNumberMapper batchDao; private PrEquipMapper equipDao; private PltProductMapper productDao; private SqlSessionFactory sqlSessionFactory; @Autowired public void setAssemblyDao(PrAssemblyPlanMapper assemblyDao) { this.assemblyDao = assemblyDao; } @Autowired public void setBatchDao(PrBatchNumberMapper batchDao) { this.batchDao = batchDao; } @Autowired public void setUserUtil(UserUtil userUtil){ this.userUtil = userUtil; } @Autowired public void setEquipDao(PrEquipMapper equipDao) { this.equipDao = equipDao; } @Autowired public void setProductDao(PltProductMapper productDao) { this.productDao = productDao; } @Autowired public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) { this.sqlSessionFactory = sqlSessionFactory; } @Transactional public int save(PrAssemblyPlan plan){ PrBatchNumber batch = new PrBatchNumber(); batch.batchNumber = getNextCode(); batch.proId = plan.proId; batch.remark = plan.content; BaUser loginUser = userUtil.getUser(UserTokenContext.get()); if(loginUser!=null){ batch.creator = loginUser.id; plan.creator = loginUser.id; } batchDao.insertSelective(batch); insertEquip(plan.proId,batch.id,batch.batchNumber,plan.number,1); plan.batchId = batch.id; plan.status =PlanStatusEnum.NORMAL.getCode(); plan.deleted = false; return assemblyDao.insertSelective(plan); } @Transactional public int update(PrAssemblyPlan plan){ PrAssemblyPlan origPlan = assemblyDao.selectByPrimaryKey(plan.id); PrBatchNumber batch = batchDao.selectByPrimaryKey(origPlan.batchId); //产品改变则更新全部已生成设备号 if(origPlan.proId != plan.proId){ equipDao.deleteByBatchId(origPlan.batchId); insertEquip(plan.proId,origPlan.batchId,batch.batchNumber,plan.number,1); }else if(origPlan.number < plan.number){ //数量增加则新增设备号 insertEquip(plan.proId,origPlan.batchId,batch.batchNumber,plan.number,origPlan.number+1); } return assemblyDao.updateByPrimaryKeySelective(plan); } @Transactional public int addEquip(Long planId,int num){ PrAssemblyPlan plan = assemblyDao.selectByPrimaryKey(planId); PrBatchNumber batch = batchDao.selectByPrimaryKey(plan.batchId); int count =insertEquip(plan.proId,plan.batchId,batch.batchNumber,num + plan.number,plan.number+1); plan.number = plan.number + num; assemblyDao.updateByPrimaryKeySelective(plan); return count; } /** * 批量插入 设备数据 * @param proId 产品id * @param batchId 批次id * @param batchCode 批次号 * @param number 数量 * @return 插入数量 */ private int insertEquip(Long proId,Long batchId,String batchCode,Integer number,int startIndex){ log.info("批量插入设备"); PltProduct product = productDao.selectByPrimaryKey(proId); List list = new java.util.ArrayList<>(); for(int i= startIndex ;i<= number;i++){ PrEquip equip = new PrEquip(); equip.proId = proId; equip.batchId = batchId; equip.equipNo = getEquipNo(product.code,batchCode,i); equip.status = 0; list.add(equip); } return insertBatchEquip(list); } private int insertBatchEquip(List list) { int count = 0; for (int i = 0; i < list.size(); i += BATCH_SIZE) { List subList = list.subList(i, Math.min(i + BATCH_SIZE, list.size())); // 调用MyBatis插入这批数据 count += equipDao.insertBatch(subList); } return count; } public String getNextCode(){ log.info("获取批次编号"); String currentDay = getCurrentDay(); String maxCode = batchDao.selectMaxCode(currentDay); if (StringUtils.isBlank(maxCode)) { return currentDay + String.format(CODE_FORMAT, 1); } else { int nextCode = Integer.parseInt(maxCode.replace(currentDay, "")) + 1; // 检查溢出 if (nextCode > 999) { throw new RuntimeException("批次编号溢出"); } return currentDay + String.format(CODE_FORMAT, nextCode); } } private static String getEquipNo(String proCode,String batchCode,int index){ String equipNo = TYPE_CODE_EQUIP + proCode + batchCode + String.format(CODE_FORMAT_7, index); return equipNo; } public static void main(String[] args) { List list = new java.util.ArrayList<>(); for(int i= 1 ;i<= 10000;i++){ PrEquip equip = new PrEquip(); equip.proId = 2024052310512000003l; equip.batchId = 2024053017154400004l; equip.equipNo = getEquipNo("002","2024001",i); equip.status = 0; list.add(equip); } list.forEach(equip->{ System.out.println(equip.equipNo); }); } /** * 获取当前日期 * @return yyMMdd */ private String getCurrentDay(){ return DateUtil.format(new Date(), "yyMMdd"); } public PrAssemblyPlan selectById(Long id){ return assemblyDao.selectByPrimaryKey(id); } public QueryResultVo> selectSome(QueryVo queryVo){ Map params = (Map) PojoUtils.generalize(queryVo); //查询符合条件的记录总数 Long itemTotal = assemblyDao.selectSomeCount(params); QueryResultVo> rsVo = new QueryResultVo<>(queryVo.pageSize, queryVo.pageCurr) ; //计算分页等信息 rsVo.calculateAndSet(itemTotal, params); //查询符合条件的记录 rsVo.obj = assemblyDao.selectSome(params); return rsVo ; } public QueryResultVo> selectSomeEquip(QueryVo queryVo) { Map params = (Map) PojoUtils.generalize(queryVo); //查询符合条件的记录总数 Long itemTotal = assemblyDao.selectSomeCount(params); QueryResultVo> rsVo = new QueryResultVo<>(queryVo.pageSize, queryVo.pageCurr) ; //计算分页等信息 rsVo.calculateAndSet(itemTotal, params); //查询符合条件的记录 rsVo.obj = equipDao.selectSome(params); rsVo.obj.forEach(equip->{ equip.qrCode = QrCodeUtil.genQrCodeString(equip.equipNo); }); return rsVo ; } public List selectEquipByBatchId(Long batchId) { return equipDao.selectByBatchId(batchId); } /** * 只更新状态,不更新其他字段 * @param plan * @return */ @Transactional public int updateStatus(PrAssemblyPlan plan) { PrAssemblyPlan param = new PrAssemblyPlan(); param.id =plan.id; param.status = plan.status; return assemblyDao.updateByPrimaryKeySelective(plan); } }