李林
2023-10-07 658d4927d468c47208fd012d9128b09249c07eff
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
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
package com.chinaztt.mes.production.service.impl;
 
import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.csp.sentinel.util.StringUtil;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.chinaztt.ifs.api.feign.IfsFeignClient;
import com.chinaztt.mes.basic.entity.Location;
import com.chinaztt.mes.basic.entity.Part;
import com.chinaztt.mes.basic.entity.PartFamily;
import com.chinaztt.mes.basic.mapper.LocationMapper;
import com.chinaztt.mes.basic.mapper.PartFamilyMapper;
import com.chinaztt.mes.basic.mapper.PartMapper;
import com.chinaztt.mes.production.dto.ExaminerDTO;
import com.chinaztt.mes.production.dto.FeederCertificateSelectDTO;
import com.chinaztt.mes.production.dto.IfsFeederCertificateDTO;
import com.chinaztt.mes.production.entity.Examiner;
import com.chinaztt.mes.production.entity.FeederCertificate;
import com.chinaztt.mes.production.entity.ProductOutput;
import com.chinaztt.mes.production.mapper.ExaminerMapper;
import com.chinaztt.mes.production.mapper.FeederCertificateMapper;
import com.chinaztt.mes.production.mapper.ProductOutputMapper;
import com.chinaztt.mes.production.service.FeederCertificateService;
import com.chinaztt.mes.quality.entity.BasicCustomerPartRelationMap;
import com.chinaztt.mes.quality.mapper.BasicCustomerPartRelationMapMapper;
import com.chinaztt.mes.warehouse.dto.*;
import com.chinaztt.mes.warehouse.entity.Stock;
import com.chinaztt.mes.warehouse.mapper.StockMapper;
import com.chinaztt.mes.warehouse.service.StockService;
import com.chinaztt.ztt.admin.api.feign.RemoteParamService;
import com.chinaztt.ztt.common.core.constant.SecurityConstants;
import com.chinaztt.ztt.common.core.util.R;
import com.google.gson.Gson;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
 
 
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
 
 
/**
 * 馈线合格证
 *
 * @author yy
 * @date 2022-11-17 09:11:25
 */
@Service
@AllArgsConstructor
@Transactional(rollbackFor = Exception.class)
public class FeederCertificateServiceImpl extends ServiceImpl<FeederCertificateMapper, FeederCertificate> implements FeederCertificateService {
 
 
    private StockService stockService;
    private StockMapper stockMapper;
    private PartMapper partMapper;
    private IfsFeignClient ifsFeignClient;
    private LocationMapper locationMapper;
    private ExaminerMapper examinerMapper;
    private ProductOutputMapper productOutputMapper;
    private BasicCustomerPartRelationMapMapper basicCustomerPartRelationMapMapper;
    private RemoteParamService remoteParamService;
    private PartFamilyMapper partFamilyMapper;
 
 
    @Override
    public FeederCertificateDTO getFeederCertificateBySn(String sn,String commonSn) {
        FeederCertificate feederCertificate = baseMapper.selectOne(Wrappers.<FeederCertificate>lambdaQuery()
                .eq(FeederCertificate::getSn, sn));
        if(feederCertificate!=null){
            throw new RuntimeException("已有该sn号,不能重复提交");
        }
        //实时库存中的库存数量大于零且在合格库位
        List<Location> locationList = locationMapper.selectList(Wrappers.<Location>lambdaQuery().eq(Location::getLocType, "2"));
        List<Long> locationIdList = locationList.stream().map(Location::getId).collect(Collectors.toList());
        FeederCertificateDTO feederCertificateBySn = stockMapper.getFeederCertificate(sn,locationIdList);
        if(feederCertificateBySn==null){
            throw new RuntimeException("该sn号在实时库存没有合格库记录");
        }
        Part origPart = null;
        Part partAfter = null;
        List<ProductOutput> productOutputList = productOutputMapper.selectList(Wrappers.<ProductOutput>lambdaQuery()
                .eq(ProductOutput::getOutBatchNo, feederCertificateBySn.getSn()));
        if(CollectionUtil.isNotEmpty(productOutputList) && productOutputList.get(0).getOrigPartId()!=null){
            origPart = partMapper.selectById(productOutputList.get(0).getOrigPartId());
            partAfter = partMapper.selectById(productOutputList.get(0).getPartId());
        }else {
            origPart = partMapper.selectList(Wrappers.<Part>lambdaQuery().eq(Part::getPartNo, feederCertificateBySn.getPartNo())).get(0);
            partAfter = origPart;
        }
 
        //同类SN校验
        if(StringUtils.isNotBlank(commonSn)){
            FeederCertificate commonFeederCertificate = baseMapper.selectOne(Wrappers.<FeederCertificate>lambdaQuery()
                    .eq(FeederCertificate::getSn, commonSn));
            if(commonFeederCertificate!=null){
                throw new RuntimeException("已有该同类sn号,不能重复提交");
            }
            FeederCertificateDTO commonFeederCertificateBySn = stockMapper.getFeederCertificate(commonSn,locationIdList);
            if(commonFeederCertificateBySn==null){
                throw new RuntimeException("该同类sn号在实时库存没有合格库记录");
            }
            if(feederCertificateBySn.getStockQuantity().compareTo(commonFeederCertificateBySn.getStockQuantity())!=0){
                throw new RuntimeException("同类sn号和初始sn号生产长度不同");
            }
            if(!feederCertificateBySn.getLocationId().equals(commonFeederCertificateBySn.getLocationId())){
                throw new RuntimeException("同类sn号和初始sn号所在库位不一样");
            }
            List<ProductOutput> commonProductOutputList = productOutputMapper.selectList(Wrappers.<ProductOutput>lambdaQuery()
                    .eq(ProductOutput::getOutBatchNo, commonFeederCertificateBySn.getSn()));
            Long commonOrigPartId = null;
            if(CollectionUtil.isNotEmpty(commonProductOutputList) && commonProductOutputList.get(0).getOrigPartId()!=null){
                commonOrigPartId = partMapper.selectById(commonProductOutputList.get(0).getOrigPartId()).getId();
            }else{
                commonOrigPartId = partMapper.selectList(Wrappers.<Part>lambdaQuery().eq(Part::getPartNo,commonFeederCertificateBySn.getPartNo())).get(0).getId();
            }
            if(!origPart.getId().equals(commonOrigPartId)){
                throw new RuntimeException("同类sn号和初始sn号生产零件号不同");
            }
            return commonFeederCertificateBySn;
        }
 
        //根据入库零件号找零件族编号
        if(partAfter.getPartFamilyId()!=null){
            PartFamily partFamily = partFamilyMapper.selectById(partAfter.getPartFamilyId());
            if(partFamily!=null){
                feederCertificateBySn.setPartFamilyNo(partFamily.getPartFamilyNo());
            }
        }
        feederCertificateBySn.setPartNo(origPart.getPartNo());
        feederCertificateBySn.setPartNoAfter(partAfter.getPartNo());
        feederCertificateBySn.setExaminer(origPart.getExaminer());
        feederCertificateBySn.setSpecs(partAfter.getSpecs());
        feederCertificateBySn.setPartModel(partAfter.getPartModel());
        feederCertificateBySn.setProdName(partAfter.getProdName());
 
        BasicCustomerPartRelationMap basicCustomerPartRelationMap = basicCustomerPartRelationMapMapper.selectOne(Wrappers.<BasicCustomerPartRelationMap>lambdaQuery()
                .eq(BasicCustomerPartRelationMap::getPartNo, feederCertificateBySn.getPartNo()));
        if(basicCustomerPartRelationMap!=null) {
            feederCertificateBySn.setCusMaterialCode(basicCustomerPartRelationMap.getCusMaterialCode());
        }
        Calendar calendar = Calendar.getInstance();
        String year = calendar.get(Calendar.YEAR) + "";
        String month = (calendar.get(Calendar.MONTH) + 1) + "";
        String date = year + "." + month;
        feederCertificateBySn.setDate(date);
        return feederCertificateBySn;
    }
 
    @Override
    public List<String> changeExaminer(String partNo) {
        List<Examiner> examinerList = examinerMapper.selectList(Wrappers.<Examiner>lambdaQuery()
                .eq(Examiner::getPartNo, partNo));
/*        if(CollectionUtil.isEmpty(examinerList)){
            throw new RuntimeException("零件降级配置尚未配置");
        }*/
        List<String> examinerAfterList = examinerList.stream().map(Examiner::getExaminerAfter).collect(Collectors.toList());
        return examinerAfterList;
    }
 
 
    @Override
    public List<Long> saveSnBatch(List<FeederCertificate> feederCertificateList) {
        List<String> snList = feederCertificateList.stream().map(FeederCertificate::getSn).collect(Collectors.toList());
        List<FeederCertificate> feederCertificateListBySnList = baseMapper.selectList(Wrappers.<FeederCertificate>lambdaQuery()
                .in(FeederCertificate::getSn, snList));
        if(CollectionUtil.isNotEmpty(feederCertificateListBySnList)){
            throw new RuntimeException("已有该sn号,不能重复提交");
        }
        //实时库存中的库存数量大于零且在合格库位
        List<Location> locationList = locationMapper.selectList(Wrappers.<Location>lambdaQuery().eq(Location::getLocType, "2"));
        List<Long> locationIdList = locationList.stream().map(Location::getId).collect(Collectors.toList());
        List<Stock> stockList = stockMapper.selectList(Wrappers.<Stock>lambdaQuery()
                .in(Stock::getPartBatchNo,snList)
                .in(Stock::getLocationId,locationIdList)
                .gt(Stock::getAvailableStockQuantity,BigDecimal.ZERO));
        if(CollectionUtil.isEmpty(stockList)){
            throw new RuntimeException("库存表合格库位没有该sn号");
        }
 
        saveBatch(feederCertificateList);
        Part partAfter = partMapper.selectOne(Wrappers.<Part>lambdaQuery()
                .eq(Part::getPartNo, feederCertificateList.get(0).getPartNoAfter()));
        stockList.stream().forEach(
                a-> a.setPartId(partAfter.getId())
        );
        stockService.updateBatchById(stockList);
 
 
        //库存发放
        List<FeederCertificate> provideFeederCertificateList = new ArrayList<>();
        for (FeederCertificate feederCertificate:feederCertificateList) {
            if(feederCertificate.getStockQuantity().subtract(feederCertificate.getStockQuantityAfter()).compareTo(BigDecimal.ZERO)>0){
                provideFeederCertificateList.add(feederCertificate);
            }
        }
        if(CollectionUtil.isNotEmpty(provideFeederCertificateList)){
            List<String> provideSnList = provideFeederCertificateList.stream().map(FeederCertificate::getSn).collect(Collectors.toList());
            List<StockDTO> provideStockBySnList = stockMapper.getStockBySnList(provideSnList);
            for (StockDTO  stockDTO:provideStockBySnList) {
                for (FeederCertificate provideFeederCertificate:provideFeederCertificateList) {
                    if(stockDTO.getPartBatchNo().equals(provideFeederCertificate.getSn())){
                        stockDTO.setAvailableStockQuantityMove(provideFeederCertificate.getStockQuantity()
                                .subtract(provideFeederCertificate.getStockQuantityAfter()));
                        stockDTO.setSynIfs(true);
                    }
                }
            }
            stockService.deleteStock(provideStockBySnList);
        }
 
        //ifs更新wdr接口
        List<IfsFeederCertificateDTO> ifsFeederCertificateList = baseMapper.getIfsFeederCertificateList(snList);
        IfsImportChangeWdrStdDTO ifsImportChangeWdrStdDTO = new IfsImportChangeWdrStdDTO();
        ifsImportChangeWdrStdDTO.setRECORD_ID(UUID.randomUUID().toString().replace("-", ""));
        List<IfsImportChangeWdrStdDTO.DataBean> dataBeanList = new ArrayList<>();//批量标识
        for(IfsFeederCertificateDTO ifsFeederCertificate:ifsFeederCertificateList){
            FeederCertificate feederCertificate = baseMapper.selectOne(Wrappers.<FeederCertificate>lambdaQuery()
                    .eq(FeederCertificate::getSn, ifsFeederCertificate.getPartBatchNo()));
            String wdr = null;
            if(feederCertificate.getExaminerAfter()==null){
                wdr = feederCertificate.getExaminer();
            }else{
                wdr = feederCertificate.getExaminerAfter();
            }
            IfsImportChangeWdrStdDTO.DataBean batchInfo = new IfsImportChangeWdrStdDTO.DataBean();
            batchInfo.setPART_NO(ifsFeederCertificate.getPartNo());//零件号
            batchInfo.setLOT_BATCH_NO(ifsFeederCertificate.getIfsBatchNo());//ifs批次号
            batchInfo.setMOVE_QTY(ifsFeederCertificate.getStockQuantity());//移库数量
            //判断是否启用批次管理
            //WDR号
            if(ifsFeederCertificate.getLotTrackingIfs() != null && ifsFeederCertificate.getLotTrackingIfs()){
                batchInfo.setWAIV_DEV_REJ_NO(feederCertificate.getSn());
            }else{
                batchInfo.setWAIV_DEV_REJ_NO("*");
            }
            //版本号
            batchInfo.setENG_CHG_LEVEL(ifsFeederCertificate.getEngChgLevel());
            //库位号
            batchInfo.setLOCATION_NO(ifsFeederCertificate.getLocationNo());
            //至WDR号
            batchInfo.setTO_WAIV_DEV_REJ_NO(wdr);
            dataBeanList.add(batchInfo);
        }
        ifsImportChangeWdrStdDTO.setBATCH_INFO(dataBeanList);
        Gson gson = new Gson();
        String jsonstr = gson.toJson(ifsImportChangeWdrStdDTO);
        JSONObject jsonObject = JSONObject.parseObject(jsonstr);
        R res = ifsFeignClient.importChangeWdrStd(jsonObject, true);
        if(res.getCode() != 0){
            throw new RuntimeException("ifs更新wdr接口失败;erromsg:" + res.getMsg());
        }
 
        List<Long> idList = feederCertificateList.stream().map(FeederCertificate::getId).collect(Collectors.toList());
        return idList;
    }
 
 
    @Override
    public List<String> getExaminer(String partNo) {
        List<Examiner> examinerList = examinerMapper.selectList(Wrappers.<Examiner>lambdaQuery()
                .eq(Examiner::getPartNo, partNo));
        if(CollectionUtil.isNotEmpty(examinerList)){
            List<String> examinerAfterList = examinerList.stream().map(Examiner::getExaminerAfter).collect(Collectors.toList());
            return examinerAfterList;
        }else{
            return null;
        }
    }
    @Override
    public IPage<List<FeederCertificateSelectDTO>> getPage(Page page, QueryWrapper<FeederCertificateSelectDTO> gen) {
        return baseMapper.getPage(page, gen);
    }
 
 
    /**
     * 更新打印次数
     *
     * @param  ids
     * @param  copies
     * @return
     */
    @Override
    public Boolean updatePrintNum(List<Long> ids, Long copies) {
        List<FeederCertificate> feederCertificateList = baseMapper.selectBatchIds(ids);
        for (FeederCertificate feederCertificate:feederCertificateList) {
            if(feederCertificate.getPrintNum()==null){
                feederCertificate.setPrintNum(copies);
            }else{
                feederCertificate.setPrintNum(feederCertificate.getPrintNum()+copies);
            }
        }
        updateBatchById(feederCertificateList);
        return true;
    }
 
 
 
    @Override
    public Boolean checkPrintNumPassword(String password) {
        String res = remoteParamService.getByKey("WORKBENCH_LABEL_REPRINT", SecurityConstants.FROM_IN).getData();
        if (null != res) {
            return res.equals(password);
        }else{
            return false;
        }
    }
}