Parcourir la source

aps报工生成子表批次号和二维码,更新报工主表待检验批次号

sucheng il y a 1 an
Parent
commit
534b350815

+ 4 - 0
bs-common/src/main/java/com/rongwei/safecommon/fegin/CXAdminFeginClient.java

@@ -5,6 +5,7 @@ import com.rongwei.rwcommon.vo.CriteriaQuery;
 import com.rongwei.rwcommon.vo.MailDo;
 import com.rongwei.rwcommon.vo.generalsql.BatchSaveVo;
 import com.rongwei.rwcommonentity.commonservers.vo.SysNotifyAnnounceVo;
+import com.rongwei.rwcommonentity.commonservers.vo.SysSerialVo;
 import org.springframework.cloud.openfeign.FeignClient;
 import org.springframework.http.MediaType;
 import org.springframework.scheduling.annotation.Async;
@@ -21,4 +22,7 @@ public interface CXAdminFeginClient {
 
     @PostMapping("sys/generalCRUD/batchSaveList")
     R batchSaveList(@RequestBody BatchSaveVo batchSaveVo);
+
+    @PostMapping("sys/generalCRUD/getSerialNumberCode")
+    R<Map<String, Object>> getSerialNumberCode(@RequestBody SysSerialVo sysSerialVo);
 }

+ 7 - 0
bs-common/src/main/java/com/rongwei/safecommon/fegin/CXAdminFeginClientError.java

@@ -3,6 +3,7 @@ package com.rongwei.safecommon.fegin;
 import com.rongwei.rwcommon.base.R;
 import com.rongwei.rwcommon.vo.CriteriaQuery;
 import com.rongwei.rwcommon.vo.generalsql.BatchSaveVo;
+import com.rongwei.rwcommonentity.commonservers.vo.SysSerialVo;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Component;
@@ -29,5 +30,11 @@ public class CXAdminFeginClientError implements CXAdminFeginClient {
         return R.error();
     }
 
+    @Override
+    public R getSerialNumberCode(SysSerialVo sysSerialVo) {
+        log.error("生成流水码失败:{}",sysSerialVo);
+        return R.error();
+    }
+
 
 }

+ 11 - 0
cx-aps/cx-aps-common/pom.xml

@@ -56,5 +56,16 @@
             <scope>compile</scope>
         </dependency>
 
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>core</artifactId>
+            <version>3.4.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.zxing</groupId>
+            <artifactId>javase</artifactId>
+            <version>3.4.1</version>
+        </dependency>
+
     </dependencies>
 </project>

+ 9 - 0
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/dao/ApsProductDetailDao.java

@@ -0,0 +1,9 @@
+package com.rongwei.bscommon.sys.dao;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.rongwei.bsentity.domain.ApsProductDetailDo;
+
+public interface ApsProductDetailDao extends BaseMapper<ApsProductDetailDo> {
+
+}

+ 19 - 0
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/ApsProductDetailService.java

@@ -0,0 +1,19 @@
+package com.rongwei.bscommon.sys.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.rongwei.bsentity.domain.ApsProductDetailDo;
+import com.rongwei.rwcommon.base.R;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 生产订单_产品明细 服务类
+ * </p>
+ *
+ * @author sc
+ * @since 2024-03-28
+ */
+public interface ApsProductDetailService extends IService<ApsProductDetailDo> {
+
+}

+ 5 - 0
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/ApsReportOutputService.java

@@ -2,10 +2,15 @@ package com.rongwei.bscommon.sys.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.rongwei.bsentity.domain.ApsReportOutputDo;
+import com.rongwei.bsentity.vo.InsertMyReportOutputReq;
+import com.rongwei.rwcommon.base.R;
+
+import java.util.Map;
 
 /**
  *
  */
 public interface ApsReportOutputService extends IService<ApsReportOutputDo> {
 
+    R insertMyReportOutput(InsertMyReportOutputReq req);
 }

+ 23 - 0
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsProductDetailServiceImpl.java

@@ -0,0 +1,23 @@
+package com.rongwei.bscommon.sys.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.rongwei.bscommon.sys.dao.ApsProductDetailDao;
+import com.rongwei.bscommon.sys.service.ApsProductDetailService;
+import com.rongwei.bsentity.domain.ApsProductDetailDo;
+import com.rongwei.rwcommon.base.R;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 生产订单_产品明细 服务实现类
+ * </p>
+ *
+ * @author sc
+ * @since 2024-03-28
+ */
+@Service
+public class ApsProductDetailServiceImpl extends ServiceImpl<ApsProductDetailDao, ApsProductDetailDo> implements ApsProductDetailService {
+
+}

+ 154 - 0
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ApsReportOutputServiceImpl.java

@@ -1,17 +1,171 @@
 package com.rongwei.bscommon.sys.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.rongwei.bscommon.sys.dao.ApsReportOutputDao;
+import com.rongwei.bscommon.sys.service.ApsProcessOperationOutMaterService;
+import com.rongwei.bscommon.sys.service.ApsReportRecordsService;
+import com.rongwei.bscommon.sys.utils.QRCodeGenerator;
+import com.rongwei.bsentity.domain.ApsProcessOperationOutMaterDo;
 import com.rongwei.bsentity.domain.ApsReportOutputDo;
+import com.rongwei.bsentity.domain.ApsReportRecordsDo;
+import com.rongwei.bsentity.vo.InsertMyReportOutputReq;
+import com.rongwei.rwcommon.base.R;
+import com.rongwei.rwcommon.utils.SecurityUtil;
+import com.rongwei.rwcommonentity.commonservers.vo.SysSerialVo;
+import com.rongwei.safecommon.fegin.CXAdminFeginClient;
+import com.rongwei.safecommon.utils.CXCommonUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.rongwei.bscommon.sys.service.ApsReportOutputService;
+
+import javax.annotation.Resource;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
 /**
  *
  */
 @Service
 public class ApsReportOutputServiceImpl extends ServiceImpl<ApsReportOutputDao, ApsReportOutputDo>
         implements ApsReportOutputService {
+    @Autowired
+    private ApsProcessOperationOutMaterService apsProcessOperationOutMaterService;
+    @Resource
+    private CXAdminFeginClient cxAdminFeginClient;
+    @Autowired
+    private ApsReportRecordsService apsReportRecordsService;
+
+    @Override
+    public R insertMyReportOutput(InsertMyReportOutputReq req) {
+        //最终新增的子表数据
+        List<ApsReportOutputDo> resList = new LinkedList<>();
+
+        //查询工序作业输出物料子表信息
+        List<ApsProcessOperationOutMaterDo> list = apsProcessOperationOutMaterService.list(new QueryWrapper<ApsProcessOperationOutMaterDo>().lambda().eq(ApsProcessOperationOutMaterDo::getMainid, req.getProcessId()));
+
+        if (req.getIfBlankProcess().equals("是")) {
+            if (req.getBlankType().equals("铸轧")) {
+                for (ApsProcessOperationOutMaterDo apsProcessOperationOutMaterDo : list) {
+                    int outval = apsProcessOperationOutMaterDo.getOutval();
+
+                    for (int i = 1; i <= outval; i++) {
+                        //插入记录物料子表
+                        ApsReportOutputDo apsReportOutputDo = new ApsReportOutputDo();
+
+                        apsReportOutputDo.setMainid(req.getMainId());
+                        apsReportOutputDo.setOutputid(apsProcessOperationOutMaterDo.getId());
+                        apsReportOutputDo.setOutputmaterial(apsProcessOperationOutMaterDo.getOutputmaterial());
+                        //生成批次号
+                        SysSerialVo vo = new SysSerialVo();
+                        vo.setModulecode("aps_report_output_" + req.getDeviceId());
+                        vo.setRuleTemplateStr(req.getMark() + req.getYearCode() + req.getMonthCode() + req.getEquipmentCode() + req.getCodeRule());
+                        vo.setResetrule("date:yyyyMM");
+                        vo.setIfautomaticreset("y");
+                        vo.setInitValue(0L);
+                        Map<String, Object> codeData = cxAdminFeginClient.getSerialNumberCode(vo).getData();
+                        String code = codeData.get("code").toString();
+
+                        apsReportOutputDo.setOutputnumber(code);
+                        JSONObject json = new JSONObject();
+                        json.put("batchNumber", code);
+                        //生成二维码
+                        String qrCode = QRCodeGenerator.stringToQRCodeBase64(json.toJSONString(), 120, 120, "png");
+                        apsReportOutputDo.setQrcode(qrCode);
+                        apsReportOutputDo.setId(SecurityUtil.getUUID());
+                        resList.add(apsReportOutputDo);
+                    }
+                }
+            }
+            if (req.getBlankType().equals("热轧")) {
+                for (ApsProcessOperationOutMaterDo apsProcessOperationOutMaterDo : list) {
+                    int outval = apsProcessOperationOutMaterDo.getOutval();
+                    for (int i = 1; i <= outval; i++) {
+                        //插入记录物料子表
+                        ApsReportOutputDo apsReportOutputDo = new ApsReportOutputDo();
+                        apsReportOutputDo.setId(SecurityUtil.getUUID());
+                        apsReportOutputDo.setMainid(req.getMainId());
+                        apsReportOutputDo.setOutputid(apsProcessOperationOutMaterDo.getId());
+                        apsReportOutputDo.setOutputmaterial(apsProcessOperationOutMaterDo.getOutputmaterial());
+                        //生成批次号
+                        String code = req.getMark() + req.getYearCode() + req.getMonthCode() + req.getEquipmentCode() + req.getHeatNumber() + i;
+                        apsReportOutputDo.setOutputnumber(code);
+                        JSONObject json = new JSONObject();
+                        json.put("batchNumber", code);
+                        //生成二维码
+                        String qrCode = QRCodeGenerator.stringToQRCodeBase64(json.toJSONString(), 120, 120, "png");
+                        apsReportOutputDo.setQrcode(qrCode);
+                        resList.add(apsReportOutputDo);
+                    }
+                }
+            }
+        }
+        if (req.getIfBlankProcess().equals("否")) {
+            //如果输出物料数量=1,并且单卷输出数量=1,批次号不变
+            if (list.size() == 1 && list.get(0).getOutval() == 1) {
+                //插入记录物料子表
+                ApsReportOutputDo apsReportOutputDo = new ApsReportOutputDo();
+                apsReportOutputDo.setId(SecurityUtil.getUUID());
+                apsReportOutputDo.setMainid(req.getMainId());
+                apsReportOutputDo.setOutputid(list.get(0).getId());
+                apsReportOutputDo.setOutputmaterial(list.get(0).getOutputmaterial());
+                apsReportOutputDo.setOutputnumber(req.getInputBatchNumber());
+                JSONObject json = new JSONObject();
+                json.put("batchNumber", req.getInputBatchNumber());
+                //生成二维码
+                String qrCode = QRCodeGenerator.stringToQRCodeBase64(json.toJSONString(), 120, 120, "png");
+                apsReportOutputDo.setQrcode(qrCode);
+                resList.add(apsReportOutputDo);
+            } else {//输出物料数量>1,或者单卷输出数量>1
+                for (ApsProcessOperationOutMaterDo apsProcessOperationOutMaterDo : list) {
+                    int outval = apsProcessOperationOutMaterDo.getOutval();
+                    for (int i = 1; i <= outval; i++) {
+                        //插入记录物料子表
+                        ApsReportOutputDo apsReportOutputDo = new ApsReportOutputDo();
+
+                        apsReportOutputDo.setMainid(req.getMainId());
+                        apsReportOutputDo.setOutputid(apsProcessOperationOutMaterDo.getId());
+                        apsReportOutputDo.setOutputmaterial(apsProcessOperationOutMaterDo.getOutputmaterial());
+                        //生成批次号
+                        //生成批次号
+                        SysSerialVo vo = new SysSerialVo();
+                        vo.setModulecode("aps_report_output_" + req.getInputBatchNumber().split("-")[0]);
+                        vo.setRuleTemplateStr(req.getInputBatchNumber().split("-")[0] + "-" + req.getCodeRule());
+                        vo.setResetrule("date:yyyyMM");
+                        vo.setIfautomaticreset("y");
+                        vo.setInitValue(0L);
+                        Map<String, Object> codeData = cxAdminFeginClient.getSerialNumberCode(vo).getData();
+                        String code = codeData.get("code").toString();
+
+                        apsReportOutputDo.setOutputnumber(code);
+                        JSONObject json = new JSONObject();
+                        json.put("batchNumber", code);
+                        //生成二维码
+                        String qrCode = QRCodeGenerator.stringToQRCodeBase64(json.toJSONString(), 120, 120, "png");
+                        apsReportOutputDo.setQrcode(qrCode);
+
+                        apsReportOutputDo.setId(SecurityUtil.getUUID());
+                        resList.add(apsReportOutputDo);
+                    }
+                }
+            }
+        }
+
+        //插入子表
+        this.saveBatch(resList);
 
+        //更新主表中的待检验批次号
+        List<String> batchNumberList = resList.stream().map(ApsReportOutputDo::getOutputnumber).collect(Collectors.toList());
+        String batchNumbers = String.join(",", batchNumberList);
+        ApsReportRecordsDo apsReportRecordsDo = new ApsReportRecordsDo();
+        apsReportRecordsDo.setId(req.getMainId());
+        apsReportRecordsDo.setNeedcheckbatchnumber(batchNumbers);
+        apsReportRecordsService.updateById(apsReportRecordsDo);
+        return R.ok();
+    }
 }
 
 

+ 60 - 0
cx-aps/cx-aps-common/src/main/java/com/rongwei/bscommon/sys/utils/QRCodeGenerator.java

@@ -0,0 +1,60 @@
+package com.rongwei.bscommon.sys.utils;
+
+import com.google.zxing.BarcodeFormat;
+import com.google.zxing.EncodeHintType;
+import com.google.zxing.WriterException;
+import com.google.zxing.common.BitMatrix;
+import com.google.zxing.qrcode.QRCodeWriter;
+import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
+import com.google.zxing.client.j2se.MatrixToImageWriter;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.nio.file.FileSystems;
+import java.nio.file.Path;
+import java.util.HashMap;
+import java.util.Map;
+import javax.imageio.ImageIO;
+import java.awt.image.BufferedImage;
+import java.util.Base64;
+
+public class QRCodeGenerator {
+
+    public static String stringToQRCodeBase64(String text, int width, int height, String fileType) {
+
+
+        try {
+            BufferedImage qrCodeImage = generateQRCodeImage(text, width, height);
+            String base64String = convertImageToBase64(qrCodeImage, fileType);
+            return base64String;
+        } catch (WriterException | IOException e) {
+            System.err.println("Could not generate QR Code: " + e.getMessage());
+            return null;
+        }
+    }
+
+    private static BufferedImage generateQRCodeImage(String text, int width, int height) throws WriterException {
+        QRCodeWriter qrCodeWriter = new QRCodeWriter();
+        Map<EncodeHintType, Object> hints = new HashMap<>();
+        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
+        hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");
+        BitMatrix bitMatrix = qrCodeWriter.encode(text, BarcodeFormat.QR_CODE, width, height, hints);
+
+        return MatrixToImageWriter.toBufferedImage(bitMatrix);
+    }
+
+    private static String convertImageToBase64(BufferedImage image, String fileType) throws IOException {
+        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+        ImageIO.write(image, fileType, outputStream);
+        byte[] imageBytes = outputStream.toByteArray();
+        return Base64.getEncoder().encodeToString(imageBytes);
+    }
+
+    public static void main(String[] args) {
+        String text = "https://www.example.com";
+        int width = 120;
+        int height = 120;
+        String fileType = "png";
+        stringToQRCodeBase64(text, width, height, fileType);
+    }
+}

+ 145 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/domain/ApsProductDetailDo.java

@@ -0,0 +1,145 @@
+package com.rongwei.bsentity.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.rongwei.rwcommon.base.BaseDo;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * aps_product_detail
+ * @author 
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@TableName("aps_product_detail")
+public class ApsProductDetailDo extends BaseDo {
+
+
+    /**
+     * 物料名称
+     */
+    private String materialname;
+
+    /**
+     * 物料编码
+     */
+    private String materialcode;
+
+    /**
+     * 产品类型
+     */
+    private String producttype;
+
+    /**
+     * 合金
+     */
+    private String alloy;
+
+    /**
+     * 合金状态
+     */
+    private String alloystatus;
+
+    /**
+     * 厚度(mm)
+     */
+    private BigDecimal thickness;
+
+    /**
+     * 宽度(mm)
+     */
+    private BigDecimal prowidth;
+
+    /**
+     * 长度(mm)
+     */
+    private BigDecimal prolength;
+
+    /**
+     * 规格
+     */
+    private String specialfication;
+
+    /**
+     * 合并订单号
+     */
+    private String mergeordernumber;
+
+    /**
+     * 订单总数量
+     */
+    private BigDecimal totalordercount;
+
+    /**
+     * 坯料计划输出总重量
+     */
+    private BigDecimal planout;
+
+    /**
+     * 坯料实际可输出总重量
+     */
+    private BigDecimal realout;
+
+    /**
+     * 单卷重(起)
+     */
+    private BigDecimal singlerollweightstart;
+
+    /**
+     * 单卷重(止)
+     */
+    private BigDecimal singlerollweightend;
+
+    /**
+     * 数量单位
+     */
+    private String numberunit;
+
+    /**
+     * 卷数
+     */
+    private Integer rollnum;
+
+    /**
+     * 生产状态
+     */
+    private String productstatus;
+
+    /**
+     * 所属租户ID
+     */
+    private String tenantid;
+
+    /**
+     * 扩展json格式配置
+     */
+    private String roption;
+
+    /**
+     * 订单ID
+     */
+    private String mainid;
+
+    /**
+     * 产品类型ID
+     */
+    private String producttypeid;
+
+    /**
+     * 输入物料描述
+     */
+    private String inputmaterialdescription;
+
+    /**
+     * 物料ID
+     */
+    private String materialid;
+
+    private static final long serialVersionUID = 1L;
+}

+ 71 - 0
cx-aps/cx-aps-entity/src/main/java/com/rongwei/bsentity/vo/InsertMyReportOutputReq.java

@@ -0,0 +1,71 @@
+package com.rongwei.bsentity.vo;
+
+import lombok.Data;
+
+/**
+ * @author :sc
+ * @since :2024/3/28
+ */
+@Data
+public class InsertMyReportOutputReq {
+    /**
+     * 工序ID
+     */
+    private String processId;
+
+    /**
+     * 是坯料工序
+     */
+    private String ifBlankProcess;
+
+    /**
+     * BLANKTYPE(坯料类型)
+     */
+    private String blankType;
+
+    /**
+     * 记录主键ID
+     */
+    private String mainId;
+
+    /**
+     * 设备ID
+     */
+    private String deviceId;
+
+    /**
+     * 车间代号
+     */
+    private String mark;
+
+    /**
+     * 年份代号
+     */
+    private String yearCode;
+
+    /**
+     * 月份代号
+     */
+    private String monthCode;
+
+    /**
+     * 设备代号
+     */
+    private String equipmentCode;
+
+    /**
+     * 流水号规则
+     */
+    private String codeRule = "@{serialNumber:#000}";
+
+    /**
+     * 炉号
+     */
+    private String heatNumber;
+
+    /**
+     * 输入物料的批次号
+     */
+    private String inputBatchNumber;
+
+}

+ 33 - 0
cx-aps/cx-aps-server/src/main/java/com/rongwei/bsserver/controller/ApsProductDetailController.java

@@ -0,0 +1,33 @@
+package com.rongwei.bsserver.controller;
+
+
+import com.rongwei.bscommon.sys.service.ApsProductDetailService;
+import com.rongwei.bsentity.vo.CommonUpdateProductionStatusReq;
+import com.rongwei.rwcommon.base.R;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 生产订单-产品明细 前端控制器
+ * </p>
+ *
+ * @author sc
+ * @since 2024-03-28
+ */
+@Slf4j
+@RestController
+@RequestMapping("/apsProductDetail")
+public class ApsProductDetailController {
+    @Autowired
+    private ApsProductDetailService apsProductDetailService;
+
+
+}
+

+ 50 - 0
cx-aps/cx-aps-server/src/main/java/com/rongwei/bsserver/controller/ApsReportOutputController.java

@@ -0,0 +1,50 @@
+package com.rongwei.bsserver.controller;
+
+
+import com.rongwei.bscommon.sys.service.ApsProductDetailService;
+import com.rongwei.bscommon.sys.service.ApsReportOutputService;
+import com.rongwei.bsentity.vo.InsertMyReportOutputReq;
+import com.rongwei.rwcommon.base.R;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+
+/**
+ * <p>
+ * 生产订单-产品明细 前端控制器
+ * </p>
+ *
+ * @author sc
+ * @since 2024-03-28
+ */
+@Slf4j
+@RestController
+@RequestMapping("/apsReportOutput")
+public class ApsReportOutputController {
+    @Autowired
+    private ApsReportOutputService apsReportOutputService;
+
+    /**
+     *  插入记录的物料子表
+     * @param req
+     * @return
+     */
+    @PostMapping("/insertMyReportOutput")
+    public R insertMyReportOutput(@RequestBody InsertMyReportOutputReq req) {
+        try {
+            log.info("插入记录的物料子表;参数为:{}", req);
+            return apsReportOutputService.insertMyReportOutput(req);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.error("插入记录的物料子表错误");
+        }
+    }
+
+
+}
+