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.daoPr.PrProductionProcessMapper;
|
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.pojoPr.PrProductionProcess;
|
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 PrProductionProcessMapper processDao;
|
@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 setProcessDao(PrProductionProcessMapper processDao) {
|
this.processDao = processDao;
|
}
|
|
@Transactional
|
public int save(PrAssemblyPlan plan){
|
//计划名称不能重复
|
if(assemblyDao.exists(plan.name,plan.id)){
|
throw new RuntimeException("计划名称不能重复");
|
}
|
PrProductionProcess process = processDao.selectByPrimaryKey(plan.processId);
|
if(process == null || process.proId != plan.proId){
|
throw new RuntimeException("产品与生产流程不匹配");
|
}
|
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){
|
//计划名称不能重复
|
if(assemblyDao.exists(plan.name,plan.id)){
|
throw new RuntimeException("计划名称不能重复");
|
}
|
PrAssemblyPlan origPlan = assemblyDao.selectByPrimaryKey(plan.id);
|
PrBatchNumber batch = batchDao.selectByPrimaryKey(origPlan.batchId);
|
//产品改变则更新全部已生成设备号
|
if(origPlan.proId != plan.proId){
|
batch.proId = plan.proId;
|
batchDao.updateByPrimaryKeySelective(batch);
|
|
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<PrEquip> 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<PrEquip> list) {
|
int count = 0;
|
for (int i = 0; i < list.size(); i += BATCH_SIZE) {
|
List<PrEquip> 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<PrEquip> 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<List<PrAssemblyPlan>> selectSome(QueryVo queryVo){
|
Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(queryVo);
|
//查询符合条件的记录总数
|
Long itemTotal = assemblyDao.selectSomeCount(params);
|
QueryResultVo<List<PrAssemblyPlan>> rsVo = new QueryResultVo<>(queryVo.pageSize, queryVo.pageCurr) ;
|
//计算分页等信息
|
rsVo.calculateAndSet(itemTotal, params);
|
//查询符合条件的记录
|
rsVo.obj = assemblyDao.selectSome(params);
|
return rsVo ;
|
}
|
|
public QueryResultVo<List<PrEquip>> selectSomeEquip(QueryVo queryVo) {
|
Map<String, Object> params = (Map<String, Object>) PojoUtils.generalize(queryVo);
|
//查询符合条件的记录总数
|
Long itemTotal = equipDao.selectSomeCount(params);
|
QueryResultVo<List<PrEquip>> 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<PrEquip> 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);
|
}
|
}
|