已添加1个文件
已修改19个文件
186 ■■■■ 文件已修改
doc/20260317_鹏创电子.sql 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/enums/StockInQualifiedRecordTypeEnum.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionProductMainController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionProductOutput.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/controller/QualityInspectController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/controller/QualityUnqualifiedController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/pojo/QualityInspect.java 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/pojo/QualityTestStandard.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/pojo/QualityUnqualified.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/service/IQualityUnqualifiedService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductWorkOrderMapper.xml 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionProductMainMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionProductOutputMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/20260317_Åô´´µç×Ó.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
alter table quality_inspect
    add defective_quantity decimal(18, 2) null comment '不良数量',
    add defective_reason varchar(255) default '' not null comment '不良原因';
alter table quality_unqualified
    add quarantine_lifted boolean not null default false comment '是否已取消隔离';
src/main/java/com/ruoyi/common/enums/StockInQualifiedRecordTypeEnum.java
@@ -11,7 +11,8 @@
    PRODUCTION_REPORT_STOCK_IN("2", "生产报工-入库"),
    PURCHASE_STOCK_IN("7", "采购-入库"),
    QUALITYINSPECT_STOCK_IN("6", "质检-合格入库"),
    DEFECTIVE_PASS("11", "不合格-让步放行");
    DEFECTIVE_PASS("11", "不合格-让步放行"),
    LIFT_THE_QUARANTINE("12", "不合格-取消隔离");
    private final String code;
src/main/java/com/ruoyi/production/controller/ProductionProductMainController.java
@@ -3,21 +3,17 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.dto.ProductProcessRouteItemDto;
import com.ruoyi.production.dto.ProductionProductMainDto;
import com.ruoyi.production.dto.SalesLedgerProductionAccountingDto;
import com.ruoyi.production.service.ProductionProductMainService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.Arrays;
import java.util.List;
@RequestMapping("productionProductMain")
@RequestMapping("/productionProductMain")
@RestController
@Api(value = "生产报工")
public class ProductionProductMainController {
@@ -31,7 +27,7 @@
     * @param productionProductMainDto
     * @return
     */
    @GetMapping("listPage")
    @GetMapping("/listPage")
    public R page(Page<ProductionProductMainDto> page, ProductionProductMainDto productionProductMainDto) {
        return R.ok(productionProductMainService.listPageProductionProductMainDto(page, productionProductMainDto));
    }
@@ -41,7 +37,7 @@
     * @param productionProductMainDto
     * @return
     */
    @PostMapping("addProductMain")
    @PostMapping("/addProductMain")
    public R addProductMain(@RequestBody ProductionProductMainDto productionProductMainDto) {
        return R.ok(productionProductMainService.addProductMain(productionProductMainDto));
    }
src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java
@@ -43,4 +43,13 @@
    @ApiModelProperty(value = "工单类型 æ­£å¸¸ /返工返修")
    private String workOrderType;
    @ApiModelProperty(value = "工序排序")
    private Integer dragSort;
    @ApiModelProperty(value = "工艺路线ID")
    private Long productRouteId;
    @ApiModelProperty(value = "是否可以报工")
    private Boolean isCanReport;
}
src/main/java/com/ruoyi/production/dto/ProductionProductMainDto.java
@@ -10,7 +10,6 @@
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
@Data
@ExcelIgnoreUnannotated
@@ -61,5 +60,8 @@
    private BigDecimal workHours;
    private BigDecimal wages;
    // å…¶ä»–数据
    private String otherData;
}
src/main/java/com/ruoyi/production/pojo/ProductionProductOutput.java
@@ -33,4 +33,7 @@
    @ApiModelProperty(value = "报废数量")
    private BigDecimal scrapQty;
    @ApiModelProperty(value = "其他数据")
    private String otherData;
}
src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
@@ -13,10 +13,14 @@
import com.ruoyi.common.utils.HackLoopTableRenderPolicy;
import com.ruoyi.common.utils.MatrixToImageWriter;
import com.ruoyi.production.dto.ProductWorkOrderDto;
import com.ruoyi.production.mapper.ProductProcessRouteItemMapper;
import com.ruoyi.production.mapper.ProductWorkOrderFileMapper;
import com.ruoyi.production.mapper.ProductWorkOrderMapper;
import com.ruoyi.production.mapper.ProductionProductMainMapper;
import com.ruoyi.production.pojo.ProductProcessRouteItem;
import com.ruoyi.production.pojo.ProductWorkOrder;
import com.ruoyi.production.pojo.ProductWorkOrderFile;
import com.ruoyi.production.pojo.ProductionProductMain;
import com.ruoyi.production.service.ProductWorkOrderService;
import com.ruoyi.quality.pojo.QualityInspectParam;
import lombok.AllArgsConstructor;
@@ -28,6 +32,7 @@
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.io.OutputStream;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
@@ -42,13 +47,43 @@
    private ProductWorkOrderMapper productWorkOrdermapper;
    @Autowired
    private ProductWorkOrderFileMapper productWorkOrderFileMapper;
    @Autowired
    private ProductProcessRouteItemMapper productProcessRouteItemMapper;
    @Autowired
    private ProductionProductMainMapper productionProductMainMapper;
    @Value("${file.temp-dir}")
    private String tempDir;
    @Override
    public IPage<ProductWorkOrderDto> listPage(Page<ProductWorkOrderDto> page, ProductWorkOrderDto productWorkOrder) {
        return productWorkOrdermapper.pageProductWorkOrder(page, productWorkOrder);
        IPage<ProductWorkOrderDto> productWorkOrderDtoIPage = productWorkOrdermapper.pageProductWorkOrder(page, productWorkOrder);
        productWorkOrderDtoIPage.getRecords().forEach(record -> {
            //检查上一个工序是否已报工
            Integer currentDragSort = record.getDragSort();
            if (currentDragSort == null || currentDragSort == 1) {
                record.setIsCanReport(true);
            } else {
                //查找上一个工序
                ProductProcessRouteItem previousItem = productProcessRouteItemMapper.selectOne(
                        Wrappers.<ProductProcessRouteItem>lambdaQuery()
                                .eq(ProductProcessRouteItem::getProductRouteId, record.getProductRouteId())
                                .eq(ProductProcessRouteItem::getDragSort, currentDragSort - 1)
                );
                if (previousItem != null) {
                    //检查上一个工序是否有报工记录
                    Long count = productionProductMainMapper.selectCount(
                            Wrappers.<ProductionProductMain>lambdaQuery()
                                    .eq(ProductionProductMain::getProductProcessRouteItemId, previousItem.getId())
                    );
                    record.setIsCanReport(count > 0);
                } else {
                    record.setIsCanReport(true);
                }
            }
        });
        return productWorkOrderDtoIPage;
    }
    @Override
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -99,6 +99,27 @@
        if (productProcessRouteItem == null) {
            throw new RuntimeException("工艺路线项不存在");
        }
        //检查上一个工序是否已报工
        Integer currentDragSort = productProcessRouteItem.getDragSort();
        if (currentDragSort != null && currentDragSort > 1) {
            ProductProcessRouteItem previousItem = productProcessRouteItemMapper.selectOne(
                    Wrappers.<ProductProcessRouteItem>lambdaQuery()
                            .eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId())
                            .eq(ProductProcessRouteItem::getDragSort, currentDragSort - 1)
            );
            if (previousItem != null) {
                //检查上一个工序是否有报工记录
                Long count = productionProductMainMapper.selectCount(
                        Wrappers.<ProductionProductMain>lambdaQuery()
                                .eq(ProductionProductMain::getProductProcessRouteItemId, previousItem.getId())
                );
                if (count == 0) {
                    throw new RuntimeException("上一个工序尚未报工,不能进行当前工序报工");
                }
            }
        }
        //当前具体工序
        ProductProcess productProcess = productProcessMapper.selectById(productProcessRouteItem.getProcessId());
        //工艺路线中当前工序对应的产出规格型号
@@ -163,6 +184,7 @@
        productionProductOutput.setProductModelId(productProcessRouteItem.getProductModelId());
        productionProductOutput.setQuantity(dto.getQuantity() != null ? dto.getQuantity() : BigDecimal.ZERO);
        productionProductOutput.setScrapQty(dto.getScrapQty() != null ? dto.getScrapQty() : BigDecimal.ZERO);
        productionProductOutput.setOtherData(dto.getOtherData() != null ? dto.getOtherData() : "");
        productionProductOutputMapper.insert(productionProductOutput);
        //合格数量=报工数量-报废数量
        BigDecimal productQty = productionProductOutput.getQuantity().subtract(productionProductOutput.getScrapQty());
@@ -189,6 +211,7 @@
                qualityInspect.setProcess(process);
                qualityInspect.setInspectState(0);
                qualityInspect.setInspectType(inspectType);
                qualityInspect.setDefectiveQuantity(productionProductOutput.getScrapQty());
                qualityInspect.setProductMainId(productionProductMain.getId());
                qualityInspect.setProductModelId(productModel.getId());
                qualityInspectMapper.insert(qualityInspect);
src/main/java/com/ruoyi/quality/controller/QualityInspectController.java
@@ -23,7 +23,7 @@
import java.util.List;
/**
 * åŽŸææ–™æ£€éªŒ/过程检验/出厂检验
 * åŽŸææ–™æ£€éªŒ/过程检验/成品检验
 */
@RestController
@RequestMapping("/quality/qualityInspect")
src/main/java/com/ruoyi/quality/controller/QualityUnqualifiedController.java
@@ -100,4 +100,13 @@
    }
    /**
     * å–消隔离
     * @param qualityUnqualified
     * @return
     */
    @PostMapping("/liftTheQuarantine")
    public AjaxResult liftTheQuarantine(@RequestBody QualityUnqualified qualityUnqualified) {
        return AjaxResult.success(qualityUnqualifiedService.liftTheQuarantine(qualityUnqualified));
    }
}
src/main/java/com/ruoyi/quality/pojo/QualityInspect.java
@@ -14,7 +14,7 @@
import java.util.Date;
/**
 * è´¨é‡ç®¡ç†--原材料/过程/出厂检验
 * è´¨é‡ç®¡ç†--原材料/过程/成品检验
 * quality_inspect
 */
@TableName(value = "quality_inspect")
@@ -29,9 +29,9 @@
    private Long id;
    /**
     * ç±»åˆ«(0:原材料检验;1:过程检验;2:出厂检验)
     * ç±»åˆ«(0:原材料检验;1:过程检验;2:成品检验)
     */
    @Excel(name = "类别",readConverterExp = "0=原材料检验,1=过程检验,2=出厂检验")
    @Excel(name = "类别",readConverterExp = "0=原材料检验,1=过程检验,2=成品检验")
    @NotBlank(message = "类别不能为空!!")
    private Integer inspectType;
@@ -52,7 +52,7 @@
    private String supplier;
    /**
     * å®¢æˆ·åç§°(过程检验/出厂检验)
     * å®¢æˆ·åç§°(过程检验/成品检验)
     */
    @Excel(name = "客户名称")
    private String customer;
@@ -100,6 +100,18 @@
    private BigDecimal quantity;
    /**
     * ä¸è‰¯æ•°é‡
     */
    @Excel(name = "不良数量")
    private BigDecimal defectiveQuantity;
    /**
     * ä¸è‰¯åŽŸå› 
     */
    @Excel(name = "不良原因")
    private String defectiveReason;
    /**
     * æ£€æµ‹å•位
     */
    @Excel(name = "检测单位")
src/main/java/com/ruoyi/quality/pojo/QualityTestStandard.java
@@ -64,7 +64,7 @@
    @ApiModelProperty("状态")
    private String state;
    @ApiModelProperty("类别(0:原材料检验;1:过程检验;2:出厂检验)")
    @ApiModelProperty("类别(0:原材料检验;1:过程检验;2:成品检验)")
    private Integer inspectType;
    @ApiModelProperty("工序id")
src/main/java/com/ruoyi/quality/pojo/QualityUnqualified.java
@@ -31,10 +31,10 @@
    /**
     * ç±»åˆ«(0:原材料检验;1:过程检验;2:出厂检验)
     * ç±»åˆ«(0:原材料检验;1:过程检验;2:成品检验)
     */
    @NotBlank(message = "类别不能为空!!!")
    @Excel(name = "类别",readConverterExp = "0=原材料检验,1=过程检验,2=出厂检验")
    @Excel(name = "类别",readConverterExp = "0=原材料检验,1=过程检验,2=成品检验")
    private Integer inspectType;
    /**
@@ -93,6 +93,12 @@
    private String defectivePhenomena;
    /**
     * æ˜¯å¦å·²å–消隔离
     */
    @Excel(name = "是否已取消隔离")
    private Boolean quarantineLifted;
    /**
     * å¤„理结果
     */
    @Excel(name = "处理结果")
@@ -111,7 +117,8 @@
    @Excel(name = "处理日期", width = 30, dateFormat = "yyyy-MM-dd")
    private Date dealTime;
    @Excel(name = "备注")
    private String remark;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
@@ -140,4 +147,8 @@
    @ApiModelProperty("是否不合格处理自己新增")
    @TableField(exist = false)
    private Boolean method;
    @ApiModelProperty("工序")
    @TableField(exist = false)
    private String process;
}
src/main/java/com/ruoyi/quality/service/IQualityUnqualifiedService.java
@@ -17,5 +17,7 @@
    int deal(QualityUnqualified qualityUnqualified);
    boolean liftTheQuarantine(QualityUnqualified qualityUnqualified);
    QualityUnqualified getUnqualified(Integer id);
}
src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -124,7 +124,7 @@
                inspectType = "过程检验";
                break;
            case 2:
                inspectType = "出厂检验";
                inspectType = "成品检验";
                break;
        }
        List<QualityInspectParam> paramList = qualityInspectParamService.list(Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId, inspect.getId()));
@@ -194,7 +194,7 @@
                util.exportExcel(response, qualityInspects, "过程检验导出");
                break;
            case 2:
                util.exportExcel(response, qualityInspects, "出厂检验导出");
                util.exportExcel(response, qualityInspects, "成品检验导出");
                break;
        }
src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
@@ -29,6 +29,7 @@
import com.ruoyi.stock.service.StockUninventoryService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
@@ -170,6 +171,33 @@
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean liftTheQuarantine(QualityUnqualified qualityUnqualified) {
        QualityUnqualified unqualified = qualityUnqualifiedMapper.selectById(qualityUnqualified.getId());
        if (unqualified.getQuarantineLifted()) {
            throw new RuntimeException("该不合格品已被取消隔离");
        }
        if (unqualified.getDealResult() == null) {
            throw new RuntimeException("该不合格品未被处理");
        }
        if (!unqualified.getDealResult().equals("隔离")) {
            throw new RuntimeException("该不合格品未被隔离");
        }
        // å–消隔离 è°ƒç”¨æäº¤åˆæ ¼çš„æŽ¥å£
        QualityInspect qualityInspect = qualityInspectService.getById(unqualified.getInspectId());
        if (qualityInspect.getInspectType().equals(2)) {
            stockUtils.addStockNoReview(qualityInspect.getProductModelId(), unqualified.getQuantity(), StockInQualifiedRecordTypeEnum.LIFT_THE_QUARANTINE.getCode(), unqualified.getId());
        } else {
            stockUtils.addStock(qualityInspect.getProductModelId(), unqualified.getQuantity(), StockInQualifiedRecordTypeEnum.LIFT_THE_QUARANTINE.getCode(), unqualified.getId());
        }
        unqualified.setQuarantineLifted(true);
        return qualityUnqualifiedMapper.updateById(unqualified) > 0;
    }
    @Override
    public QualityUnqualified getUnqualified(Integer id) {
        return qualityUnqualifiedMapper.getUnqualified(id);
    }
src/main/resources/mapper/production/ProductWorkOrderMapper.xml
@@ -26,6 +26,8 @@
        pm.unit,
        p.product_name AS productName,
        po.nps_no AS productOrderNpsNo,
        ppri.drag_sort,
        ppri.product_route_id,
        ROUND(pwo.complete_quantity / pwo.plan_quantity * 100, 2) AS completionStatus,
        CASE
        WHEN pwo.work_order_no LIKE 'FG%' THEN '返工返修'
src/main/resources/mapper/production/ProductionProductMainMapper.xml
@@ -22,6 +22,7 @@
        pm.model as productModelName,
        ppo.quantity,
        ppo.scrap_qty,
        ppo.other_data,
        pm.unit,
        sl.sales_contract_no salesContractNo
        from
src/main/resources/mapper/production/ProductionProductOutputMapper.xml
@@ -9,6 +9,7 @@
        <result property="quantity" column="quantity"/>
        <result property="tenantId" column="tenant_id"/>
        <result property="createTime" column="create_time"/>
        <result property="otherData" column="other_data"/>
    </resultMap>
    <select id="listPageProductionProductOutputDto" resultType="com.ruoyi.production.dto.ProductionProductOutputDto">
src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml
@@ -16,6 +16,7 @@
        qu.deal_result,
        qu.deal_name,
        qu.deal_time,
        qu.quarantine_lifted,
        CASE
        WHEN qu.model = pm.id THEN pm.model
        ELSE qu.model
@@ -75,6 +76,7 @@
            qu.deal_result,
            qu.deal_name,
            qu.deal_time,
            qi.process,
            CASE
                WHEN qu.model = pm.id THEN pm.model
                ELSE qu.model
@@ -85,6 +87,7 @@
                END AS method
        FROM quality_unqualified qu
                 LEFT JOIN product_model pm ON qu.model = pm.id
                 LEFT JOIN quality_inspect qi ON qu.inspect_id = qi.id
        where
            1=1
        and qu.id = #{id}