XiaoRuby
2023-09-01 8e39c9bbf8a8bb4707f2a766295b40497ae96706
production-server/src/main/java/com/yuanchu/mom/service/impl/ManualTechnologyServiceImpl.java
@@ -1,15 +1,25 @@
package com.yuanchu.mom.service.impl;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yuanchu.mom.mapper.DeviceMapper;
import com.yuanchu.mom.mapper.ManualTechnologyMapper;
import com.yuanchu.mom.mapper.ManufactureOrderMapper;
import com.yuanchu.mom.pojo.ManualTechnology;
import com.yuanchu.mom.pojo.ManufactureOrder;
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.service.TechnologyService;
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;
@@ -17,10 +27,8 @@
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.time.LocalDate;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -38,6 +46,14 @@
    @Resource
    ManufactureOrderMapper manufactureOrderMapper;
    @Autowired
    private TechnologyService technologyService;
    @Autowired
    private ManufactureSchedulingService manufactureSchedulingService;
    @Autowired
    private ManufactureOrderProcessService manufactureOrderProcessService;
    //排产-->查看
    @Override
@@ -48,56 +64,99 @@
    //排产-->更新
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void output(String date, List<ManualTechnologyDto> manualTechnologyDtoList) throws ParseException {
        //更新每个工序的设备
        List<ManualTechnology> manualTechnologies = manualTechnologyDtoList.stream().map(manualTechnologyDto -> {
            ManualTechnology manualTechnology = new ManualTechnology();
            BeanUtils.copyProperties(manualTechnologyDto, manualTechnology);
            return manualTechnology;
    public void output(ManualTechnologyDto manualTechnologyDto) throws ParseException {
        // 根据排产数量计算工艺周期
        List<ManufactureOrderProcess> manufactureOrderProcessesPeriod = matchingCycle(
                manualTechnologyDto.getSchedulingNumber(),
                manualTechnologyDto.getManOrdId(),
                manualTechnologyDto.getOrderProcess());
        // 根据工序生产定额匹配时间
        List<ManufactureOrderProcess> 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());
    }
    @Override
    public Integer updateTime(Integer technologyId, String startTime) {
//        // Hutool 工具类计算间隔小时
//        DateTime startTime1 = DateUtil.parse(startTime);
//        DateTime endTime1 = DateUtil.parse(endTime);
//        long between = DateUtil.between(startTime1, endTime1, DateUnit.HOUR);
//        // 更新
//        LambdaUpdateWrapper<ManualTechnology> updateWrapper = Wrappers.<ManualTechnology>lambdaUpdate()
//                .eq(ManualTechnology::getId, technologyId);
//        return manualTechnologyMapper.update(new ManualTechnology(), updateWrapper);
        return null;
    }
    // 根据排产数量计算工艺周期
    private List<ManufactureOrderProcess> matchingCycle(Integer schedulingNumber, Integer manOrdId, List<ManualTechnologyDto1> manualTechnologyDtoList){
        // 查询编制工艺,用于匹配每个订单的工序周期
        LambdaQueryWrapper<ManualTechnology> queryWrapper = Wrappers.<ManualTechnology>lambdaQuery()
                .eq(ManualTechnology::getManufactureOrderId, manOrdId);
        List<ManualTechnology> technologies = manualTechnologyMapper.selectList(queryWrapper);
        //匹配每个订单的工序周期
        List<ManufactureOrderProcess> 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());
        //批量更新设备id
        manualTechnologyMapper.updateBatchManualTechnology(manualTechnologies);
        Integer manufactureOrderId = manualTechnologyMapper.selectById(manualTechnologyDtoList.get(1).getId()).getManufactureOrderId();
        List<ManualTechnology> manualTechnologyList = manualTechnologyMapper.selectList(Wrappers.<ManualTechnology>query().eq("manufacture_order_id", manufactureOrderId));
        /*赋值(最开始第一个工序的开始日期)*/
        return manufactureOrderProcessList;
    }
    // 根据工序生产定额匹配时间
    private List<ManufactureOrderProcess> datePeriodCalculate(String date, List<ManufactureOrderProcess> manualTechnologies) throws ParseException {
        // 计算工序的开始日期以及结束日期
        DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        Date parse = dateFormat.parse(date);
        //将起始日期赋值给Calendar对象
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(parse);
        //第一个工序
        ManualTechnology manualTechnology = manualTechnologyList.get(0);
        ManufactureOrderProcess manualTechnology = manualTechnologies.get(0);
        calendar.add(Calendar.DATE, manualTechnology.getPeriod());
        manualTechnology.setStartTime(parse).setEndTime(calendar.getTime());
        //循环赋值时间
        for (int i = 0; i < manualTechnologyList.size()-1 ; i++) {
        for (int i = 0; i < manualTechnologies.size()-1 ; i++) {
            Calendar calendar1 = Calendar.getInstance();
            calendar1.setTime(manualTechnologyList.get(i).getEndTime());
            ManualTechnology technology = manualTechnologyList.get(i + 1);
            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());
        }
        //批量更新
        manualTechnologyMapper.updateBatchManualTechnology(manualTechnologyList);
        //如果该产品下的所有工序都安排了,则将状态改为已排产还有待下达
        if (checkFieldExistence(manualTechnologies)) {
            ManufactureOrder manufactureOrder = new ManufactureOrder();
            manufactureOrder.setId(manufactureOrderId).setType(1).setGoState(0);
            manufactureOrderMapper.updateById(manufactureOrder);
        }
    }
    /*判断是否所有工序全部都安排了设备*/
    public static boolean checkFieldExistence(List<ManualTechnology> dataList) {
        for (ManualTechnology data : dataList) {
            if (data.getDeviceId() == null) {
                return false;
            }
        }
        return true;
        return manualTechnologies;
    }
}