liding
4 天以前 0047f8ce5986c577e6b887403dd24ea884c9ce4b
入库前需审批,审批后入库(消息通知)
已修改17个文件
418 ■■■■ 文件已修改
src/main/java/com/ruoyi/approve/pojo/ApproveNode.java 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/controller/StockInRecordController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/mapper/StockInRecordMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/pojo/StockInRecord.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/StockInRecordService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/StockInventoryService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/StockUninventoryService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java 103 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java 74 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/stock/StockInRecordMapper.xml 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/pojo/ApproveNode.java
@@ -1,18 +1,16 @@
package com.ruoyi.approve.pojo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.sales.pojo.CommonFile;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * 审批节点表
@@ -21,8 +19,9 @@
@Data
@TableName("approve_node")
@ApiModel
public class ApproveNode{
public class ApproveNode implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty("附件id")
    @TableField(exist = false)
@@ -125,7 +124,24 @@
     */
    private String approveNodeRemark;
    private static final long serialVersionUID = 1L;
    /**
     * 入库id
     */
    @TableField(exist = false)
    private Long recordId;
    /**
     * 是否入库审核通过
     */
    @ApiModelProperty(value = "是否入库审核通过")
    @TableField(exist = false)
    private boolean inventoryReview;
    /**
     * 入库类型(合格/不合格)
     */
    @ApiModelProperty(value = "入库类型")
    @TableField(exist = false)
    private String storageType;
}
src/main/java/com/ruoyi/approve/pojo/ApproveProcess.java
@@ -1,12 +1,9 @@
package com.ruoyi.approve.pojo;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
import com.baomidou.mybatisplus.annotation.*;
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 com.ruoyi.sales.pojo.CommonFile;
@@ -14,6 +11,11 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
import java.util.List;
/**
 * 审批流程表
@@ -127,7 +129,7 @@
    private Long tenantId;
    /**
     * 审批类型 1-公出管理 2-请假管理 3-出差管理 4-报销管理 5-采购审批 6-报价审批 7-发货审批 8-危险作业审批
     * 审批类型 1-公出管理 2-请假管理 3-出差管理 4-报销管理 5-采购审批 6-报价审批 7-发货审批 8-危险作业审批 9-入库审批
     */
    private Integer approveType;
@@ -170,5 +172,20 @@
    private BigDecimal maintenancePrice;
    private static final long serialVersionUID = 1L;
    /**
     * 是否入库审核通过
     */
    @ApiModelProperty(value = "是否入库审核通过")
    private boolean inventoryReview;
    /**
     * 入库类型(合格/不合格)
     */
    @ApiModelProperty(value = "入库类型")
    private String storageType;
    /**
     * 入库id
     */
    private Long recordId;
}
src/main/java/com/ruoyi/approve/service/impl/ApproveNodeServiceImpl.java
@@ -13,7 +13,6 @@
import com.ruoyi.approve.service.IApproveNodeService;
import com.ruoyi.common.enums.FileNameType;
import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.device.mapper.DeviceRepairMapper;
import com.ruoyi.device.pojo.DeviceRepair;
@@ -25,12 +24,19 @@
import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
import com.ruoyi.purchase.pojo.PurchaseLedger;
import com.ruoyi.purchase.service.impl.PurchaseLedgerServiceImpl;
import com.ruoyi.sales.mapper.*;
import com.ruoyi.sales.mapper.CommonFileMapper;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
import com.ruoyi.sales.mapper.SalesQuotationMapper;
import com.ruoyi.sales.mapper.ShippingInfoMapper;
import com.ruoyi.sales.pojo.CommonFile;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import com.ruoyi.sales.pojo.SalesQuotation;
import com.ruoyi.sales.pojo.ShippingInfo;
import com.ruoyi.sales.service.impl.CommonFileServiceImpl;
import com.ruoyi.stock.pojo.StockInRecord;
import com.ruoyi.stock.service.StockInRecordService;
import com.ruoyi.stock.service.StockInventoryService;
import com.ruoyi.stock.service.StockUninventoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@@ -81,6 +87,13 @@
    @Autowired
    private PurchaseLedgerServiceImpl purchaseLedgerServiceImpl;
    @Autowired
    private StockUninventoryService stockUninventoryService;
    @Autowired
    private StockInRecordService stockInRecordService;
    @Autowired
    private StockInventoryService stockInventoryService;
    public ApproveProcess getApproveById(String id) {
@@ -274,6 +287,27 @@
                                approveProcess.getApproveId() + "流程编号的审批需要您审核!!!!!",
                                Arrays.asList(Long.valueOf(id)),
                                "/safeProduction/safeWorkApproval?approveType=" + approveProcess.getApproveType() + "&approveId=" + approveProcess.getApproveId());
                    } else if (approveProcess.getApproveType() == 9) {
                        StockInRecord stockInRecord = stockInRecordService.getById(approveNode.getRecordId());
                        if (approveNode.isInventoryReview()) {
                            if ("不合格入库".equals(approveNode.getStorageType())) {
                                stockUninventoryService.updateOrCreateStockUninventory(stockInRecord);
                            } else if ("合格入库".equals(approveNode.getStorageType())) {
                                stockInventoryService.updateOrCreateStockInventory(stockInRecord);
                            }
                            stockInRecord.setApproveStatus(2);
                            stockInRecordService.updateById(stockInRecord);
                            sysNoticeService.simpleNoticeByUser(
                                    approveProcessType(approveProcess.getApproveType()),
                                    approveProcess.getApproveId() + "流程编号的审批需要您审核!!!!!",
                                    Arrays.asList(Long.valueOf(id)),
                                    "/collaborativeApproval/approvalProcess?approveType=" + approveProcess.getApproveType()
                                            + "&approveId=" + approveProcess.getApproveId()
                            );
                        }else {
                            stockInRecord.setApproveStatus(3);
                            stockInRecordService.updateById(stockInRecord);
                        }
                    }else {
                        sysNoticeService.simpleNoticeByUser(approveProcessType(approveProcess.getApproveType()),
                                approveProcess.getApproveId() + "流程编号的审批需要您审核!!!!!",
@@ -325,6 +359,8 @@
                return "发货审批";
            case 8:
                return "危险作业审批";
            case 9:
                return "入库审批";
        }
        return null;
    }
src/main/java/com/ruoyi/approve/service/impl/ApproveProcessServiceImpl.java
@@ -16,8 +16,6 @@
import com.ruoyi.approve.vo.ApproveGetAndUpdateVo;
import com.ruoyi.approve.vo.ApproveProcessVO;
import com.ruoyi.common.enums.FileNameType;
import com.ruoyi.common.utils.OrderUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.other.service.impl.TempFileServiceImpl;
import com.ruoyi.project.system.domain.SysDept;
import com.ruoyi.project.system.domain.SysNotice;
@@ -32,25 +30,20 @@
import com.ruoyi.sales.pojo.CommonFile;
import com.ruoyi.sales.pojo.ShippingInfo;
import com.ruoyi.sales.service.impl.CommonFileServiceImpl;
import lombok.AllArgsConstructor;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@@ -125,6 +118,10 @@
                .collect(Collectors.toList())
                .get(0)
                .getNickName());
        approveProcess.setStorageType(approveProcessVO.getStorageType());
        approveProcess.setInventoryReview(approveProcessVO.isInventoryReview());
        approveProcess.setInventoryReview(approveProcessVO.isInventoryReview());
        approveProcess.setRecordId(approveProcessVO.getRecordId());
        // 设置状态为重新提交
        if (approveProcessVO.getId() != null) {
            ApproveProcess approveProcess1 = approveProcessMapper.selectById(approveProcessVO.getId());
@@ -441,6 +438,8 @@
                return "发货审批";
            case 8:
                return "危险作业审批";
            case 9:
                return "入库审批";
        }
        return null;
    }
src/main/java/com/ruoyi/approve/vo/ApproveProcessVO.java
@@ -2,12 +2,10 @@
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import com.ruoyi.sales.pojo.CommonFile;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import javax.validation.constraints.NotBlank;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
@@ -75,4 +73,21 @@
     * 报修金额
     */
    private BigDecimal maintenancePrice;
    /**
     * 是否入库审核通过
     */
    @ApiModelProperty(value = "是否入库审核通过")
    private boolean inventoryReview;
    /**
     * 入库类型(合格/不合格)
     */
    @ApiModelProperty(value = "入库类型")
    private String storageType;
    /**
     * 入库id
     */
    @ApiModelProperty(value = "入库id")
    private Long recordId;
}
src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
@@ -4,7 +4,6 @@
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
import com.ruoyi.stock.dto.StockInRecordDto;
import com.ruoyi.stock.dto.StockInventoryDto;
import com.ruoyi.stock.dto.StockUninventoryDto;
import com.ruoyi.stock.pojo.StockInRecord;
@@ -13,15 +12,11 @@
import com.ruoyi.stock.service.StockInventoryService;
import com.ruoyi.stock.service.StockOutRecordService;
import com.ruoyi.stock.service.StockUninventoryService;
import com.ruoyi.stock.service.impl.StockInRecordServiceImpl;
import com.ruoyi.stock.service.impl.StockOutRecordServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
@Component
@RequiredArgsConstructor
src/main/java/com/ruoyi/quality/service/impl/QualityInspectServiceImpl.java
@@ -9,7 +9,6 @@
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.config.Configure;
import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
import com.ruoyi.common.utils.HackLoopTableRenderPolicy;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.procurementrecord.service.ProcurementRecordService;
src/main/java/com/ruoyi/stock/controller/StockInRecordController.java
@@ -5,6 +5,7 @@
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.stock.dto.StockInRecordDto;
import com.ruoyi.stock.service.StockInRecordService;
import io.swagger.annotations.Api;
@@ -32,6 +33,25 @@
    }
    @GetMapping("/getById")
    @ApiOperation(value = "根据ID查询入库记录")
    public AjaxResult getById(@RequestParam("id") Long id) {
        if (id == null || id <= 0) {
            return AjaxResult.error("参数id不能为空");
        }
        StockInRecordDto stockInRecordDto = stockInRecordService.selectByRecord(id);
        if (stockInRecordDto == null) {
            return AjaxResult.error("记录不存在");
        }
        return AjaxResult.success(stockInRecordDto);
    }
    @PostMapping("/updateStockInRecord")
    @ApiOperation("入库记录审核")
    public R updateStockInRecord(@RequestBody StockInRecordDto stockInRecordDto) {
        return R.ok(stockInRecordService.updateStockInRecord(stockInRecordDto));
    }
    @DeleteMapping("")
    @Log(title = "入库管理-删除入库", businessType = BusinessType.DELETE)
src/main/java/com/ruoyi/stock/mapper/StockInRecordMapper.java
@@ -14,4 +14,6 @@
    IPage<StockInRecordDto> listPage(Page page, @Param("params") StockInRecordDto stockInRecordDto);
    List<StockInRecordExportData> listStockInRecordExportData(@Param("params") StockInRecordDto stockInRecordDto);
    StockInRecordDto selectByRecord(@Param("id")Long id);
}
src/main/java/com/ruoyi/stock/pojo/StockInRecord.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.annotation.*;
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.Data;
@@ -62,4 +63,16 @@
    @ApiModelProperty(value = "修改用户")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty("被订单锁定数量")
    private BigDecimal lockedQuantity;
    @ApiModelProperty("预警数量")
    private BigDecimal warnNum;
    /**
     * 审批状态:0待审核,1审核中,2审核完成 3审核未通过 4已重新提交
     */
    @ApiModelProperty(value = "审批状态:0待审核,1审核中,2审核完成 3审核未通过 4已重新提交")
    @Excel(name = "审批状态", readConverterExp = "0=待审核,1=审核中,2=审核完成,3=审核未通过,4=已重新提交")
    private Integer approveStatus;
}
src/main/java/com/ruoyi/stock/service/StockInRecordService.java
@@ -19,4 +19,8 @@
    int batchDelete(List<Long> ids);
    void exportStockInRecord(HttpServletResponse response, StockInRecordDto stockInRecordDto);
    StockInRecordDto selectByRecord(Long id);
    int updateStockInRecord(StockInRecordDto stockInRecordDto);
}
src/main/java/com/ruoyi/stock/service/StockInventoryService.java
@@ -3,9 +3,11 @@
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.security.LoginUser;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.stock.dto.StockInRecordDto;
import com.ruoyi.stock.dto.StockInventoryDto;
import com.ruoyi.stock.pojo.StockInRecord;
import com.ruoyi.stock.pojo.StockInventory;
import org.springframework.web.multipart.MultipartFile;
@@ -38,4 +40,8 @@
    Boolean frozenStock(StockInventoryDto stockInventoryDto);
    Boolean thawStock(StockInventoryDto stockInventoryDto);
    void updateOrCreateStockInventory(StockInRecord stockInRecord);
    void addApproveByPurchase(LoginUser loginUser, StockInRecordDto stockInRecordDto) throws Exception;
}
src/main/java/com/ruoyi/stock/service/StockUninventoryService.java
@@ -5,6 +5,7 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.stock.dto.StockInventoryDto;
import com.ruoyi.stock.dto.StockUninventoryDto;
import com.ruoyi.stock.pojo.StockInRecord;
import com.ruoyi.stock.pojo.StockUninventory;
import javax.servlet.http.HttpServletResponse;
@@ -30,4 +31,6 @@
    Boolean frozenStock(StockInventoryDto stockInventoryDto);
    Boolean thawStock(StockInventoryDto stockInventoryDto);
    void updateOrCreateStockUninventory(StockInRecord stockInRecord);
}
src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
@@ -4,13 +4,15 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.EnumUtil;
import com.ruoyi.common.utils.OrderUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.security.LoginUser;
import com.ruoyi.stock.dto.StockInRecordDto;
import com.ruoyi.stock.dto.StockInventoryDto;
import com.ruoyi.stock.dto.StockUninventoryDto;
@@ -22,7 +24,8 @@
import com.ruoyi.stock.pojo.StockInventory;
import com.ruoyi.stock.pojo.StockUninventory;
import com.ruoyi.stock.service.StockInRecordService;
import lombok.AllArgsConstructor;
import com.ruoyi.stock.service.StockInventoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -30,12 +33,16 @@
import java.util.List;
@Service
@AllArgsConstructor
public class StockInRecordServiceImpl extends ServiceImpl<StockInRecordMapper, StockInRecord> implements StockInRecordService {
    @Autowired
    private StockInRecordMapper stockInRecordMapper;
    @Autowired
    private StockInventoryMapper stockInventoryMapper;
    @Autowired
    private StockUninventoryMapper stockUninventoryMapper;
    @Autowired
    private StockInventoryService stockInventoryService;
    @Override
    public IPage<StockInRecordDto> listPage(Page page, StockInRecordDto stockInRecordDto) {
@@ -110,4 +117,21 @@
        ExcelUtil<StockInRecordExportData> util = new ExcelUtil<>(StockInRecordExportData.class);
        util.exportExcel(response,list, "入库记录信息");
    }
    @Override
    public StockInRecordDto selectByRecord(Long id) {
        return stockInRecordMapper.selectByRecord(id);
    }
    @Override
    public int updateStockInRecord(StockInRecordDto stockInRecordDto) {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        try {
            stockInventoryService.addApproveByPurchase(loginUser, stockInRecordDto);
        } catch (Exception e) {
            e.printStackTrace();
        }
        stockInRecordDto.setApproveStatus(2);
        return stockInRecordMapper.updateById(stockInRecordDto);
    }
}
src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -1,13 +1,17 @@
package com.ruoyi.stock.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl;
import com.ruoyi.approve.vo.ApproveProcessVO;
import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.security.LoginUser;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
@@ -16,18 +20,21 @@
import com.ruoyi.stock.dto.StockOutRecordDto;
import com.ruoyi.stock.execl.StockInventoryExportData;
import com.ruoyi.stock.mapper.StockInventoryMapper;
import com.ruoyi.stock.pojo.StockInRecord;
import com.ruoyi.stock.pojo.StockInventory;
import com.ruoyi.stock.service.StockInRecordService;
import com.ruoyi.stock.service.StockInventoryService;
import com.ruoyi.stock.service.StockOutRecordService;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
@@ -39,19 +46,25 @@
 * @since 2026-01-21 04:16:36
 */
@Service
@AllArgsConstructor
public class StockInventoryServiceImpl extends ServiceImpl<StockInventoryMapper, StockInventory> implements StockInventoryService {
    @Autowired
    private  StockInventoryMapper stockInventoryMapper;
    @Autowired
    private StockInRecordService stockInRecordService;
    @Autowired
    private StockOutRecordService stockOutRecordService;
    @Autowired
    private SalesLedgerProductMapper salesLedgerProductMapper;
    @Autowired
    private ApproveProcessServiceImpl approveProcessService;
    @Override
    public IPage<StockInventoryDto> pagestockInventory(Page page, StockInventoryDto stockInventoryDto) {
        return stockInventoryMapper.pagestockInventory(page, stockInventoryDto);
    }
    //入库调用
    //入库调用-添加入库记录
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean addstockInventory(StockInventoryDto stockInventoryDto) {
@@ -61,26 +74,78 @@
        stockInRecordDto.setRecordType(stockInventoryDto.getRecordType());
        stockInRecordDto.setStockInNum(stockInventoryDto.getQualitity());
        stockInRecordDto.setProductModelId(stockInventoryDto.getProductModelId());
        stockInRecordDto.setRemark(stockInventoryDto.getRemark());
        stockInRecordDto.setWarnNum(stockInventoryDto.getWarnNum());
        stockInRecordDto.setLockedQuantity(stockInventoryDto.getLockedQuantity());
        stockInRecordDto.setType("0");
        stockInRecordService.add(stockInRecordDto);
        //再进行新增库存数量库存
        //先查询库存表中的产品是否存在,不存在新增,存在更新
        StockInventory oldStockInventory = stockInventoryMapper.selectOne(new QueryWrapper<StockInventory>().lambda().eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId()));
        if (ObjectUtils.isEmpty(oldStockInventory)) {
            StockInventory newStockInventory = new StockInventory();
            newStockInventory.setProductModelId(stockInventoryDto.getProductModelId());
            newStockInventory.setQualitity(stockInventoryDto.getQualitity());
            newStockInventory.setVersion(1);
            newStockInventory.setRemark(stockInventoryDto.getRemark());
            newStockInventory.setLockedQuantity(stockInventoryDto.getLockedQuantity());
            newStockInventory.setWarnNum(stockInventoryDto.getWarnNum());
            stockInventoryMapper.insert(newStockInventory);
        }else {
             stockInventoryMapper.updateAddStockInventory(stockInventoryDto);
        int add = stockInRecordService.add(stockInRecordDto);
        LoginUser loginUser = SecurityUtils.getLoginUser();
        if (add > 0) {
            try {
                addApproveByPurchase(loginUser, stockInRecordDto);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return true;
    }
    public void addApproveByPurchase(LoginUser loginUser, StockInRecordDto stockInRecordDto) throws Exception {
        ApproveProcessVO approveProcessVO = new ApproveProcessVO();
        approveProcessVO.setApproveType(9);
        approveProcessVO.setApproveDeptId(loginUser.getCurrentDeptId());
        approveProcessVO.setApproveReason(stockInRecordDto.getInboundBatches());
        approveProcessVO.setApproveUserIds(String.valueOf(1));
        approveProcessVO.setApproveUser(loginUser.getUserId());
        approveProcessVO.setApproveTime(LocalDate.now().toString());
        approveProcessVO.setInventoryReview(false);
        approveProcessVO.setStorageType("合格入库");
        approveProcessVO.setRecordId(stockInRecordDto.getId());
        approveProcessService.addApprove(approveProcessVO);
    }
    /**
     * 实际入库
     *
     * @param stockInRecord
     */
    public void updateOrCreateStockInventory(StockInRecord stockInRecord) {
        // 先查询库存表中的产品是否存在
        StockInventory oldStockInventory = stockInventoryMapper.selectOne(
                new QueryWrapper<StockInventory>().lambda()
                        .eq(StockInventory::getProductModelId, stockInRecord.getProductModelId())
        );
        if (ObjectUtils.isEmpty(oldStockInventory)) {
            // 不存在则新增
            StockInventory newStockInventory = new StockInventory();
            newStockInventory.setProductModelId(stockInRecord.getProductModelId());
            newStockInventory.setQualitity(stockInRecord.getStockInNum());
            newStockInventory.setVersion(1);
            newStockInventory.setRemark(stockInRecord.getRemark());
            newStockInventory.setLockedQuantity(stockInRecord.getLockedQuantity());
            newStockInventory.setWarnNum(stockInRecord.getWarnNum());
            stockInventoryMapper.insert(newStockInventory);
        } else {
            // 存在则更新
            LambdaUpdateWrapper<StockInventory> updateWrapper = new LambdaUpdateWrapper<>();
            updateWrapper
                    .eq(StockInventory::getProductModelId, stockInRecord.getProductModelId())
                    .setSql(stockInRecord.getStockInNum() != null,
                            "qualitity = qualitity + " + stockInRecord.getStockInNum())
                    .setSql(true, "version = version + 1")
                    .set(stockInRecord.getRemark() != null && !stockInRecord.getRemark().isEmpty(),
                            StockInventory::getRemark, stockInRecord.getRemark())
                    .set(stockInRecord.getWarnNum() != null,
                            StockInventory::getWarnNum, stockInRecord.getWarnNum())
                    .setSql(stockInRecord.getLockedQuantity() != null,
                            "locked_quantity = locked_quantity + " + stockInRecord.getLockedQuantity())
                    .set(StockInventory::getUpdateTime, new Date());
            stockInventoryMapper.update(null, updateWrapper);
        }
    }
    //出库调用
    @Override
    @Transactional(rollbackFor = Exception.class)
src/main/java/com/ruoyi/stock/service/impl/StockUninventoryServiceImpl.java
@@ -1,17 +1,23 @@
package com.ruoyi.stock.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.approve.service.impl.ApproveProcessServiceImpl;
import com.ruoyi.approve.vo.ApproveProcessVO;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.security.LoginUser;
import com.ruoyi.stock.dto.StockInRecordDto;
import com.ruoyi.stock.dto.StockInventoryDto;
import com.ruoyi.stock.dto.StockOutRecordDto;
import com.ruoyi.stock.dto.StockUninventoryDto;
import com.ruoyi.stock.execl.StockUnInventoryExportData;
import com.ruoyi.stock.mapper.StockUninventoryMapper;
import com.ruoyi.stock.pojo.StockInRecord;
import com.ruoyi.stock.pojo.StockUninventory;
import com.ruoyi.stock.service.StockInRecordService;
import com.ruoyi.stock.service.StockOutRecordService;
@@ -21,6 +27,8 @@
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.http.HttpServletResponse;
import java.time.LocalDate;
import java.util.Date;
import java.util.List;
/**
@@ -38,6 +46,7 @@
    private StockUninventoryMapper stockUninventoryMapper;
    private StockOutRecordService stockOutRecordService;
    private StockInRecordService stockInRecordService;
    private ApproveProcessServiceImpl approveProcessService;
    @Override
    public IPage<StockUninventoryDto> pageStockUninventory(Page page, StockUninventoryDto stockUninventoryDto) {
@@ -53,22 +62,69 @@
        stockInRecordDto.setRecordType(stockUninventoryDto.getRecordType());
        stockInRecordDto.setStockInNum(stockUninventoryDto.getQualitity());
        stockInRecordDto.setProductModelId(stockUninventoryDto.getProductModelId());
        stockInRecordDto.setRemark(stockUninventoryDto.getRemark());
        stockInRecordDto.setType("1");
        stockInRecordService.add(stockInRecordDto);
        //再进行新增库存数量库存
        //先查询库存表中的产品是否存在,不存在新增,存在更新
        StockUninventory oldStockUnInventory = stockUninventoryMapper.selectOne(new QueryWrapper<StockUninventory>().lambda().eq(StockUninventory::getProductModelId, stockUninventoryDto.getProductModelId()));
        int add = stockInRecordService.add(stockInRecordDto);
        LoginUser loginUser = SecurityUtils.getLoginUser();
        if (add > 0){
            try {
                addApproveByPurchase(loginUser,stockInRecordDto);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
        return 1;
    }
    public void addApproveByPurchase(LoginUser loginUser, StockInRecordDto stockInRecordDto) throws Exception {
        ApproveProcessVO approveProcessVO = new ApproveProcessVO();
        approveProcessVO.setApproveType(9);
        approveProcessVO.setApproveDeptId(loginUser.getCurrentDeptId());
        approveProcessVO.setApproveReason(stockInRecordDto.getInboundBatches());
        approveProcessVO.setApproveUserIds(String.valueOf(1));
        approveProcessVO.setApproveUser(loginUser.getUserId());
        approveProcessVO.setApproveTime(LocalDate.now().toString());
        approveProcessVO.setInventoryReview(false);
        approveProcessVO.setStorageType("不合格入库");
        approveProcessVO.setRecordId(stockInRecordDto.getId());
        approveProcessService.addApprove(approveProcessVO);
    }
    /**
     * 更新或创建非良品库存信息
     * @param stockInRecord 非良品库存DTO对象
     */
    public void updateOrCreateStockUninventory(StockInRecord stockInRecord) {
        // 先查询库存表中的产品是否存在
        StockUninventory oldStockUnInventory = stockUninventoryMapper.selectOne(
                new QueryWrapper<StockUninventory>().lambda()
                        .eq(StockUninventory::getProductModelId, stockInRecord.getProductModelId())
        );
        if (ObjectUtils.isEmpty(oldStockUnInventory)) {
            // 不存在则新增
            StockUninventory newStockUnInventory = new StockUninventory();
            newStockUnInventory.setProductModelId(stockUninventoryDto.getProductModelId());
            newStockUnInventory.setQualitity(stockUninventoryDto.getQualitity());
            newStockUnInventory.setProductModelId(stockInRecord.getProductModelId());
            newStockUnInventory.setQualitity(stockInRecord.getStockInNum());
            newStockUnInventory.setVersion(1);
            newStockUnInventory.setRemark(stockUninventoryDto.getRemark());
            newStockUnInventory.setRemark(stockInRecord.getRemark());
            stockUninventoryMapper.insert(newStockUnInventory);
        }else {
            stockUninventoryMapper.updateAddStockUnInventory(stockUninventoryDto);
            LambdaUpdateWrapper<StockUninventory> updateWrapper = new LambdaUpdateWrapper<>();
            if (stockInRecord.getStockInNum() != null) {
                updateWrapper.setSql("qualitity = qualitity + " + stockInRecord.getStockInNum());
        }
        return 1;
            updateWrapper.setSql("version = version + 1");
            String remark = stockInRecord.getRemark();
            if (remark != null && !remark.isEmpty()) {
                updateWrapper.set(StockUninventory::getRemark, remark);
            }
            updateWrapper.set(StockUninventory::getUpdateTime, new Date());
            updateWrapper.eq(StockUninventory::getProductModelId, stockInRecord.getProductModelId());
            stockUninventoryMapper.update(null, updateWrapper);
        }
    }
    @Override
src/main/resources/mapper/stock/StockInRecordMapper.xml
@@ -56,4 +56,18 @@
        </where>
        order by sir.id desc
    </select>
    <select id="selectByRecord" resultType="com.ruoyi.stock.dto.StockInRecordDto">
        SELECT
            sir.*,
            p.product_name as product_name,
            pm.model,
            pm.unit,
            u.nick_name as createBy
        FROM stock_in_record as sir
                 LEFT JOIN product_model as pm on sir.product_model_id = pm.id
                 LEFT JOIN product as p on pm.product_id = p.id
                 LEFT JOIN sys_user as u on sir.create_user = u.user_id
        WHERE sir.id= #{id}
        order by sir.id desc
    </select>
</mapper>