package com.yuanchu.mom.service.impl; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.yuanchu.mom.mapper.ManualTechnologyMapper; import com.yuanchu.mom.mapper.ManufactureOrderMapper; import com.yuanchu.mom.pojo.*; import com.yuanchu.mom.pojo.dto.ManualTechnologyDto; import com.yuanchu.mom.pojo.dto.ManualTechnologyDto1; import com.yuanchu.mom.service.ManualTechnologyService; import com.yuanchu.mom.service.ManufactureOrderProcessService; import com.yuanchu.mom.service.ManufactureSchedulingService; import com.yuanchu.mom.utils.MyUtil; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; /** * 编制工序表(ManualTechnology)表服务实现类 * * @author zss * @since 2023-08-17 14:16:46 */ @Service public class ManualTechnologyServiceImpl extends ServiceImpl implements ManualTechnologyService { @Resource ManualTechnologyMapper manualTechnologyMapper; @Resource ManufactureOrderMapper manufactureOrderMapper; @Autowired private ManufactureSchedulingService manufactureSchedulingService; @Autowired private ManufactureOrderProcessService manufactureOrderProcessService; //排产-->查看 @Override public List> seleDatil(Integer manOrdId) { return manualTechnologyMapper.seleDatil(manOrdId); } //排产-->更新 @Override @Transactional(rollbackFor = Exception.class) public void output(ManualTechnologyDto manualTechnologyDto) throws ParseException { // 根据排产数量计算工艺周期 List manufactureOrderProcessesPeriod = matchingCycle( manualTechnologyDto.getSchedulingNumber(), manualTechnologyDto.getManOrdId(), manualTechnologyDto.getOrderProcess()); // 根据工序生产定额匹配时间 List manufactureOrderProcessesDate = datePeriodCalculate( manualTechnologyDto.getDate(), manufactureOrderProcessesPeriod); // 添加一条排产记录到manufacture_scheduling表格,返回主键Id Date endTime = manufactureOrderProcessesDate.get(manufactureOrderProcessesDate.size() - 1).getEndTime(); ManufactureScheduling manufactureScheduling = new ManufactureScheduling() .setScheduled(manualTechnologyDto.getSchedulingNumber()) .setStartTime(DateUtil.parse(manualTechnologyDto.getDate())) .setEndTime(endTime) .setManufactureOrderId(manualTechnologyDto.getManOrdId()) .setGoState(0); // 0 表示待下达 manufactureSchedulingService.save(manufactureScheduling); // 将排表Id插入到manufactureOrderProcessesDate中, 开始批量插入manufactureOrderProcesses表格 manufactureOrderProcessesDate.forEach(i -> i.setManufactureSchedulingId(manufactureScheduling.getId())); manufactureOrderProcessService.batchInsert(manufactureOrderProcessesDate); // 更新订单的已排产数量 manufactureOrderMapper.updateManufacture(manualTechnologyDto.getManOrdId(), manualTechnologyDto.getSchedulingNumber()); } // 根据排产数量计算工艺周期 private List matchingCycle(Integer schedulingNumber, Integer manOrdId, List manualTechnologyDtoList){ // 查询编制工艺,用于匹配每个订单的工序周期 LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery() .eq(ManualTechnology::getManufactureOrderId, manOrdId); List technologies = manualTechnologyMapper.selectList(queryWrapper); //匹配每个订单的工序周期 List manufactureOrderProcessList = manualTechnologyDtoList.stream().map(manualTechnologyDto1 -> { ManufactureOrderProcess manufactureOrderProcess = new ManufactureOrderProcess(); BeanUtils.copyProperties(manualTechnologyDto1, manufactureOrderProcess); technologies.forEach(i -> { if (Objects.equals(manufactureOrderProcess.getManualTechnologyId(), i.getId())){ manufactureOrderProcess.setPeriod((int) Math.ceil((double)schedulingNumber/i.getProductionQuota())); } }); return manufactureOrderProcess; }).collect(Collectors.toList()); return manufactureOrderProcessList; } // 根据工序生产定额匹配时间 private List datePeriodCalculate(String date, List manualTechnologies) throws ParseException { // 计算工序的开始日期以及结束日期 DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); Date parse = dateFormat.parse(date); //将起始日期赋值给Calendar对象 Calendar calendar = Calendar.getInstance(); calendar.setTime(parse); //第一个工序 ManufactureOrderProcess manualTechnology = manualTechnologies.get(0); calendar.add(Calendar.DATE, manualTechnology.getPeriod()); manualTechnology.setStartTime(parse).setEndTime(calendar.getTime()); //循环赋值时间 for (int i = 0; i < manualTechnologies.size()-1 ; i++) { Calendar calendar1 = Calendar.getInstance(); calendar1.setTime(manualTechnologies.get(i).getEndTime()); ManufactureOrderProcess technology = manualTechnologies.get(i + 1); calendar1.add(Calendar.DATE,1); technology.setStartTime(calendar1.getTime()); calendar1.add(Calendar.DATE,technology.getPeriod()); technology.setEndTime(calendar1.getTime()); } return manualTechnologies; } }