已添加9个文件
已修改10个文件
918 ■■■■■ 文件已修改
doc/万通新型建材.sql 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/basic/enums/RecordTypeEnum.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/controller/ManufacturerController.java 149 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/dto/ManufacturerDto.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/enums/StockInventorySourceEnum.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/execl/ManufacturerExcelDto.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/mapper/ManufacturerMapper.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/pojo/Manufacturer.java 162 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/pojo/StockInRecord.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/pojo/StockInventory.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/pojo/StockUninventory.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/ManufacturerService.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/impl/ManufacturerServiceImpl.java 160 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/stock/ManufacturerMapper.xml 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/stock/StockInventoryMapper.xml 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/ÍòͨÐÂÐͽ¨²Ä.sql
@@ -1,3 +1,4 @@
## è¡¥è´´é…ç½®
drop table if exists subsidy_configuration;
create table subsidy_configuration
(
@@ -14,3 +15,38 @@
    add night_days decimal(16, 4) default 0 not null comment '夜班天数',
    add meal_amount decimal(16, 4) default 0 not null comment '餐补',
    add night_amount decimal(16, 4) default 0 not null comment '夜班补贴';
## ç”Ÿäº§åނ商
drop table if exists manufacturer;
create table manufacturer
(
    id                          bigint auto_increment
        primary key,
    name               varchar(255) not null default '' comment '厂商名称',
    taxpayer_identification_num varchar(128) not null default '' comment '纳税人识别号',
    company_address             varchar(255) not null default '' comment '厂商地址',
    type                        varchar(25) not null default '' comment '厂商类型',
    company_phone               varchar(64) not null default '' comment '厂商电话',
    bank_account_name           varchar(128) not null default '' comment '银行账户名称',
    bank_account_num            varchar(128) not null default '' comment '银行账户号码',
    contact_user_name           varchar(255) not null default '' comment '联系人姓名',
    contact_user_phone          varchar(128) not null default '' comment '联系人电话',
    maintain_user_id            bigint not null default 0 comment '维护人ID',
    maintain_time               datetime null comment '维护时间',
    create_time                 datetime null comment '创建时间',
    create_user                 bigint not null default 0 comment '创建人ID',
    update_time                 datetime null comment '更新时间',
    update_user                 bigint not null default 0 comment '更新人ID',
    tenant_id                   bigint not null default 0 comment '租户ID',
    is_white                    bigint not null default 0 comment '是否白名单'
);
alter table stock_inventory
    add manufacturer_id bigint not null default 0 comment '厂家id',
    add source varchar(255) not null default '' comment '来源';
alter table stock_in_record
    add manufacturer_id bigint not null default 0 comment '厂家id',
    add source varchar(255) not null default '' comment '来源';
alter table stock_uninventory
    add manufacturer_id bigint not null default 0 comment '厂家id',
    add source varchar(255) not null default '' comment '来源';
src/main/java/com/ruoyi/basic/enums/RecordTypeEnum.java
@@ -33,6 +33,7 @@
    STOCK_UNINVENTORY("stock_uninventory"),
    STOCK_INVENTORY("stock_inventory"),
    STOCK_IN_RECORD("stock_in_record"),
    MANUFACTURER("manufacturer"),
    // Staff
    STAFF_WORK_EXPERIENCE("staff_work_experience"),
    STAFF_SALARY_MAIN("staff_salary_main"),
src/main/java/com/ruoyi/stock/controller/ManufacturerController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,149 @@
package com.ruoyi.stock.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.stock.dto.ManufacturerDto;
import com.ruoyi.stock.execl.ManufacturerExcelDto;
import com.ruoyi.stock.pojo.Manufacturer;
import com.ruoyi.stock.service.ManufacturerService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.servlet.http.HttpServletResponse;
import lombok.AllArgsConstructor;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/**
 * <p>
 * åŽ‚å®¶å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-28 09:52:35
 */
@RestController
@RequestMapping("/stock/manufacturer")
@AllArgsConstructor
@Tag(name = "厂家管理")
public class ManufacturerController {
    private ManufacturerService manufacturerService;
    /**
     * åŽ‚å®¶æ–°å¢ž
     * @param manufacturer
     * @return
     */
    @PostMapping("/add")
    @Log(title = "厂家-新增", businessType = BusinessType.INSERT)
    @Operation(summary = "新增厂家")
    public R add(@RequestBody Manufacturer manufacturer) {
        manufacturerService.saveManufacturer(manufacturer);
        return R.ok();
    }
    /**
     * åŽ‚å®¶åˆ é™¤
     * @param ids
     * @return
     */
    @DeleteMapping("/del")
    @Log(title = "厂家-删除", businessType = BusinessType.DELETE)
    @Operation(summary = "删除厂家")
    public R delManufacturer(@RequestBody List<Long> ids) {
        if(CollectionUtils.isEmpty(ids)){
            return R.fail("请选择至少一条数据");
        }
        manufacturerService.delManufacturer(ids);
        return R.ok();
    }
    /**
     * åŽ‚å®¶è¯¦æƒ…
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    @Log(title = "厂家-详情", businessType = BusinessType.OTHER)
    @Operation(summary = "厂家详情")
    public R manufacturerDetail(@PathVariable("id") Long id) {
        return R.ok(manufacturerService.manufacturerDetail(id));
    }
    /**
     * åŽ‚å®¶ä¿®æ”¹
     * @param manufacturer
     * @return
     */
    @PostMapping("/update")
    @Log(title = "厂家-修改", businessType = BusinessType.UPDATE)
    @Operation(summary = "修改厂家")
    public R update(@RequestBody Manufacturer manufacturer) {
        manufacturerService.manufacturerUpdate(manufacturer);
        return R.ok();
    }
    /**
     * åŽ‚å®¶ç®¡ç†åˆ†é¡µæŸ¥è¯¢
     * @param page
     * @param manufacturerDto
     * @return
     */
    @GetMapping("/listPage")
    @Log(title = "厂家-分页查询", businessType = BusinessType.OTHER)
    @Operation(summary = "厂家分页查询")
    public R manufacturerListPage(Page page, ManufacturerDto manufacturerDto) {
        return R.ok(manufacturerService.manufacturerListPage(page, manufacturerDto));
    }
    /**
     * åŽ‚å®¶å¯¼å‡º
     * @param response
     * @param manufacturerDto
     */
    @PostMapping("/export")
    @Log(title = "厂家-导出", businessType = BusinessType.EXPORT)
    @Operation(summary = "厂家导出")
    public void manufacturerExport(HttpServletResponse response, ManufacturerDto manufacturerDto) {
        manufacturerService.manufacturerExport(response, manufacturerDto);
    }
    /**
     * ä¸‹è½½æ¨¡æ¿
     * @param response
     */
    @PostMapping("/downloadTemplate")
    @Log(title = "厂家-下载模板", businessType = BusinessType.EXPORT)
    @Operation(summary = "下载厂家模板")
    public void downloadTemplate(HttpServletResponse response) {
        ExcelUtil<ManufacturerExcelDto> util = new ExcelUtil<>(ManufacturerExcelDto.class);
        util.importTemplateExcel(response, "厂家档案模板");
    }
    /**
     * åނ家坼入
     */
    @PostMapping("/import")
    @Log(title = "厂家-导入", businessType = BusinessType.IMPORT)
    @Operation(summary = "导入厂家")
    public R importData(MultipartFile file) {
        return manufacturerService.importData(file);
    }
    /**
     * åŽ‚å®¶é€‰é¡¹æŽ¥å£
     * @return
     */
    @GetMapping("/getOptions")
    @Log(title = "厂家-选项接口", businessType = BusinessType.OTHER)
    @Operation(summary = "获取厂家选项")
    public R getOptions() {
        return R.ok(manufacturerService.list());
    }
}
src/main/java/com/ruoyi/stock/dto/ManufacturerDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,12 @@
package com.ruoyi.stock.dto;
import com.ruoyi.stock.pojo.Manufacturer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
public class ManufacturerDto extends Manufacturer {
    @Schema(description = "维护人员名称")
    private String maintainUserName;
}
src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
@@ -80,4 +80,16 @@
    @Schema(description = "产品id")
    private Long productId;
    @Schema(description = "合格库存来源")
    private String qualifiedSource;
    @Schema(description = "合格库存来源文本")
    private String qualifiedSourceText;
    @Schema(description = "不合格库存来源")
    private String unQualifiedSource;
    @Schema(description = "不合格库存来源文本")
       private String unQualifiedSourceText;
}
src/main/java/com/ruoyi/stock/enums/StockInventorySourceEnum.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,48 @@
package com.ruoyi.stock.enums;
import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.ruoyi.common.enums.BaseEnum;
import lombok.Getter;
import java.io.Serializable;
/**
 * @author buhuazhen
 * @date 2026/3/9
 * @email 3038525872@qq.com
 */
@Getter
public enum StockInventorySourceEnum implements BaseEnum<String>, Serializable {
    PURCHASE_RECEIPT("purchaseReceipt", "采购入库"),
    PRODUCTION_RECEIPT("productionReceipt", "生产入库"),
    OUTSOURCED_RECEIPT("outsourcedReceipt", "外协入库"),
    REPAIR_RECEIPT("repairReceipt", "修复入库"),
    PROD_GENERATED("prodGenerated", "生产产生"),
    TRANS_GENERATED("transGenerated", "运输产生"),
    CUTTING_GENERATED("cuttingGenerated", "裁剪产生"),
    CUSTOM("custom", "自定义");
    @EnumValue
    private final String code;
    private final String value;
    StockInventorySourceEnum(String code, String value) {
        this.code = code;
        this.value = value;
    }
    @JsonCreator
    public static StockInventorySourceEnum fromCode(String code) {
        if (code == null) {
            return null;
        }
        for (StockInventorySourceEnum e : StockInventorySourceEnum.values()) {
            if (e.getCode().equals(code)) {
                return e;
            }
        }
        return null;
    }
}
src/main/java/com/ruoyi/stock/execl/ManufacturerExcelDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.ruoyi.stock.execl;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import lombok.Data;
@Data
public class ManufacturerExcelDto {
    @Excel(name = "厂家名称")
    private String name;
    @Excel(name = "纳税人识别号")
    private String taxpayerIdentificationNum;
    @Excel(name = "公司地址")
    private String companyAddress;
    @Excel(name = "公司电话")
    private String companyPhone;
    @Excel(name = "开户行")
    private String bankAccountName;
    @Excel(name = "账号")
    private String bankAccountNum;
    @Excel(name = "联系人")
    private String contactUserName;
    @Excel(name = "联系电话")
    private String contactUserPhone;
    @Excel(name = "维护人")
    private String maintainUserName;
}
src/main/java/com/ruoyi/stock/mapper/ManufacturerMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.ruoyi.stock.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.dto.SupplierManageDto;
import com.ruoyi.basic.pojo.SupplierManage;
import com.ruoyi.stock.dto.ManufacturerDto;
import com.ruoyi.stock.execl.ManufacturerExcelDto;
import com.ruoyi.stock.pojo.Manufacturer;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
 * <p>
 *  Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-28 09:52:35
 */
@Mapper
public interface ManufacturerMapper extends BaseMapper<Manufacturer> {
    IPage<Manufacturer> manufacturerListPage(Page page, @Param("manufacturerDto") ManufacturerDto manufacturerDto);
    List<ManufacturerExcelDto> manufacturerExportList(@Param("manufacturerDto") ManufacturerDto manufacturerDto);
}
src/main/java/com/ruoyi/stock/pojo/Manufacturer.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,162 @@
package com.ruoyi.stock.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
 * <p>
 *
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-28 09:52:35
 */
@Getter
@Setter
@ToString
@TableName("manufacturer")
@ApiModel(value = "Manufacturer对象", description = "")
public class Manufacturer implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * åŽ‚å®¶åç§°
     */
    @ApiModelProperty("厂家名称")
    @Excel(name = "厂家名称")
    private String name;
    /**
     * çº³ç¨Žäººè¯†åˆ«å·
     */
    @ApiModelProperty("纳税人识别号")
    @Excel(name = "纳税人识别号")
    private String taxpayerIdentificationNum;
    /**
     * åŽ‚å®¶åœ°å€
     */
    @ApiModelProperty("厂家地址")
    @Excel(name = "公司地址")
    private String companyAddress;
    /**
     * åŽ‚å®¶ç±»åž‹
     */
    @ApiModelProperty("厂家类型")
    private String type;
    /**
     * åŽ‚å®¶ç”µè¯
     */
    @ApiModelProperty("公司电话")
    @Excel(name = "公司电话")
    private String companyPhone;
    /**
     * é“¶è¡Œè´¦æˆ·åç§°
     */
    @ApiModelProperty("银行账户名称")
    @Excel(name = "开户行")
    private String bankAccountName;
    /**
     * é“¶è¡Œè´¦æˆ·å·ç 
     */
    @ApiModelProperty("银行账户号码")
    @Excel(name = "账号")
    private String bankAccountNum;
    /**
     * è”系人姓名
     */
    @ApiModelProperty("联系人姓名")
    @Excel(name = "联系人")
    private String contactUserName;
    /**
     * è”系人电话
     */
    @ApiModelProperty("联系人电话")
    @Excel(name = "联系电话")
    private String contactUserPhone;
    /**
     * ç»´æŠ¤äººID
     */
    @ApiModelProperty("维护人ID")
    @Excel(name = "维护人")
    private Long maintainUserId;
    /**
     * ç»´æŠ¤æ—¶é—´
     */
    @ApiModelProperty("维护时间")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate maintainTime;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    /**
     * åˆ›å»ºäººID
     */
    @ApiModelProperty("创建人ID")
    @TableField(fill = FieldFill.INSERT)
    private Long createUser;
    /**
     * æ›´æ–°æ—¶é—´
     */
    @ApiModelProperty("更新时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    /**
     * æ›´æ–°äººID
     */
    @ApiModelProperty("更新人ID")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;
    /**
     * ç§Ÿæˆ·ID
     */
    @ApiModelProperty("租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    /**
     * æ˜¯å¦ç™½åå•
     */
    @ApiModelProperty("是否白名单")
    @Excel(name = "是否白名单")
    private Long isWhite;
}
src/main/java/com/ruoyi/stock/pojo/StockInRecord.java
@@ -73,4 +73,10 @@
    @TableField(fill = FieldFill.INSERT)
    private Long deptId;
    @Schema(description = "厂家ID")
    private Long manufacturerId;
    @Schema(description = "来源")
    private String source;
}
src/main/java/com/ruoyi/stock/pojo/StockInventory.java
@@ -72,4 +72,9 @@
    @TableField(fill = FieldFill.INSERT)
    private Long deptId;
    @Schema(description = "厂商id")
    private Long manufacturerId;
    @Schema(description = "来源")
    private String source;
}
src/main/java/com/ruoyi/stock/pojo/StockUninventory.java
@@ -68,4 +68,9 @@
    @TableField(fill = FieldFill.INSERT)
    private Long deptId;
    @Schema(description = "厂家ID")
    private Long manufacturerId;
    @Schema(description = "来源")
    private String source;
}
src/main/java/com/ruoyi/stock/service/ManufacturerService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,73 @@
package com.ruoyi.stock.service;
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.framework.web.domain.AjaxResult;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.stock.dto.ManufacturerDto;
import com.ruoyi.stock.pojo.Manufacturer;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
/**
 * <p>
 * åŽ‚å•†æœåŠ¡æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-28 09:52:35
 */
public interface ManufacturerService extends IService<Manufacturer> {
    /**
     * åŽ‚å•†æ–°å¢ž
     * @param manufacturer
     */
    void saveManufacturer(Manufacturer manufacturer);
    /**
     * åŽ‚å•†åˆ é™¤
     * @param ids
     * @return
     */
    int delManufacturer(List<Long> ids);
    /**
     * åŽ‚å•†è¯¦æƒ…
     * @param id
     * @return
     */
    Manufacturer manufacturerDetail(Long id);
    /**
     * åŽ‚å•†ä¿®æ”¹
     * @param manufacturer
     * @return
     */
    int manufacturerUpdate(Manufacturer manufacturer);
    /**
     * åŽ‚å•†åˆ†é¡µæŸ¥è¯¢
     * @param page
     * @param manufacturerDto
     * @return
     */
    IPage<Manufacturer> manufacturerListPage(Page page, ManufacturerDto manufacturerDto);
    /**
     * åŽ‚å•†å¯¼å‡º
     * @param response
     * @param manufacturerDto
     */
    void manufacturerExport(HttpServletResponse response, ManufacturerDto manufacturerDto);
    /**
     * åނ商坼入
     * @param file
     * @return
     */
    R importData(MultipartFile file);
}
src/main/java/com/ruoyi/stock/service/impl/ManufacturerServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,160 @@
package com.ruoyi.stock.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
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.excel.SupplierManageExcelDto;
import com.ruoyi.basic.pojo.SupplierManage;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.stock.dto.ManufacturerDto;
import com.ruoyi.stock.execl.ManufacturerExcelDto;
import com.ruoyi.stock.mapper.ManufacturerMapper;
import com.ruoyi.stock.mapper.StockInventoryMapper;
import com.ruoyi.stock.pojo.Manufacturer;
import com.ruoyi.stock.pojo.StockInventory;
import com.ruoyi.stock.service.ManufacturerService;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
/**
 * <p>
 * åŽ‚å•†æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-05-28 09:52:35
 */
@Service
@RequiredArgsConstructor
public class ManufacturerServiceImpl extends ServiceImpl<ManufacturerMapper, Manufacturer> implements ManufacturerService {
    private final StockInventoryMapper stockInventoryMapper;
    private final ManufacturerMapper manufacturerMapper;
    private final SysUserMapper sysUserMapper;
    /**
     * åŽ‚å•†æ–°å¢ž
     */
    @Override
    @Transactional
    public void saveManufacturer(Manufacturer manufacturer) {
        LambdaQueryWrapper<Manufacturer> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Manufacturer::getName,manufacturer.getName());
        if (baseMapper.selectCount(queryWrapper) > 0) {
            throw new RuntimeException("厂家已存在");
        }
        baseMapper.insert(manufacturer);
    }
    /**
     * åŽ‚å•†åˆ é™¤
     */
    @Override
    @Transactional
    public int delManufacturer(List<Long> ids) {
        // æ‰¹é‡æ£€æŸ¥æ˜¯å¦å…³è”库存
        LambdaQueryWrapper<StockInventory> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.in(StockInventory::getManufacturerId, ids);
        List<StockInventory> inventoryList = stockInventoryMapper.selectList(queryWrapper);
        if (!inventoryList.isEmpty()) {
            throw new RuntimeException("厂商已关联库存,无法删除");
        }
        return baseMapper.deleteBatchIds(ids);
    }
    /**
     * åŽ‚å•†è¯¦æƒ…
     */
    @Override
    public Manufacturer manufacturerDetail(Long id) {
        return baseMapper.selectById(id);
    }
    /**
     * åŽ‚å•†ä¿®æ”¹
     */
    @Override
    @Transactional
    public int manufacturerUpdate(Manufacturer manufacturer) {
        return baseMapper.updateById(manufacturer);
    }
    /**
     * åŽ‚å•†åˆ†é¡µæŸ¥è¯¢
     */
    @Override
    public IPage<Manufacturer> manufacturerListPage(Page page, ManufacturerDto manufacturerDto) {
        return manufacturerMapper.manufacturerListPage(page,manufacturerDto);
    }
    /**
     * åŽ‚å•†å¯¼å‡º
     */
    @Override
    public void manufacturerExport(HttpServletResponse response, ManufacturerDto manufacturerDto) {
        List<ManufacturerExcelDto> list = manufacturerMapper.manufacturerExportList(manufacturerDto);
        ExcelUtil<ManufacturerExcelDto> util = new ExcelUtil<>(ManufacturerExcelDto.class);
        util.exportExcel(response, list, "厂家数据");
    }
    /**
     * åނ商坼入
     */
    @Override
    @Transactional
    public R importData(MultipartFile file) {
        try {
            ExcelUtil<ManufacturerExcelDto> util = new ExcelUtil<>(ManufacturerExcelDto.class);
            List<ManufacturerExcelDto> list = util.importExcel(file.getInputStream());
            ArrayList<Manufacturer> manufacturers = new ArrayList<>();
            list.stream().forEach(dto -> {
                Manufacturer manufacturer = new Manufacturer();
                BeanUtils.copyProperties(dto, manufacturer);
                manufacturer.setMaintainTime(LocalDate.now());
                // æ£€æŸ¥åŽ‚å®¶åç§°æ˜¯å¦é‡å¤
                LambdaQueryWrapper<Manufacturer> queryWrapper = new LambdaQueryWrapper<>();
                queryWrapper.eq(Manufacturer::getName, manufacturer.getName());
                if (baseMapper.selectCount(queryWrapper) > 0) {
                    throw new RuntimeException("厂家名称已存在: " + manufacturer.getName());
                }
                if (StringUtils.isEmpty(dto.getMaintainUserName())) {
                    manufacturer.setMaintainUserId(SecurityUtils.getLoginUser().getUser().getUserId());
                } else {
                    SysUser sysUser = sysUserMapper.selectOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getNickName, dto.getMaintainUserName()));
                    if (sysUser == null) {
                        throw new RuntimeException("维护人不存在: " + dto.getMaintainUserName());
                    }
                    manufacturer.setMaintainUserId(sysUser.getUserId());
                }
                manufacturers.add(manufacturer);
            });
            this.saveOrUpdateBatch(manufacturers);
            return R.ok("导入成功");
        } catch (Exception e) {
            log.error("导入失败", e);
            return R.fail("导入失败: " + e.getMessage());
        }
    }
}
src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
@@ -30,6 +30,7 @@
import com.ruoyi.stock.service.StockInRecordService;
import jakarta.servlet.http.HttpServletResponse;
import lombok.AllArgsConstructor;
import org.jspecify.annotations.NonNull;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
@@ -235,11 +236,7 @@
                if ("0".equals(stockInRecord.getType())) {
                    // åˆæ ¼å…¥åº“ -> å…ˆæŸ¥åº“存,存在则更新,不存在则新增
                    StockInventory stockInventory = getStockInventory(stockInRecord.getProductModelId(), stockInRecord.getBatchNo());
                    StockInventoryDto stockInventoryDto = new StockInventoryDto();
                    stockInventoryDto.setProductModelId(stockInRecord.getProductModelId());
                    stockInventoryDto.setBatchNo(stockInRecord.getBatchNo());
                    stockInventoryDto.setQualitity(stockInRecord.getStockInNum());
                    stockInventoryDto.setRemark(stockInRecord.getRemark());
                    StockInventoryDto stockInventoryDto = getStockInventoryDto(stockInRecord);
                    if (stockInventory == null) {
                        stockInventoryMapper.insert(new StockInventory() {{
                            setProductModelId(stockInRecord.getProductModelId());
@@ -247,6 +244,8 @@
                            setBatchNo(stockInRecord.getBatchNo());
                            setRemark(stockInRecord.getRemark());
                            setWarnNum(stockInRecord.getWarnNum());
                            setManufacturerId(stockInRecord.getManufacturerId());
                            setSource(stockInRecord.getSource());
                            setVersion(1);
                        }});
                    } else {
@@ -260,12 +259,16 @@
                    stockUninventoryDto.setBatchNo(stockInRecord.getBatchNo());
                    stockUninventoryDto.setQualitity(stockInRecord.getStockInNum());
                    stockUninventoryDto.setRemark(stockInRecord.getRemark());
                    stockUninventoryDto.setManufacturerId(stockInRecord.getManufacturerId());
                    stockUninventoryDto.setSource(stockInRecord.getSource());
                    if (stockUninventory == null) {
                        stockUninventoryMapper.insert(new StockUninventory() {{
                            setProductModelId(stockInRecord.getProductModelId());
                            setQualitity(stockInRecord.getStockInNum());
                            setBatchNo(stockInRecord.getBatchNo());
                            setRemark(stockInRecord.getRemark());
                            setManufacturerId(stockInRecord.getManufacturerId());
                            setSource(stockInRecord.getSource());
                            setVersion(1);
                        }});
                    } else {
@@ -277,6 +280,17 @@
        return ids.size();
    }
    private static @NonNull StockInventoryDto getStockInventoryDto(StockInRecord stockInRecord) {
        StockInventoryDto stockInventoryDto = new StockInventoryDto();
        stockInventoryDto.setProductModelId(stockInRecord.getProductModelId());
        stockInventoryDto.setBatchNo(stockInRecord.getBatchNo());
        stockInventoryDto.setQualitity(stockInRecord.getStockInNum());
        stockInventoryDto.setRemark(stockInRecord.getRemark());
        stockInventoryDto.setManufacturerId(stockInRecord.getManufacturerId());
        stockInventoryDto.setSource(stockInRecord.getSource());
        return stockInventoryDto;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int batchReAudit(List<Long> ids) {
src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -11,6 +11,7 @@
import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.stock.enums.StockInventorySourceEnum;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.web.domain.R;
@@ -68,7 +69,25 @@
    @Override
    public IPage<StockInventoryDto> pageListCombinedStockInventory(Page page, StockInventoryDto stockInventoryDto) {
        return stockInventoryMapper.pageListCombinedStockInventory(page, stockInventoryDto);
        IPage<StockInventoryDto> result = stockInventoryMapper.pageListCombinedStockInventory(page, stockInventoryDto);
        // è½¬æ¢æ¥æºç¼–码为来源名称
        for (StockInventoryDto dto : result.getRecords()) {
            // åˆæ ¼åº“存来源
            if (StringUtils.isNotBlank(dto.getQualifiedSource())) {
                StockInventorySourceEnum qualifiedSourceEnum = StockInventorySourceEnum.fromCode(dto.getQualifiedSource());
                if (qualifiedSourceEnum != null) {
                    dto.setQualifiedSourceText(qualifiedSourceEnum.getValue());
                }
            }
            // ä¸åˆæ ¼åº“存来源
            if (StringUtils.isNotBlank(dto.getUnQualifiedSource())) {
                StockInventorySourceEnum unQualifiedSourceEnum = StockInventorySourceEnum.fromCode(dto.getUnQualifiedSource());
                if (unQualifiedSourceEnum != null) {
                    dto.setUnQualifiedSourceText(unQualifiedSourceEnum.getValue());
                }
            }
        }
        return result;
    }
    //入库调用
@@ -169,6 +188,8 @@
        stockInRecordDto.setType("0");
        stockInRecordDto.setRemark(stockInventoryDto.getRemark());
        stockInRecordDto.setWarnNum(stockInventoryDto.getWarnNum());
        stockInRecordDto.setManufacturerId(stockInventoryDto.getManufacturerId());
        stockInRecordDto.setSource(stockInventoryDto.getSource());
        stockInRecordService.add(stockInRecordDto);
        return true;
    }
@@ -438,6 +459,29 @@
    @Override
    public IPage<StockInventoryDto> getBatchNoQty(Page page, StockInventoryDto stockInventoryDto) {
        return stockInventoryMapper.getBatchNoQty(page, stockInventoryDto);
        IPage<StockInventoryDto> resultPage = stockInventoryMapper.getBatchNoQty(page, stockInventoryDto);
        // éåŽ†ç»“æžœï¼Œè®¾ç½®æ¥æºä¸­æ–‡å
        resultPage.getRecords().forEach(dto -> {
            // è®¾ç½®åˆæ ¼åº“存来源中文名
            if (StringUtils.isNotEmpty(dto.getQualifiedSource())) {
                System.out.println("合格库存来源:" + dto.getQualifiedSource());
                StockInventorySourceEnum qualifiedSourceEnum = StockInventorySourceEnum.fromCode(dto.getQualifiedSource());
                if (qualifiedSourceEnum != null) {
                    dto.setQualifiedSourceText(qualifiedSourceEnum.getValue());
                    System.out.println("合格库存来源值:" + qualifiedSourceEnum.getValue());
                }
            }
            // è®¾ç½®ä¸åˆæ ¼åº“存来源中文名
            if (StringUtils.isNotEmpty(dto.getUnQualifiedSource())) {
                StockInventorySourceEnum unQualifiedSourceEnum = StockInventorySourceEnum.fromCode(dto.getUnQualifiedSource());
                if (unQualifiedSourceEnum != null) {
                    dto.setUnQualifiedSourceText(unQualifiedSourceEnum.getValue());
                }
            }
        });
        return resultPage;
    }
}
src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java
@@ -79,6 +79,8 @@
        stockInRecordDto.setBatchNo(stockUninventoryDto.getBatchNo());
        stockInRecordDto.setProductModelId(stockUninventoryDto.getProductModelId());
        stockInRecordDto.setType("1");
        stockInRecordDto.setManufacturerId(stockUninventoryDto.getManufacturerId());
        stockInRecordDto.setSource(stockUninventoryDto.getSource());
        stockInRecordService.add(stockInRecordDto);
        //审批再添加
        return 1;
src/main/resources/mapper/stock/ManufacturerMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,93 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.stock.mapper.ManufacturerMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.stock.pojo.Manufacturer">
        <id column="id" property="id" />
        <result column="name" property="name" />
        <result column="taxpayer_identification_num" property="taxpayerIdentificationNum" />
        <result column="company_address" property="companyAddress" />
        <result column="type" property="type" />
        <result column="company_phone" property="companyPhone" />
        <result column="bank_account_name" property="bankAccountName" />
        <result column="bank_account_num" property="bankAccountNum" />
        <result column="contact_user_name" property="contactUserName" />
        <result column="contact_user_phone" property="contactUserPhone" />
        <result column="maintain_user_id" property="maintainUserId" />
        <result column="maintain_time" property="maintainTime" />
        <result column="create_time" property="createTime" />
        <result column="create_user" property="createUser" />
        <result column="update_time" property="updateTime" />
        <result column="update_user" property="updateUser" />
        <result column="tenant_id" property="tenantId" />
        <result column="is_white" property="isWhite" />
    </resultMap>
    <select id="manufacturerListPage" resultType="com.ruoyi.stock.dto.ManufacturerDto">
        SELECT
        T1.id,
        T1.name,
        T1.taxpayer_identification_num,
        T1.company_address,
        T1.company_phone,
        T1.bank_account_name,
        T1.bank_account_num,
        T1.contact_user_name,
        T1.contact_user_phone,
        T1.maintain_user_id,
        T1.maintain_time,
        T1.create_time,
        T1.create_user,
        T1.update_time,
        T1.update_user,
        T1.tenant_id,
        T1.is_white,
        T2.nick_name AS maintainUserName,
        T1.type
        FROM manufacturer T1
        LEFT JOIN sys_user T2 ON T1.maintain_user_id = T2.user_id
        <where>
            <if test="manufacturerDto.name != null and manufacturerDto.name != '' ">
                AND T1.name LIKE CONCAT('%',#{manufacturerDto.name},'%')
            </if>
            <if test="manufacturerDto.isWhite != null">
                AND T1.is_white = #{manufacturerDto.isWhite}
            </if>
        </where>
        order by T1.create_time desc
    </select>
    <select id="manufacturerExportList" resultType="com.ruoyi.stock.execl.ManufacturerExcelDto">
        SELECT
        T1.id,
        T1.name,
        T1.type,
        T1.taxpayer_identification_num,
        T1.company_address,
        T1.company_phone,
        T1.bank_account_name,
        T1.bank_account_num,
        T1.contact_user_name,
        T1.contact_user_phone,
        T1.maintain_user_id,
        T1.maintain_time,
        T1.create_time,
        T1.create_user,
        T1.update_time,
        T1.update_user,
        T1.tenant_id,
        T1.is_white,
        T2.nick_name AS maintainUserName
        FROM manufacturer T1
        LEFT JOIN sys_user T2 ON T1.maintain_user_id = T2.user_id
        <where>
            <if test="manufacturerDto.name != null and manufacturerDto.name != '' ">
                AND T1.name LIKE CONCAT('%',#{manufacturerDto.name},'%')
            </if>
            <if test="manufacturerDto.isWhite != null">
                AND T1.is_white = #{manufacturerDto.isWhite}
            </if>
        </where>
    </select>
</mapper>
src/main/resources/mapper/stock/StockInventoryMapper.xml
@@ -562,6 +562,10 @@
        unit,
        product_name,
        product_id,
        MAX(manufacturer_id) as manufacturer_id,
        MAX(manufacturer_name) as manufacturerName,
        MAX(qualifiedSource) as qualifiedSource,
        MAX(unQualifiedSource) as unQualifiedSource,
        MAX(create_time) as create_time,
        MAX(update_time) as update_time,
@@ -587,6 +591,10 @@
        pm.unit,
        p.product_name,
        p.id as product_id,
        si.manufacturer_id,
        m.name as manufacturer_name,
        si.source as qualifiedSource,
        null as unQualifiedSource,
        si.create_time,
        si.update_time,
@@ -610,6 +618,7 @@
        from stock_inventory si
        left join product_model pm on si.product_model_id = pm.id
        left join product p on pm.product_id = p.id
        left join manufacturer m on si.manufacturer_id = m.id
        union all
@@ -629,6 +638,10 @@
        pm.unit,
        p.product_name,
        p.id as product_id,
        su.manufacturer_id,
        m.name as manufacturer_name,
        null as qualifiedSource,
        su.source as unQualifiedSource,
        su.create_time,
        su.update_time,
@@ -652,6 +665,7 @@
        from stock_uninventory su
        left join product_model pm on su.product_model_id = pm.id
        left join product p on pm.product_id = p.id
        left join manufacturer m on su.manufacturer_id = m.id
        ) as combined
        <where>
            <if test="ew.productModelId != null and ew.productModelId > 0">
@@ -668,7 +682,9 @@
        model,
        unit,
        product_name,
        product_id
        product_id,
        manufacturer_id,
        manufacturer_name
        order by
        batch_no
    </select>