gongchunyi
2026-04-16 763c537040d45334190f470cd5ba056610d3aa36
feat: 部件的导入修改
已添加2个文件
已修改4个文件
282 ■■■■ 文件已修改
doc/君歌化工.sql 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductProcessController.java 52 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/enums/ProductProcessEnum.java 55 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductProcess.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductProcessService.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java 130 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/¾ý¸è»¯¹¤.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,6 @@
ALTER TABLE `product-inventory-management-jghg`.`product_process`
    MODIFY COLUMN `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '工序名称' AFTER `update_time`,
    MODIFY COLUMN `no` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '工序编号' AFTER `name`,
    MODIFY COLUMN `type` int NULL DEFAULT NULL COMMENT '类型1-加工,2-刮板冷芯制作、3-管路组对、4-罐体连接及调试,5-测试打压,6-其他' AFTER `is_quality`;
ALTER TABLE `product-inventory-management-jghg`.`product_process`
    COMMENT = '工序表';
src/main/java/com/ruoyi/production/controller/ProductProcessController.java
@@ -2,22 +2,17 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.pojo.Customer;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.device.pojo.DeviceRepair;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.oA.pojo.OaProject;
import com.ruoyi.production.dto.ProductProcessDto;
import com.ruoyi.production.pojo.ProductProcess;
import com.ruoyi.production.service.impl.ProductProcessServiceImpl;
import com.ruoyi.production.service.ProductProcessService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
@@ -29,9 +24,8 @@
@RequestMapping("/productProcess")
public class ProductProcessController extends BaseController {
    @Autowired
    private ProductProcessServiceImpl productProcessService;
    private ProductProcessService productProcessService;
    @GetMapping("/listPage")
    @Log(title = "工序-分页查询", businessType = BusinessType.OTHER)
@@ -41,46 +35,50 @@
        return AjaxResult.success(listPage);
    }
    @ApiModelProperty("新增工序")
    @ApiOperation("新增工序")
    @PostMapping()
    @Log(title = "新增", businessType = BusinessType.INSERT)
    public AjaxResult add( @RequestBody ProductProcessDto productProcessDto) {
        return productProcessService.add(productProcessDto);
    @Log(title = "工序-新增", businessType = BusinessType.INSERT)
    public AjaxResult add(@RequestBody ProductProcessDto productProcessDto) {
        productProcessService.add(productProcessDto);
        return AjaxResult.success();
    }
    @ApiOperation("更新工序")
    @Log(title = "修改", businessType = BusinessType.UPDATE)
    @Log(title = "工序-修改", businessType = BusinessType.UPDATE)
    @PutMapping("/update")
    public AjaxResult update(@RequestBody ProductProcess productProcess) {
        return AjaxResult.success(productProcessService.updateById(productProcess));
    public AjaxResult update(@RequestBody ProductProcessDto productProcessDto) {
        productProcessService.update(productProcessDto);
        return AjaxResult.success();
    }
    @ApiOperation("删除工序")
    @DeleteMapping("/batchDelete")
    @Log(title = "删除", businessType = BusinessType.DELETE)
    @Log(title = "工序-删除", businessType = BusinessType.DELETE)
    public AjaxResult batchDelete(@RequestBody List<Integer> ids) {
        return AjaxResult.success(productProcessService.batchDelete(ids));
        productProcessService.batchDelete(ids);
        return AjaxResult.success();
    }
    @ApiOperation("查询所有工序")
    @GetMapping("/list")
    @Log(title = "工序-查询列表", businessType = BusinessType.OTHER)
    public AjaxResult list() {
        return AjaxResult.success(productProcessService.list());
        }
    /**
     * å¯¼å…¥å·¥åº
     */
    @Log(title = "工序", businessType = BusinessType.IMPORT)
    @PostMapping("/importData")
    public AjaxResult importData(MultipartFile file) throws Exception {
        return productProcessService.importData(file);
    }
    @ApiOperation("导入工序")
    @Log(title = "工序-导入", businessType = BusinessType.IMPORT)
    @PostMapping("/importData")
    public AjaxResult importData(MultipartFile file) {
        productProcessService.importData(file);
        return AjaxResult.success();
    }
    @ApiOperation("下载工序模板")
    @PostMapping("/downloadTemplate")
    @Log(title = "工序-下载模板", businessType = BusinessType.EXPORT)
    public void downloadTemplate(HttpServletResponse response) {
        ExcelUtil<ProductProcess> util = new ExcelUtil<ProductProcess>(ProductProcess.class);
        ExcelUtil<ProductProcess> util = new ExcelUtil<>(ProductProcess.class);
        util.importTemplateExcel(response, "工序模板");
    }
}
src/main/java/com/ruoyi/production/enums/ProductProcessEnum.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,55 @@
package com.ruoyi.production.enums;
import lombok.Getter;
/**
 * <br>
 * éƒ¨ä»¶ç±»åž‹æžšä¸¾
 * </br>
 *
 * @author deslrey
 * @version 1.0
 * @since 2026/4/16 10:27
 */
@Getter
public enum ProductProcessEnum {
    PROCESSING(1, "加工"),
    SCRAPER_COLD_CORE(2, "刮板冷芯制作"),
    PIPELINE_ASSEMBLY(3, "管路组对"),
    TANK_CONNECTION_DEBUG(4, "罐体连接及调试"),
    PRESSURE_TEST(5, "测试打压"),
    OTHER(6, "其他");
    private final Integer code;
    private final String info;
    ProductProcessEnum(Integer code, String info) {
        this.code = code;
        this.info = info;
    }
    /**
     * æ ¹æ®åç§°èŽ·å–å¯¹åº”çš„ Code
     */
    public static Integer getCodeByInfo(String info) {
        for (ProductProcessEnum value : ProductProcessEnum.values()) {
            if (value.getInfo().equals(info)) {
                return value.getCode();
            }
        }
        return null;
    }
    /**
     * æ ¹æ®åç§°èŽ·å–æžšä¸¾å¯¹è±¡
     */
    public static ProductProcessEnum getEnumByInfo(String info) {
        for (ProductProcessEnum value : ProductProcessEnum.values()) {
            if (value.getInfo().equals(info)) {
                return value;
            }
        }
        return null;
    }
}
src/main/java/com/ruoyi/production/pojo/ProductProcess.java
@@ -27,20 +27,14 @@
    /**
     * å·¥åºåç§°
     */
    @Excel(name = "工序名称")
    @Excel(name = "部件名称")
    private String name;
    /**
     * å·¥åºç¼–号
     */
    @Excel(name = "工序编号")
    @Excel(name = "部件编号")
    private String no;
    /**
     * å¤‡æ³¨
     */
    @Excel(name = "备注")
    private String remark;
    /**
@@ -50,8 +44,19 @@
    @TableField(updateStrategy = FieldStrategy.IGNORED)
    private BigDecimal salaryQuota;
    @ApiModelProperty("类型 åŒºåˆ†æ˜¯è®¡æ—¶è¿˜æ˜¯è®¡ä»¶ 0 è®¡æ—¶ 1计件")
    private Long type;
    @ApiModelProperty("类型1-加工,2-刮板冷芯制作、3-管路组对、4-罐体连接及调试,5-测试打压,6-其他")
    private Integer type;
    @TableField(exist = false)
    @Excel(name = "部件类型")
    private String ProductProcessType;
    /**
     * å¤‡æ³¨
     */
    @Excel(name = "备注")
    private String remark;
    /**
     * åˆ›å»ºæ—¶é—´
@@ -75,7 +80,7 @@
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    @ApiModelProperty(value ="是否质检")
    @ApiModelProperty(value = "是否质检")
    private Boolean isQuality;
src/main/java/com/ruoyi/production/service/ProductProcessService.java
@@ -3,14 +3,10 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.device.pojo.DeviceRepair;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.production.dto.*;
import com.ruoyi.production.pojo.ProductProcess;
import com.ruoyi.production.pojo.SalesLedgerScheduling;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
@@ -20,9 +16,11 @@
public interface ProductProcessService extends IService<ProductProcess> {
    IPage<ProductProcessDto> listPage(Page page, ProductProcessDto productProcessDto);
    AjaxResult add(ProductProcessDto productProcessDto);
    void add(ProductProcessDto productProcessDto);
    AjaxResult importData(MultipartFile file);
    void update(ProductProcessDto productProcessDto);
    String batchDelete(List<Integer> ids);
    void importData(MultipartFile file);
    void batchDelete(List<Integer> ids);
}
src/main/java/com/ruoyi/production/service/impl/ProductProcessServiceImpl.java
@@ -5,10 +5,10 @@
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.ruoyi.basic.pojo.Customer;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.production.dto.ProductProcessDto;
import com.ruoyi.production.enums.ProductProcessEnum;
import com.ruoyi.production.mapper.ProcessRouteItemMapper;
import com.ruoyi.production.mapper.ProductProcessMapper;
import com.ruoyi.production.mapper.ProductProcessRouteItemMapper;
@@ -16,20 +16,26 @@
import com.ruoyi.production.pojo.ProductProcess;
import com.ruoyi.production.pojo.ProductProcessRouteItem;
import com.ruoyi.production.service.ProductProcessService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
@Slf4j
@Service
public class ProductProcessServiceImpl extends ServiceImpl<ProductProcessMapper, ProductProcess> implements ProductProcessService {
    @Autowired
    private ProductProcessMapper productProcessMapper;
    @Autowired
    private ProcessRouteItemMapper processRouteItemMapper;
    @Autowired
    private ProductProcessRouteItemMapper productProcessRouteItemMapper;
@@ -39,54 +45,110 @@
    }
    @Override
    public AjaxResult add(ProductProcessDto productProcessDto) {
        ProductProcess productProcess = new ProductProcess();
        BeanUtils.copyProperties(productProcessDto,productProcess);
        boolean save = productProcessMapper.insert(productProcess) > 0;
        if (save && ObjectUtils.isNull(productProcessDto.getNo())) {
            // æ ¹æ®id生成no字段:GX + 8位数字(不足8位前面补0)
            String no = "GX" + String.format("%08d", productProcess.getId());
            productProcess.setNo(no);
            productProcessMapper.updateById(productProcess);
            return AjaxResult.success();
    @Transactional(rollbackFor = Exception.class)
    public void add(ProductProcessDto productProcessDto) {
        if (ObjectUtils.isEmpty(productProcessDto.getName())) {
            throw new ServiceException("部件名称不能为空");
        }
        return AjaxResult.success();
        long count = this.count(Wrappers.<ProductProcess>lambdaQuery().eq(ProductProcess::getName, productProcessDto.getName()));
        if (count > 0) {
            throw new ServiceException("部件名称已存在,不能重复");
        }
        if (ObjectUtils.isNotEmpty(productProcessDto.getNo())) {
            long noCount = this.count(Wrappers.<ProductProcess>lambdaQuery().eq(ProductProcess::getNo, productProcessDto.getNo()));
            if (noCount > 0) {
                throw new ServiceException("工序编号已存在,不能重复");
            }
        }
        ProductProcess productProcess = new ProductProcess();
        BeanUtils.copyProperties(productProcessDto, productProcess);
        boolean save = productProcessMapper.insert(productProcess) > 0;
        if (save && ObjectUtils.isEmpty(productProcess.getNo())) {
            String no = "GX" + String.format("%08d", productProcess.getId());
            // æ³¨æ„ï¼šè¿™é‡Œç”±äºŽæ˜¯è‡ªåŠ¨ç”Ÿæˆçš„ ID è¡¥å…¨ï¼Œé€šå¸¸ä¸ä¼šé‡å¤ï¼Œä½†å»ºè®® set ä¹‹åŽæ›´æ–°
            productProcess.setNo(no);
            productProcessMapper.updateById(productProcess);
        }
    }
    @Override
    public AjaxResult importData(MultipartFile file) {
        try {
            ExcelUtil<ProductProcess> util = new ExcelUtil<ProductProcess>(ProductProcess.class);
            List<ProductProcess> productProcessList = util.importExcel(file.getInputStream());
            if(CollectionUtils.isEmpty(productProcessList)){
                return AjaxResult.warn("模板错误或导入数据为空");
    @Transactional(rollbackFor = Exception.class)
    public void update(ProductProcessDto productProcessDto) {
        if (ObjectUtils.isEmpty(productProcessDto.getName())) {
            throw new ServiceException("部件名称不能为空");
        }
        long nameCount = this.count(Wrappers.<ProductProcess>lambdaQuery()
                .eq(ProductProcess::getName, productProcessDto.getName())
                .ne(ProductProcess::getId, productProcessDto.getId()));
        if (nameCount > 0) {
            throw new ServiceException("部件名称已存在,不能重复");
        }
        if (ObjectUtils.isNotEmpty(productProcessDto.getNo())) {
            long noCount = this.count(Wrappers.<ProductProcess>lambdaQuery()
                    .eq(ProductProcess::getNo, productProcessDto.getNo())
                    .ne(ProductProcess::getId, productProcessDto.getId()));
            if (noCount > 0) {
                throw new ServiceException("工序编号已存在,不能重复");
            }
            productProcessList.forEach(productProcess -> {
        }
        ProductProcess productProcess = new ProductProcess();
        BeanUtils.copyProperties(productProcessDto, productProcess);
        this.updateById(productProcess);
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void importData(MultipartFile file) {
        try {
            ExcelUtil<ProductProcess> util = new ExcelUtil<>(ProductProcess.class);
            List<ProductProcess> productProcessList = util.importExcel(file.getInputStream());
            if (CollectionUtils.isEmpty(productProcessList)) {
                throw new ServiceException("模板错误或导入数据为空");
            }
            for (int i = 0; i < productProcessList.size(); i++) {
                ProductProcess productProcess = productProcessList.get(i);
                int rowNum = i + 2;
                if (ObjectUtils.isEmpty(productProcess)) {
                    throw new RuntimeException("使用模板进行导入");
                    throw new ServiceException("第" + rowNum + "行数据为空,请使用正确的模板进行导入");
                }
                if (ObjectUtils.isEmpty(productProcess.getName())) {
                    throw new RuntimeException("工序名称不能为空");
                    throw new ServiceException("第" + rowNum + "行:部件名称不能为空");
                }
            });
            this.saveOrUpdateBatch(productProcessList);
            return AjaxResult.success(true);
        }catch (Exception e){
            e.printStackTrace();
            return AjaxResult.error(e.getMessage());
                if (ObjectUtils.isEmpty(productProcess.getProductProcessType())) {
                    throw new ServiceException("第" + rowNum + "行:部件【" + productProcess.getName() + "】的类型不能为空");
                }
                ProductProcessEnum enumByInfo = ProductProcessEnum.getEnumByInfo(productProcess.getProductProcessType());
                if (ObjectUtils.isEmpty(enumByInfo)) {
                    throw new ServiceException("第" + rowNum + "行:部件【" + productProcess.getName() + "】的类型【" + productProcess.getProductProcessType() + "】不存在,请填写正确的类型:加工、刮板冷芯制作、管路组对、罐体连接及调试、测试打压、其他");
                }else {
                    productProcess.setType(enumByInfo.getCode());
                }
            }
            saveOrUpdateBatch(productProcessList);
        } catch (ServiceException e) {
            throw e;
        } catch (Exception e) {
            log.error("部件导入异常:{}", e.getMessage(), e);
            throw new ServiceException("部件导入异常:" + e.getMessage());
        }
    }
    @Override
    public String batchDelete(List<Integer> ids) {
        //查询是否生产中已经引用了这些工序
    @Transactional(rollbackFor = Exception.class)
    public void batchDelete(List<Integer> ids) {
        // æŸ¥è¯¢æ˜¯å¦ç”Ÿäº§ä¸­å·²ç»å¼•用了这些工序
        List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(Wrappers.<ProcessRouteItem>lambdaQuery().in(ProcessRouteItem::getProcessId, ids));
        List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().in(ProductProcessRouteItem::getProcessId, ids));
        if (!CollectionUtils.isEmpty(processRouteItems) || !CollectionUtils.isEmpty(productProcessRouteItems)){
            throw new RuntimeException("该工序已经被使用,无法删除");
        if (!CollectionUtils.isEmpty(processRouteItems) || !CollectionUtils.isEmpty(productProcessRouteItems)) {
            throw new ServiceException("该工序已经被使用,无法删除");
        }
        productProcessMapper.deleteBatchIds(ids);
        return null;
    }
}