XiaoRuby
2023-09-01 8e39c9bbf8a8bb4707f2a766295b40497ae96706
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
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
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.*;
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;
 
import javax.annotation.Resource;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
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 TechnologyService technologyService;
 
    @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());
    }
 
    @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());
        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;
    }
}