zss
2023-09-21 2dbc49184bd74845c8da694c20d6fd03d7ac87e0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
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<ManualTechnologyMapper, ManualTechnology> implements ManualTechnologyService {
 
    @Resource
    ManualTechnologyMapper manualTechnologyMapper;
 
    @Resource
    ManufactureOrderMapper manufactureOrderMapper;
 
    @Autowired
    private ManufactureSchedulingService manufactureSchedulingService;
 
    @Autowired
    private ManufactureOrderProcessService manufactureOrderProcessService;
 
    //排产-->查看
    @Override
    public List<Map<String, Object>> seleDatil(Integer manOrdId) {
        return manualTechnologyMapper.seleDatil(manOrdId);
    }
 
    //排产-->更新
    @Override
    @Transactional(rollbackFor = Exception.class)
    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());
    }
 
    // 根据排产数量计算工艺周期
    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());
        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);
        //第一个工序
        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;
    }
}