|
|
|
|
@ -1,19 +1,26 @@ |
|
|
|
|
package org.springblade.desk.produce.service.impl; |
|
|
|
|
|
|
|
|
|
import cn.hutool.core.bean.BeanUtil; |
|
|
|
|
import com.alibaba.fastjson.JSONObject; |
|
|
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
|
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage; |
|
|
|
|
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; |
|
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
|
|
|
|
import lombok.RequiredArgsConstructor; |
|
|
|
|
import lombok.extern.slf4j.Slf4j; |
|
|
|
|
import net.sourceforge.barbecue.Barcode; |
|
|
|
|
import net.sourceforge.barbecue.BarcodeFactory; |
|
|
|
|
import net.sourceforge.barbecue.BarcodeImageHandler; |
|
|
|
|
import org.apache.commons.lang3.StringUtils; |
|
|
|
|
import org.springblade.core.log.exception.ServiceException; |
|
|
|
|
import org.springblade.core.mp.base.BaseServiceImpl; |
|
|
|
|
import org.springblade.core.secure.utils.AuthUtil; |
|
|
|
|
import org.springblade.core.tool.api.R; |
|
|
|
|
import org.springblade.desk.basic.service.IProcessAbilityService; |
|
|
|
|
import org.springblade.desk.dashboard.pojo.entity.BsProcessSetEntity; |
|
|
|
|
import org.springblade.desk.dashboard.pojo.entity.DsPartEntity; |
|
|
|
|
import org.springblade.desk.dashboard.service.IBsProcessSetService; |
|
|
|
|
import org.springblade.desk.dashboard.service.IDsPartService; |
|
|
|
|
import org.springblade.desk.order.pojo.entity.YieldOrder; |
|
|
|
|
import org.springblade.desk.order.pojo.enums.YieldOrderEnum; |
|
|
|
|
import org.springblade.desk.order.service.IYieldOrderService; |
|
|
|
|
@ -32,10 +39,15 @@ import org.springblade.desk.quality.service.IInspectionTaskService; |
|
|
|
|
import org.springblade.desk.quality.service.IPlanTestService; |
|
|
|
|
import org.springblade.desk.quality.service.IWorkPlanItemService; |
|
|
|
|
import org.springblade.scheduling.pojo.entity.WorkOrderEntity; |
|
|
|
|
import org.springblade.erpdata.feign.IErpDataProduceClient; |
|
|
|
|
import org.springblade.system.cache.DictCache; |
|
|
|
|
import org.springframework.beans.BeanUtils; |
|
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
|
import org.springframework.transaction.annotation.Transactional; |
|
|
|
|
|
|
|
|
|
import javax.imageio.ImageIO; |
|
|
|
|
import java.awt.image.BufferedImage; |
|
|
|
|
import java.io.ByteArrayOutputStream; |
|
|
|
|
import java.time.Instant; |
|
|
|
|
import java.time.LocalDateTime; |
|
|
|
|
import java.util.*; |
|
|
|
|
@ -77,6 +89,10 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO |
|
|
|
|
|
|
|
|
|
private final IProcessAbilityService processAbilityService; |
|
|
|
|
|
|
|
|
|
private final IErpDataProduceClient erpDataProduceClient; |
|
|
|
|
|
|
|
|
|
private final IDsPartService dsPartService; |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public IPage<WorkOrderVO> selectWorkOrderPage(IPage<WorkOrderVO> page, WorkOrderDTO workOrder) { |
|
|
|
|
return page.setRecords(baseMapper.selectWorkOrderPage(page, workOrder)); |
|
|
|
|
@ -92,7 +108,9 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO |
|
|
|
|
batchPrepareVO.setWoCode(this.nextCode(yieldOrder.getYpCode())); |
|
|
|
|
batchPrepareVO.setCardNo(this.nextCardNo(yieldOrder.getYpCode(),workOrder.getCardNo())); |
|
|
|
|
batchPrepareVO.setBatchNo(this.nextBatchNo(yieldOrder.getYpCode(),workOrder.getBatchNo())); |
|
|
|
|
batchPrepareVO.setMesCardNo(this.nextMesCardNo(workOrder.getMesCardNo())); |
|
|
|
|
if (workOrder.getMesCardNo() != null) { |
|
|
|
|
batchPrepareVO.setMesCardNo(this.nextMesCardNo(workOrder.getMesCardNo())); |
|
|
|
|
} |
|
|
|
|
return batchPrepareVO; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -122,7 +140,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO |
|
|
|
|
newWo.setOemType(-1); |
|
|
|
|
newWo.setCardNo(inBatchesDTO.getCardNo()); |
|
|
|
|
newWo.setMemo(inBatchesDTO.getMemo()); |
|
|
|
|
newWo.setMesCardNo(this.nextMesCardNo(oldWo.getMesCardNo())); |
|
|
|
|
newWo.setMesCardNo(oldWo.getMesCardNo() != null ? this.nextMesCardNo(oldWo.getMesCardNo()) : ""); |
|
|
|
|
|
|
|
|
|
oldWo.setMakeQty(oldWo.getMakeQty() - newWo.getMakeQty()); |
|
|
|
|
|
|
|
|
|
@ -147,7 +165,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO |
|
|
|
|
wp.setQualifiedQty(0d); |
|
|
|
|
} |
|
|
|
|
BsProcessSetEntity processSet = bsProcessSetService.getById(wp.getPpsId()); |
|
|
|
|
if (!"镀后接收".equals(processSet.getName())) { |
|
|
|
|
if (processSet != null && !"镀后接收".equals(processSet.getName())) { |
|
|
|
|
wp.setFactEndTime(oldWp.getFactEndTime()); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -483,6 +501,160 @@ public class WorkOrderServiceImpl extends BaseServiceImpl<WorkOrderMapper, WorkO |
|
|
|
|
return workPlanList; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public Map<String, Object> getBarCode(Long woId) { |
|
|
|
|
Map<String, Object> data = new HashMap<>(1); |
|
|
|
|
List<Map<String, String>> list = new ArrayList<>(); |
|
|
|
|
Map<String, String> map = new HashMap<>(); |
|
|
|
|
// 查询车间订单
|
|
|
|
|
WorkOrder prWorkOrder = this.getById(woId); |
|
|
|
|
// 流程卡号
|
|
|
|
|
map.put("cardNo", StringUtils.isNotBlank(prWorkOrder.getCardNo()) ? prWorkOrder.getCardNo() : ""); |
|
|
|
|
map.put("cardNoBar", generateBarcodeAsBase64(StringUtils.isNotBlank(prWorkOrder.getCardNo()) ? prWorkOrder.getCardNo() : "/", 200, 50)); |
|
|
|
|
// 热表流程卡号
|
|
|
|
|
map.put("mesCardNo", StringUtils.isNotBlank(prWorkOrder.getMesCardNo()) ? prWorkOrder.getMesCardNo() : ""); |
|
|
|
|
map.put("mesCardNoBar", generateBarcodeAsBase64(StringUtils.isNotBlank(prWorkOrder.getMesCardNo()) ? prWorkOrder.getMesCardNo() : "/", 200, 25)); |
|
|
|
|
// 同槽编号
|
|
|
|
|
MacToolUse prMacToolUse = macToolUseService.getTcDataByWoId(woId); |
|
|
|
|
map.put("mtnCode", prMacToolUse != null && prMacToolUse.getMtnCode() != null ? prMacToolUse.getMtnCode() : ""); |
|
|
|
|
map.put("mtnCodeBar", generateBarcodeAsBase64(prMacToolUse != null && prMacToolUse.getMtnCode() != null ? prMacToolUse.getMtnCode() : "/", 200, 25)); |
|
|
|
|
map.put("clmc", "/"); |
|
|
|
|
map.put("clzt", "/"); |
|
|
|
|
map.put("clgg", "/"); |
|
|
|
|
map.put("clph", "/"); |
|
|
|
|
map.put("cljybh", "/"); |
|
|
|
|
map.put("productApparea", "/"); |
|
|
|
|
map.put("version", "/"); |
|
|
|
|
|
|
|
|
|
// 获取生产订单
|
|
|
|
|
YieldOrder yo = yieldOrderService.getById(prWorkOrder.getYoId()); |
|
|
|
|
if (yo != null) { |
|
|
|
|
// 获取材料名称、材料牌号、材料规格、材料状态、材料检验编号
|
|
|
|
|
List<JSONObject> newErpClData = new ArrayList<>(); |
|
|
|
|
// if (yo.getBatchNo().startsWith("A") || yo.getBatchNo().startsWith("E")) {
|
|
|
|
|
// newErpClData = baseMapper.getNewErpClData(yo.getPartCode(), yo.getBatchNo());
|
|
|
|
|
// } else if (yo.getNewLevFlag() != null && "采购".equals(yo.getNewLevFlag())) {
|
|
|
|
|
// newErpClData = baseMapper.getErpClData(yo.getPartCode(), yo.getBatchNo());
|
|
|
|
|
// }
|
|
|
|
|
if (CollectionUtils.isNotEmpty(newErpClData)) { |
|
|
|
|
map.put("clmc", newErpClData.get(0).getString("clmc")); |
|
|
|
|
map.put("clzt", newErpClData.get(0).getString("clzt")); |
|
|
|
|
map.put("clgg", newErpClData.get(0).getString("clgg")); |
|
|
|
|
map.put("clph", newErpClData.get(0).getString("clph")); |
|
|
|
|
map.put("cljybh", newErpClData.get(0).getString("cljybh")); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 产品应用领域
|
|
|
|
|
if (yo.getPartCode() != null) { |
|
|
|
|
Map<String, String> productInfo = this.getProductAppareaByPartCode(yo.getPartCode()); |
|
|
|
|
map.put("productApparea", StringUtils.isNotBlank(productInfo.get("productapparea")) ? productInfo.get("productapparea") : "/"); |
|
|
|
|
} |
|
|
|
|
// 图纸版次
|
|
|
|
|
if (yo.getPartCode() != null) { |
|
|
|
|
String version = this.getVersionByPartCode(yo.getPartCode()); |
|
|
|
|
map.put("version", StringUtils.isNotBlank(version) ? version : "/"); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
list.add(map); |
|
|
|
|
data.put("data", list); |
|
|
|
|
return data; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public Map<String, Object> getPartSubSj(Long woId) { |
|
|
|
|
Map<String, Object> data = new HashMap<>(1); |
|
|
|
|
List<Map<String, String>> list = new ArrayList<>(); |
|
|
|
|
WorkOrder wo = this.getById(woId); |
|
|
|
|
YieldOrder yieldOrder = yieldOrderService.getById(wo.getYoId()); |
|
|
|
|
List<WorkOrder> prWorkOrderList = this.checkOrderSj(wo, yieldOrder); |
|
|
|
|
List<DsPartEntity> dsPartSubList = dsPartService.selectDsPartByPatCode(yieldOrder.getPartCode(), null); |
|
|
|
|
if (dsPartSubList != null && !dsPartSubList.isEmpty()) { |
|
|
|
|
for (DsPartEntity dsPartSub : dsPartSubList) { |
|
|
|
|
Map<String, String> sub = new HashMap<>(); |
|
|
|
|
sub.put("partCode", dsPartSub.getPartCode());//零件号
|
|
|
|
|
sub.put("partType", (DictCache.getValue("processTemplateType", dsPartSub.getSinTerType())));//零件类型
|
|
|
|
|
sub.put("partName", (dsPartSub.getMaterial() != null) ? dsPartSub.getMaterial() : "/");//材料
|
|
|
|
|
sub.put("plate", (dsPartSub.getPlate() != null) ? dsPartSub.getPlate() : "/");//镀种
|
|
|
|
|
if (dsPartSub.getArea() != null && dsPartSub.getQuota() != null) { |
|
|
|
|
sub.put("poArea", String.valueOf(dsPartSub.getArea() * dsPartSub.getQuota()));//面积
|
|
|
|
|
} else { |
|
|
|
|
sub.put("poArea", "/"); |
|
|
|
|
} |
|
|
|
|
if (prWorkOrderList != null && !prWorkOrderList.isEmpty()) { |
|
|
|
|
for (WorkOrder prWorkOrder : prWorkOrderList) { |
|
|
|
|
if (yieldOrder.getPartCode().equals(dsPartSub.getPartCode())) { |
|
|
|
|
sub.put("cardNo", prWorkOrder.getCardNo());//流程卡号
|
|
|
|
|
sub.put("cardNoBar", generateBarcodeAsBase64(StringUtils.isNotBlank(prWorkOrder.getCardNo()) ? prWorkOrder.getCardNo() : "/", 200, 50)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
list.add(sub); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
data.put("data", list); |
|
|
|
|
return data; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private List<WorkOrder> checkOrderSj(WorkOrder wo, YieldOrder yieldOrder) { |
|
|
|
|
//B号为空则直接跳过
|
|
|
|
|
if (StringUtils.isBlank(yieldOrder.getRoamNo())) { |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
//非烧结零件跳过子件验证
|
|
|
|
|
if (!yieldOrder.getYieldType().equals(YieldOrder.YIELD_TYPE_2)) { |
|
|
|
|
return null; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
List<WorkOrder> subList = this.findCubByYoId(yieldOrder.getId()); |
|
|
|
|
//获取到部件下面的玻璃饼信息
|
|
|
|
|
List<DsPartEntity> dpsList = dsPartService.selectDsPartByPatCode(yieldOrder.getPartCode(), 3); |
|
|
|
|
if (dpsList != null && !dpsList.isEmpty()) { |
|
|
|
|
List<WorkOrder> blbList; |
|
|
|
|
for (DsPartEntity dps : dpsList) { |
|
|
|
|
blbList = this.findByPartCodeAndMemo(dps.getPartCode(), yieldOrder.getYpCode()); |
|
|
|
|
subList.addAll(blbList); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return subList; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private List<WorkOrder> findByPartCodeAndMemo(String partCode, String ypCode) { |
|
|
|
|
return baseMapper.findByPartCodeAndMemo(partCode, ypCode); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private List<WorkOrder> findCubByYoId(Long id) { |
|
|
|
|
return baseMapper.findCubByYoId(id); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private String getVersionByPartCode(String partCode) { |
|
|
|
|
return erpDataProduceClient.getVersionByPartCode(partCode).getData(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private Map<String, String> getProductAppareaByPartCode(String partCode) { |
|
|
|
|
R<Map<String, String>> byPartCode = erpDataProduceClient.getProductAppareaByPartCode(partCode); |
|
|
|
|
return byPartCode.getData(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private String generateBarcodeAsBase64(String content, int width, int height) { |
|
|
|
|
try { |
|
|
|
|
// 1. 创建条形码(Code128 类型)
|
|
|
|
|
Barcode barcode = BarcodeFactory.createCode128(content); |
|
|
|
|
// 2. 生成 BufferedImage(关键:使用 BarcodeImageHandler)
|
|
|
|
|
BufferedImage image = BarcodeImageHandler.getImage(barcode); |
|
|
|
|
|
|
|
|
|
// 3. 转换为 PNG 字节数组
|
|
|
|
|
ByteArrayOutputStream baos = new ByteArrayOutputStream(); |
|
|
|
|
ImageIO.write(image, "png", baos); |
|
|
|
|
byte[] imageBytes = baos.toByteArray(); |
|
|
|
|
|
|
|
|
|
// 4. 转换为 Base64 字符串(添加 data URL 前缀)
|
|
|
|
|
return "data:image/png;base64," + Base64.getEncoder().encodeToString(imageBytes); |
|
|
|
|
} catch (Exception e) { |
|
|
|
|
throw new ServiceException("生成条形码失败: " + e.getMessage()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private boolean checkWp(WorkPlan wp, Integer runType) { |
|
|
|
|
//不分派工序不能操作
|
|
|
|
|
BsProcessSetEntity processSet = bsProcessSetService.getById(wp.getPpsId()); |
|
|
|
|
|