zouyu
2 天以前 4809db01709fd66fe3a25452ef41a6378b6ac6c8
Merge branch 'dev_tide' into dev_tide_cbsglxt

# Conflicts:
# pom.xml
# src/main/java/com/ruoyi/tide/controller/TideController.java
# src/main/java/com/ruoyi/tide/utils/TideUtils.java
# src/main/resources/application-ccwlxt.yml
# src/main/resources/application-cgglxt.yml
# src/main/resources/application-cwglxt.yml
# src/main/resources/application-hbmjxt.yml
# src/main/resources/application-rlzyxt.yml
已添加21个文件
已重命名1个文件
已修改77个文件
3661 ■■■■■ 文件已修改
src/main/java/com/ruoyi/common/QueryWrappers.java 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/framework/aspectj/lang/annotation/DataScope.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java 130 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordOutController.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/Details.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementAddDto.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementDto.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutAdd.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementUpdateDto.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/mapper/CustomStorageMapper.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordOutMapper.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java 128 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/pojo/InboundManagement.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/pojo/ReturnManagement.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordOutService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/impl/GasTankWarningServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementPlanServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementPriceManagementServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java 364 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionOrderController.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/SalesLedgerProductionAccountingController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/SalesLedgerSchedulingController.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/SalesLedgerWorkController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/DaiDto.java 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProcessSchedulingDto.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductionDispatchAddDto.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/SalesLedgerProductDto.java 52 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingDto.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingProcessDto.java 36 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/SalesLedgerWorkDto.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductionOrderMapper.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionOrder.java 139 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/SalesLedgerScheduling.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/SalesLedgerWork.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductionOrderService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/SalesLedgerSchedulingService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/SalesLedgerWorkService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java 147 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/SalesLedgerWorkServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/controller/SysDeptController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/controller/SysPostController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/controller/SysRoleController.java 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/controller/SysUserController.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/domain/SysDept.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/domain/SysPost.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/domain/SysRole.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/mapper/SysDeptMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/mapper/SysPostMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/service/ISysDeptService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/service/ISysPostService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/service/impl/SysDeptServiceImpl.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/service/impl/SysPostServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/service/impl/SysRoleServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/service/impl/SysUserServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/dto/TicketRegistrationDto.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/impl/PaymentRegistrationServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/impl/ProductRecordServiceImpl.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/tide/controller/TideController.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/tide/utils/TideUtils.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/vehicleInformationCollectionReview/controller/VehicleInformationCollectionController.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/vehicleInformationCollectionReview/dto/VehicleInformationCollectionReviewDTO.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/vehicleInformationCollectionReview/mapper/VehicleInformationCollectionReviewMapper.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/vehicleInformationCollectionReview/pojo/VehicleInformationCollectionReview.java 116 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/vehicleInformationCollectionReview/service/VehicleInformationCollectionReviewService.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/vehicleInformationCollectionReview/service/impl/VehicleInformationCollectionReviewServiceImpl.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-cgglxt.yml 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-sbglxt.yml 222 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-scgkxt.yml 222 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-xtbgxt.yml 222 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-yxglxt.yml 222 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/procurementrecord/CustomStorageMapper.xml 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml 209 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionOrderMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/SalesLedgerProductionAccountingMapper.xml 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/SalesLedgerSchedulingMapper.xml 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/SalesLedgerWorkMapper.xml 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/purchase/ProductRecordMapper.xml 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/system/SysDeptMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/system/SysPostMapper.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/system/SysRoleMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/system/SysUserMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/vehicleInformationCollectionReview/VehicleInformationCollectionReviewMapper.xml 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mybatis/mybatis-config.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/common/QueryWrappers.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,68 @@
package com.ruoyi.common;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Component;
import java.lang.reflect.Field;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/*
 * æŽæž—
 * ç”ŸæˆSQL语句*/
@Component
@AllArgsConstructor
public class QueryWrappers<T> {
    public static <T> QueryWrapper<T> queryWrappers(T entity) {
        if (ObjectUtil.isEmpty(entity)) return null;
        Class<?> aClass = entity.getClass();
        QueryWrapper<T> wrapper = Wrappers.<T>query();
        List<Field> fieldList = new ArrayList<>();
        while (aClass != null) {
            fieldList.addAll(new ArrayList<>(Arrays.asList(aClass.getDeclaredFields())));
            aClass = aClass.getSuperclass();
        }
        for (Field field : fieldList) {
            field.setAccessible(true);
            Object value;
            try {
                value = field.get(entity);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
                throw new RuntimeException("查询条件生成错误");
            }
            if(value == null || value.equals("")){
                continue;
            }
            /*boolean bool = field.isAnnotationPresent(TableField.class);
            if (bool){
                if(field.getAnnotation(TableField.class).exist()==false)continue;
            }*/
            if (!field.getName().equals("orderBy")) {
                if(value.getClass()== LocalDateTime.class){
                    wrapper.like(StrUtil.toUnderlineCase(field.getName()), ((LocalDateTime) value).format(DateTimeFormatter.ofPattern("yyyy-MM-dd")));
                }else if(value.getClass()== String.class){
                    wrapper.like(StrUtil.toUnderlineCase(field.getName()), value);
                }else{
                    wrapper.eq(StrUtil.toUnderlineCase(field.getName()), value);
                }
            } else {
                Map<String, String> map = (Map<String, String>) value;
                if(map.get("order")!=null){
                    wrapper.orderBy(true, map.get("order").equals("asc"), StrUtil.toUnderlineCase(map.get("field")));
                }
            }
        }
        return wrapper;
    }
}
src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java
@@ -74,7 +74,7 @@
            if (StringUtils.isNotNull(currentUser) && !currentUser.isAdmin())
            {
                String permission = StringUtils.defaultIfEmpty(controllerDataScope.permission(), PermissionContextHolder.getContext());
                dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(), controllerDataScope.userAlias(), permission);
                dataScopeFilter(joinPoint, currentUser, controllerDataScope.deptAlias(), controllerDataScope.userAlias(), controllerDataScope.tenantIdFelid(), permission);
            }
        }
    }
@@ -86,9 +86,10 @@
     * @param user ç”¨æˆ·
     * @param deptAlias éƒ¨é—¨åˆ«å
     * @param userAlias ç”¨æˆ·åˆ«å
     * @param tenantIdFelid ç§Ÿæˆ·id字段名
     * @param permission æƒé™å­—符
     */
    public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias, String permission)
    public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias,String tenantIdFelid, String permission)
    {
        StringBuilder sqlString = new StringBuilder();
        List<String> conditions = new ArrayList<String>();
@@ -138,6 +139,8 @@
                if (StringUtils.isNotBlank(userAlias))
                {
                    sqlString.append(StringUtils.format(" OR {}.user_id = {} ", userAlias, user.getUserId()));
                }else if(StringUtils.isNotBlank(tenantIdFelid)){
                    sqlString.append(StringUtils.format(" OR {}.tenant_id = {} ", tenantIdFelid, user.getTenantId()));
                }
                else
                {
src/main/java/com/ruoyi/framework/aspectj/lang/annotation/DataScope.java
@@ -27,6 +27,12 @@
    public String userAlias() default "";
    /**
     * ç§Ÿæˆ·id字段名
     * @return
     */
    public String tenantIdFelid() default "";
    /**
     * æƒé™å­—符(用于多个角色匹配符合要求的权限)默认根据权限注解@ss获取,多个权限用逗号分隔开来
     */
    public String permission() default "";
src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordController.java
@@ -2,11 +2,14 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
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.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.procurementrecord.dto.*;
import com.ruoyi.procurementrecord.mapper.CustomStorageMapper;
import com.ruoyi.procurementrecord.pojo.CustomStorage;
import com.ruoyi.procurementrecord.service.ProcurementRecordService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@@ -30,6 +33,19 @@
    @Autowired
    private ProcurementRecordService procurementRecordService;
    /**
     * é€šè¿‡é”€å”®äº§å“id获取入库数量
     * @param salesProductId
     * @return
     */
    @GetMapping("/getProcurementAmount")
    @ApiOperation(value = "通过销售产品id获取入库数量")
    public AjaxResult getProcurementAmount(@RequestParam("salesProductId") Long salesProductId) {
        return AjaxResult.success(procurementRecordService.getProcurementAmount(salesProductId));
    }
    @GetMapping("/productlist")
    @Log(title = "采购入库-入库管理-新增入库查询", businessType = BusinessType.OTHER)
    public AjaxResult list(ProcurementDto procurementDto) {
@@ -41,7 +57,30 @@
    @Log(title = "采购入库-入库管理-新增入库", businessType = BusinessType.INSERT)
    @Transactional
    public AjaxResult add(@RequestBody ProcurementAddDto procurementDto) {
        procurementDto.setType(1);
        procurementDto.setTypeName("采购入库");
        return AjaxResult.success(procurementRecordService.add(procurementDto));
    }
    @PostMapping("/addCustom")
    @Log(title = "自定义入库-入库管理-新增入库", businessType = BusinessType.INSERT)
    @Transactional
    public AjaxResult addCustom(@RequestBody List<CustomStorage> customStorage) {
        return procurementRecordService.addCustom(customStorage);
    }
    @PostMapping("/updateCustom")
    @Log(title = "自定义入库-入库管理-修改入库", businessType = BusinessType.UPDATE)
    @Transactional
    public AjaxResult updateCustom(@RequestBody CustomStorage customStorage) {
        return procurementRecordService.updateCustom(customStorage);
    }
    @PostMapping("/delteCustom")
    @Log(title = "自定义入库-入库管理-删除入库", businessType = BusinessType.DELETE)
    @Transactional
    public AjaxResult deleteCustom(@RequestBody List<Long> ids) {
        return procurementRecordService.deleteCustom(ids);
    }
    @PostMapping("/update")
@@ -52,10 +91,17 @@
    }
    @PostMapping("/updateManagement")
    @Log(title = "采购入库-库存台账-修改", businessType = BusinessType.UPDATE)
    @Log(title = "成品入库-库存台账-修改", businessType = BusinessType.UPDATE)
    @Transactional
    public AjaxResult updateManagement(@RequestBody ProcurementManagementUpdateDto procurementDto) {
        return AjaxResult.success(procurementRecordService.updateManagement(procurementDto));
    }
    @PostMapping("/updateManagementByCustom")
    @Log(title = "自定义入库-库存台账-修改", businessType = BusinessType.UPDATE)
    @Transactional
    public AjaxResult updateManagementByCustom(@RequestBody ProcurementManagementUpdateDto procurementDto) {
        return AjaxResult.success(procurementRecordService.updateManagementByCustom(procurementDto));
    }
    @PostMapping("/del")
@@ -73,12 +119,43 @@
        return AjaxResult.success(result);
    }
    @GetMapping("/listPageByProduction")
    @Log(title = "生产入库-入库管理-入库查询", businessType = BusinessType.OTHER)
    @ApiOperation(value = "入库查询")
    public AjaxResult listPageByProduction(Page page, ProcurementPageDto procurementDto) {
        IPage<ProcurementPageDto> result = procurementRecordService.listPageByProduction(page, procurementDto);
        return AjaxResult.success(result);
    }
    @GetMapping("/listPageByCustom")
    @Log(title = "自定义入库-入库管理-入库查询", businessType = BusinessType.OTHER)
    @ApiOperation(value = "入库查询")
    public AjaxResult listPageByCustom(Page page, CustomStorage customStorage) {
        IPage<CustomStorage> result = procurementRecordService.listPageByCustom(page, customStorage);
        return AjaxResult.success(result);
    }
    @GetMapping("/listPageCopy")
    @Log(title = "采购入库-入库管理-入库查询", businessType = BusinessType.OTHER)
    @Log(title = "采购入库-库存管理-分页查询", businessType = BusinessType.OTHER)
    public AjaxResult listPageCopy(Page page, ProcurementPageDto procurementDto) {
        IPage<ProcurementPageDtoCopy> result =procurementRecordService.listPageCopy(page, procurementDto);
        return AjaxResult.success(result);
    }
    @GetMapping("/listPageCopyByProduction")
    @Log(title = "生产入库-库存管理-分页查询", businessType = BusinessType.OTHER)
    public AjaxResult listPageCopyByProduction(Page page, ProcurementPageDto procurementDto) {
        IPage<ProcurementPageDtoCopy> result = procurementRecordService.listPageCopyByProduction(page, procurementDto);
        return AjaxResult.success(result);
    }
    @GetMapping("/listPageCopyByCustom")
    @Log(title = "自定义入库-库存管理-分页查询", businessType = BusinessType.OTHER)
    public AjaxResult listPageCopyByCustom(Page page, CustomStorage customStorage) {
        IPage<CustomStorage> result = procurementRecordService.listPageCopyByCustom(page, customStorage);
        return AjaxResult.success(result);
    }
    @GetMapping("/getReportList")
    @Log(title = "库存报表查询", businessType = BusinessType.OTHER)
    public AjaxResult getReportList(Page page, ProcurementPageDto procurementDto) {
@@ -86,21 +163,62 @@
    }
    /**
     * å¯¼å‡º
     * åº“存管理采购导出
     * @param response
     */
    @PostMapping("/exportCopy")
    public void exportCopy(HttpServletResponse response) {
        procurementRecordService.exportCopy(response);
        procurementRecordService.exportCopy(response,1);
    }
    /**
     * å¯¼å‡º
     * åº“存管理生产导出
     * @param response
     */
    @PostMapping("/exportCopyOne")
    public void exportCopyOne(HttpServletResponse response) {
        procurementRecordService.exportCopy(response,2);
    }
    /**
     * åº“存管理自定义导出
     * @param response
     */
    @PostMapping("/exportCopyTwo")
    public void exportCopyTwo(HttpServletResponse response) {
        procurementRecordService.exportCopyTwo(response,3);
    }
    /**
     * å…¥åº“,出库管理采购导出
     * @param response
     */
    @PostMapping("/export")
    public void export(HttpServletResponse response) {
        procurementRecordService.export(response);
        procurementRecordService.export(response,1);
    }
    /**
     * å…¥åº“,出库管理生产导出
     * @param response
     */
    @PostMapping("/exportOne")
    public void exportOne(HttpServletResponse response) {
        procurementRecordService.export(response,2);
    }
    @Autowired
    private CustomStorageMapper customStorageMapper;
    /**
     * å…¥åº“,出库管理自定义导出
     * @param response
     */
    @PostMapping("/exportTwo")
    public void exportTwo(HttpServletResponse response) {
        List<CustomStorage> customStorages = customStorageMapper.selectList(null);
        ExcelUtil<CustomStorage> util = new ExcelUtil<CustomStorage>(CustomStorage.class);
        util.exportExcel(response, customStorages, "入库台账");
    }
src/main/java/com/ruoyi/procurementrecord/controller/ProcurementRecordOutController.java
@@ -2,20 +2,22 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
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.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.procurementrecord.dto.ProcurementPageDto;
import com.ruoyi.procurementrecord.dto.ProcurementRecordOutAdd;
import com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto;
import com.ruoyi.procurementrecord.dto.ProcurementUpdateDto;
import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
import com.ruoyi.procurementrecord.service.ProcurementRecordOutService;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
 * @author :yys
@@ -30,26 +32,40 @@
    private ProcurementRecordOutService procurementRecordOutService;
    @PostMapping("/stockout")
    @Log(title = "采购入库-出库管理-出库", businessType = BusinessType.INSERT)
    @Log(title = "采购出库-出库管理-出库", businessType = BusinessType.INSERT)
    public AjaxResult stockout(@RequestBody ProcurementRecordOutAdd procurementRecordOutAdd) {
        return AjaxResult.success(procurementRecordOutService.stockout(procurementRecordOutAdd));
    }
    @GetMapping("/listPage")
    @Log(title = "采购入库-出库管理-出库查询", businessType = BusinessType.OTHER)
    @Log(title = "采购出库-出库台账-出库查询", businessType = BusinessType.OTHER)
    public AjaxResult listPage(Page page, ProcurementRecordOutPageDto procurementDto) {
        IPage<ProcurementRecordOutPageDto> result = procurementRecordOutService.listPage(page, procurementDto);
        return AjaxResult.success(result);
    }
    @GetMapping("/listPageByProduct")
    @Log(title = "生产出库-出库台账-出库查询", businessType = BusinessType.OTHER)
    public AjaxResult listPageByProduct(Page page, ProcurementRecordOutPageDto procurementDto) {
        IPage<ProcurementRecordOutPageDto> result = procurementRecordOutService.listPageByProduct(page, procurementDto);
        return AjaxResult.success(result);
    }
    @GetMapping("/listPageByCustom")
    @Log(title = "自定义出库-出库台账-出库查询", businessType = BusinessType.OTHER)
    public AjaxResult listPageByCustom(Page page, ProcurementRecordOutPageDto procurementDto) {
        IPage<ProcurementRecordOutPageDto> result = procurementRecordOutService.listPageByCustom(page, procurementDto);
        return AjaxResult.success(result);
    }
    @PostMapping("/del")
    @Log(title = "采购入库-出库管理-删除出库", businessType = BusinessType.DELETE)
    @Log(title = "采购出库-出库台账-删除出库", businessType = BusinessType.DELETE)
    public AjaxResult deletePro(@RequestBody ProcurementUpdateDto procurementDto) {
        return AjaxResult.success(procurementRecordOutService.deletePro(procurementDto));
    }
    /**
     * å¯¼å‡º
     * é‡‡è´­å‡ºåº“导出
     * @param response
     */
    @PostMapping("/export")
@@ -57,4 +73,29 @@
        procurementRecordOutService.export(response);
    }
    @Autowired
    public ProcurementRecordOutMapper procurementRecordOutMapper;
    /**
     * ç”Ÿäº§å‡ºåº“导出
     * @param response
     */
    @PostMapping("/exportOne")
    public void exportOne(HttpServletResponse response) {
        List<ProcurementRecordOutPageDto> list = procurementRecordOutMapper.listOne();
        ExcelUtil<ProcurementRecordOutPageDto> util = new ExcelUtil<>(ProcurementRecordOutPageDto.class);
        util.exportExcel(response, list, "生产出库台账");
    }
    /**
     * è‡ªå®šä¹‰å‡ºåº“导出
     * @param response
     */
    @PostMapping("/exportTwo")
    public void exportTwo(HttpServletResponse response) {
        List<ProcurementRecordOutPageDto> list = procurementRecordOutMapper.listTwo();
        ExcelUtil<ProcurementRecordOutPageDto> util = new ExcelUtil<>(ProcurementRecordOutPageDto.class);
        util.exportExcel(response, list, "生产出库台账");
    }
}
src/main/java/com/ruoyi/procurementrecord/dto/Details.java
@@ -10,7 +10,10 @@
 */
@Data
public class Details {
    private Integer id;
    private BigDecimal inboundQuantity;
    private BigDecimal warnNum;
    private Integer id;  // äº§å“id
    private BigDecimal inboundQuantity;  // å…¥åº“数量
    private BigDecimal warnNum;  // é¢„警数量(采购入库才有)
    //单价
    private BigDecimal taxInclusiveUnitPrice;
    private BigDecimal totalPrice;
}
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementAddDto.java
@@ -15,4 +15,11 @@
    private String nickName;
    /**
     * å…¥åº“类型 1-采购 2-生产 3-自定义
     */
    private Integer type;
    private String typeName;
}
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementDto.java
@@ -1,11 +1,9 @@
package com.ruoyi.procurementrecord.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
 * @author :yys
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementManagementUpdateDto.java
@@ -1,11 +1,8 @@
package com.ruoyi.procurementrecord.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
 * @author :yys
@@ -17,6 +14,22 @@
    private String createBy;
    private BigDecimal minStock;
    /**
     * å•ä»·
     */
    private BigDecimal unitPrice;
    /**
     * æ€»ä»·
     */
    private BigDecimal totalPrice;
    // å•ä»·
    private BigDecimal taxInclusiveUnitPrice;
    // æ€»ä»·
    private BigDecimal taxInclusiveTotalPrice;
    private Long createUser;
    private String createTime;
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDto.java
@@ -3,6 +3,7 @@
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
@@ -22,15 +23,41 @@
    private Long createUser;
    /**
     * true:去掉剩余库存为0
     */
    private Boolean flag;
    /**
     * å…¥åº“类型 1-采购 2-生产
     */
    private Integer type;
    /**
     * å…¥åº“批次
     */
    @Excel(name = "入库批次")
    private String inboundBatches;
    /**
     * åˆåŒå·
     * é‡‡è´­åˆåŒå·
     */
    private String purchaseContractNumber;
    /**
     * é”€å”®åˆåŒå·
     */
    private String salesContractNo;
    /**
     * å®¢æˆ·åˆåŒå·
     */
    private String customerContractNo;
    /**
     * å®¢æˆ·åç§°
     */
    @Excel(name = "客户名称")
    private String customerName;
    private String salesLedgerProductId;
@@ -40,6 +67,20 @@
    @Excel(name = "入库数量")
    private BigDecimal inboundNum;
    /**
     * å…¥åº“单价
     */
    @ApiModelProperty(value = "入库单价")
    @Excel(name = "入库单价")
    private BigDecimal unitPrice;
    /**
     * å…¥åº“总价
     */
    @ApiModelProperty(value = "入库总价")
    @Excel(name = "入库总价")
    private BigDecimal totalPrice;
    @Excel(name = "预警数量")
    private BigDecimal warnNum;
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementPageDtoCopy.java
@@ -2,6 +2,7 @@
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@@ -32,6 +33,22 @@
     */
    private String purchaseContractNumber;
    /**
     * é”€å”®åˆåŒå·
     */
    private String salesContractNo;
    /**
     * å®¢æˆ·åˆåŒå·
     */
    private String customerContractNo;
    /**
     * å®¢æˆ·åç§°
     */
    private String customerName;
    private String salesLedgerProductId;
    /**
@@ -39,6 +56,20 @@
     */
    @Excel(name = "入库数量")
    private BigDecimal inboundNum;
    /**
     * å…¥åº“单价
     */
    @ApiModelProperty(value = "入库单价")
    @Excel(name = "入库单价")
    private BigDecimal unitPrice;
    /**
     * å…¥åº“总价
     */
    @ApiModelProperty(value = "入库总价")
    @Excel(name = "入库总价")
    private BigDecimal totalPrice;
    /**
     * å¾…出库数量
@@ -49,7 +80,7 @@
     * å‡ºåº“数量
     */
    @Excel(name = "出库数量")
    private BigDecimal totalInboundNum;
    private BigDecimal totalInboundNum = BigDecimal.ZERO;
    /**
     * æœ€ä½Žåº“存数量
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutAdd.java
@@ -19,4 +19,9 @@
    private Integer salesLedgerProductId;
    /**
     * å‡ºåº“类型 1-采购出库 2-销售出库 3-自定义
     */
    private Integer type;
}
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java
@@ -20,6 +20,26 @@
    private Integer id;
    private BigDecimal warnNum;
    /**
     * é‡‡è´­åˆåŒå·
     */
    private String purchaseContractNumber;
    /**
     * é”€å”®åˆåŒå·
     */
    private String salesContractNo;
    /**
     * å®¢æˆ·åˆåŒå·
     */
    private String customerContractNo;
    /**
     * å®¢æˆ·åç§°
     */
    @Excel(name = "客户名称")
    private String customerName;
    /**
     * å‡ºå…¥åº“数量
@@ -28,10 +48,22 @@
    private BigDecimal inboundNum;
    /**
     * å•ä»·
     */
    @Excel(name = "单价")
    private BigDecimal unitPrice;
    /**
     * æ€»ä»·
     */
    @Excel(name = "总价")
    private BigDecimal totalPrice;
    /**
     * å‡ºå…¥åº“æ—¶é—´
     */
//    @Excel(name = "出库时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    private LocalDateTime createTime;
    private String timeStr;
@@ -50,6 +82,8 @@
     */
    @Excel(name = "供应商名称")
    private String supplierName;
    /**
@@ -94,4 +128,8 @@
    @Excel(name = "不含税总价")
    private BigDecimal taxExclusiveTotalPrice;
    /**
     * ç‰©å“ç±»åž‹
     */
    private String itemType;
}
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementUpdateDto.java
@@ -12,12 +12,23 @@
@Data
public class ProcurementUpdateDto {
    private String inboundDate;
    private Integer id;
    private BigDecimal warnNum;
    private BigDecimal quantityStock;
    private BigDecimal unitPrice;
    private BigDecimal totalPrice;
    private List<Integer> ids;
    /**
     * å‡ºåº“类型 1-采购 2-销售 3-自定义
     */
    private Integer type;
}
src/main/java/com/ruoyi/procurementrecord/mapper/CustomStorageMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
package com.ruoyi.procurementrecord.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.procurementrecord.pojo.CustomStorage;
import org.apache.ibatis.annotations.Param;
/**
 * @author :yys
 * @date : 2025/11/10 13:11
 */
public interface CustomStorageMapper extends BaseMapper<CustomStorage> {
    IPage<CustomStorage> listPageCopyByCustom(Page page,@Param("req") CustomStorage customStorageLambdaQueryWrapper);
    IPage<CustomStorage> listPageByCustom(Page page,@Param("req") CustomStorage customStorage);
}
src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordMapper.java
@@ -30,5 +30,13 @@
    List<ProcurementPageDtoCopy> listCopy();
    List<ProcurementPageDtoCopy> listCopyOne();
    List<ProcurementPageDto> list();
    List<ProcurementPageDto> listOne();
    IPage<ProcurementPageDto> listPageByProduction(Page page, @Param("req") ProcurementPageDto procurementDto);
    IPage<ProcurementPageDtoCopy> listPageCopyByProduction(Page page, @Param("req") ProcurementPageDto procurementDto);
}
src/main/java/com/ruoyi/procurementrecord/mapper/ProcurementRecordOutMapper.java
@@ -18,4 +18,12 @@
    IPage<ProcurementRecordOutPageDto> listPage(Page page,@Param("req") ProcurementRecordOutPageDto procurementDto);
    List<ProcurementRecordOutPageDto> list();
    List<ProcurementRecordOutPageDto> listOne();
    List<ProcurementRecordOutPageDto> listTwo();
    IPage<ProcurementRecordOutPageDto> listPageByProduct(Page page,@Param("req") ProcurementRecordOutPageDto procurementDto);
    IPage<ProcurementRecordOutPageDto> listPageByCustom(Page page,@Param("req") ProcurementRecordOutPageDto procurementDto);
}
src/main/java/com/ruoyi/procurementrecord/pojo/CustomStorage.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,128 @@
package com.ruoyi.procurementrecord.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
/**
 * @author :yys
 * @date : 2025/11/10 11:51
 */
@TableName("custom_storage")
@Data
public class CustomStorage {
    @TableField(exist = false)
    private Boolean flag;
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    // å…¥åº“æ—¶é—´
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "入库时间", width = 30, dateFormat = "yyyy-MM-dd")
    private Date inboundDate;
    /**
     * ç¼–号
     */
    @Excel(name = "编号")
    private String code;
    @TableField(exist = false)
    private String timeStr;
    /**
     * å¾…出库数量
     */
    @Excel(name = "待出库数量")
    @TableField(exist = false)
    private BigDecimal inboundNum0;
    /**
     * å‡ºåº“数量
     */
    @Excel(name = "出库数量")
    @TableField(exist = false)
    private BigDecimal totalInboundNum = BigDecimal.ZERO;
    // ç‰©å“ç±»åž‹
    @Excel(name = "物品类型")
    private String itemType;
    // å…¥åº“批次
    @Excel(name = "入库批次")
    private String inboundBatches;
    // å…¥åº“数量
    @Excel(name = "入库数量")
    private BigDecimal inboundNum;
    // ä¾›åº”商名称
    @Excel(name = "供应商名称")
    private String supplierName;
    // äº§å“å¤§ç±»
    @Excel(name = "产品大类")
    private String productCategory;
    // è§„格型号
    @Excel(name = "规格型号")
    private String specificationModel;
    // å•位
    @Excel(name = "单位")
    private String unit;
    // å«ç¨Žå•ä»·
    @Excel(name = "含税单价")
    private BigDecimal taxInclusiveUnitPrice;
    // å«ç¨Žæ€»ä»·
    @Excel(name = "含税总价")
    private BigDecimal taxInclusiveTotalPrice;
    // ç¨Žçއ(%)
    @Excel(name = "税率(%)")
    private BigDecimal taxRate;
    // ä¸å«ç¨Žæ€»ä»·
    @Excel(name = "不含税总价")
    private BigDecimal taxExclusiveTotalPrice;
    /**
     * å…¥åº“用户
     */
    @Excel(name = "入库用户")
    private String createBy;
    /**
     * å…¥åº“用户id
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * å…¥åº“æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDateTime createTime;
    /**
     * ä¿®æ”¹è€…
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime updateTime;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/procurementrecord/pojo/InboundManagement.java
@@ -7,7 +7,6 @@
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordOut.java
@@ -22,7 +22,7 @@
    private Integer id;
    /**
     * äº§å“ä¿¡æ¯è¡¨id
     * äº§å“ä¿¡æ¯è¡¨id(自定义入库时为0)
     */
    private Integer salesLedgerProductId;
@@ -43,32 +43,42 @@
    private String inboundBatches;
    /**
     * å‡ºå‡ºåº“数量
     * å‡ºåº“数量
     */
    private BigDecimal inboundNum;
    /**
     * å‡ºå‡ºåº“用户
     * å‡ºåº“类型 1-采购 2-销售 3-自定义
     */
    private Integer type;
    /**
     * å‡ºåº“用户
     */
    private String createBy;
    /**
     * å…¥åº“用户id
     */
    @TableField(fill = FieldFill.INSERT)
    private Long createUser;
    /**
     * å…¥åº“æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     * ä¿®æ”¹è€…
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    /**
src/main/java/com/ruoyi/procurementrecord/pojo/ProcurementRecordStorage.java
@@ -37,9 +37,24 @@
    private BigDecimal inboundNum;
    /**
     * å•ä»·
     */
    private BigDecimal unitPrice;
    /**
     * æ€»ä»·
     */
    private BigDecimal totalPrice;
    /**
     * é¢„警数量
     */
    private BigDecimal warnNum;
    /**
     * å…¥åº“类型 1-采购入库 2-生产入库
     */
    private Integer type;
//    /**
//     * æœ€ä½Žåº“存数量
//     */
@@ -54,21 +69,25 @@
    /**
     * å…¥åº“用户id
     */
    @TableField(fill = FieldFill.INSERT)
    private Long createUser;
    /**
     * å…¥åº“æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     * ä¿®æ”¹è€…
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Long updateUser;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    /**
src/main/java/com/ruoyi/procurementrecord/pojo/ReturnManagement.java
@@ -8,7 +8,6 @@
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import java.util.Date;
/**
 * @author :yys
src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordOutService.java
@@ -23,4 +23,8 @@
    int deletePro(ProcurementUpdateDto procurementDto);
    void export(HttpServletResponse response);
    IPage<ProcurementRecordOutPageDto> listPageByProduct(Page page, ProcurementRecordOutPageDto procurementDto);
    IPage<ProcurementRecordOutPageDto> listPageByCustom(Page page, ProcurementRecordOutPageDto procurementDto);
}
src/main/java/com/ruoyi/procurementrecord/service/ProcurementRecordService.java
@@ -3,10 +3,13 @@
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.procurementrecord.dto.*;
import com.ruoyi.procurementrecord.pojo.CustomStorage;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
@@ -27,11 +30,31 @@
    int deletePro(ProcurementUpdateDto procurementDto);
    void export(HttpServletResponse response);
    void export(HttpServletResponse response,Integer type);
    int updateManagement(ProcurementManagementUpdateDto procurementDto);
    void exportCopy(HttpServletResponse response);
    void exportCopy(HttpServletResponse response,Integer type);
    void exportCopyTwo(HttpServletResponse response,Integer type);
    Map<String, Object> getReportList(Page page, ProcurementPageDto procurementDto);
    IPage<ProcurementPageDto> listPageByProduction(Page page, ProcurementPageDto procurementDto);
    AjaxResult addCustom(List<CustomStorage> customStorage);
    IPage<CustomStorage> listPageByCustom(Page page, CustomStorage customStorage);
    IPage<ProcurementPageDtoCopy> listPageCopyByProduction(Page page, ProcurementPageDto procurementDto);
    IPage<CustomStorage> listPageCopyByCustom(Page page, CustomStorage customStorage);
    AjaxResult updateCustom(CustomStorage customStorage);
    AjaxResult deleteCustom(List<Long> ids);
    int updateManagementByCustom(ProcurementManagementUpdateDto procurementDto);
    BigDecimal getProcurementAmount(Long salesProductId);
}
src/main/java/com/ruoyi/procurementrecord/service/impl/GasTankWarningServiceImpl.java
@@ -4,9 +4,7 @@
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.procurementrecord.dto.ProcurementPageDto;
import com.ruoyi.procurementrecord.mapper.GasTankWarningMapper;
import com.ruoyi.procurementrecord.pojo.GasTankWarning;
import com.ruoyi.procurementrecord.service.GasTankWarningService;
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementPlanServiceImpl.java
@@ -6,7 +6,6 @@
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.procurementrecord.mapper.ProcurementPlanMapper;
import com.ruoyi.procurementrecord.pojo.ProcurementPlan;
import com.ruoyi.procurementrecord.pojo.ProcurementPriceManagement;
import com.ruoyi.procurementrecord.service.ProcurementPlanService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementPriceManagementServiceImpl.java
@@ -3,9 +3,7 @@
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.utils.excel.ExcelUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.procurementrecord.dto.ProcurementPageDto;
import com.ruoyi.procurementrecord.mapper.ProcurementPriceManagementMapper;
import com.ruoyi.procurementrecord.pojo.ProcurementPriceManagement;
import com.ruoyi.procurementrecord.service.ProcurementPriceManagementService;
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordOutServiceImpl.java
@@ -10,20 +10,20 @@
import com.ruoyi.procurementrecord.dto.ProcurementUpdateDto;
import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
import com.ruoyi.procurementrecord.service.ProcurementRecordOutService;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.stream.Collectors;
@@ -54,7 +54,15 @@
        procurementRecordOutLambdaQueryWrapper.ge(ProcurementRecordOut::getCreateTime, now)  // å¤§äºŽç­‰äºŽå½“天
                .lt(ProcurementRecordOut::getCreateTime, now.plusDays(1)); // å°äºŽæ˜Žå¤©
        Long aLong1 = procurementRecordOutMapper.selectCount(procurementRecordOutLambdaQueryWrapper);
        // 2. å®šä¹‰æ—¥æœŸæ ¼å¼ï¼ˆå¿…须与字符串格式完全匹配)
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        LocalDateTime localDateTime = null;
        // 3. è½¬æ¢ï¼šString â†’ LocalDate â†’ LocalDateTime(补充0点时间)
        if(StringUtils.isNotEmpty(procurementRecordOutAdd.getTime())){
            LocalDate localDate = LocalDate.parse(procurementRecordOutAdd.getTime(), formatter);
            // èŽ·å–å½“å‰æ—¶åˆ†ç§’
            LocalTime localTime = LocalTime.now();
            localDateTime = localDate.atTime(localTime);}
        // æŸ¥è¯¢é‡‡è´­å‡ºåº“数量
        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getProcurementRecordStorageId, procurementRecordOutAdd.getId());
@@ -65,7 +73,8 @@
                .salesLedgerProductId(procurementRecordOutAdd.getSalesLedgerProductId())
                .inboundBatches(aLong.equals(0L) ? "第1批次" : "第"+ (aLong + 1) + "批次")
                .inboundNum(new BigDecimal(procurementRecordOutAdd.getQuantity()))
                .createTime(LocalDateTime.now())
                .type(procurementRecordOutAdd.getType())
                .createTime(localDateTime == null ? LocalDateTime.now() : localDateTime)
                .createUser(Long.valueOf(procurementRecordOutAdd.getUserId()))
                .createBy(sysUser.getNickName())
                .updateUser(Long.valueOf(procurementRecordOutAdd.getUserId()))
@@ -99,4 +108,14 @@
        ExcelUtil<ProcurementRecordOutPageDto> util = new ExcelUtil<>(ProcurementRecordOutPageDto.class);
        util.exportExcel(response, list, "出库台账");
    }
    @Override
    public IPage<ProcurementRecordOutPageDto> listPageByProduct(Page page, ProcurementRecordOutPageDto procurementDto) {
        return procurementRecordOutMapper.listPageByProduct(page, procurementDto);
    }
    @Override
    public IPage<ProcurementRecordOutPageDto> listPageByCustom(Page page, ProcurementRecordOutPageDto procurementDto) {
        return procurementRecordOutMapper.listPageByCustom(page, procurementDto);
    }
}
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
@@ -4,14 +4,18 @@
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.utils.OrderUtils;
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.AjaxResult;
import com.ruoyi.procurementrecord.dto.*;
import com.ruoyi.procurementrecord.mapper.CustomStorageMapper;
import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
import com.ruoyi.procurementrecord.pojo.CustomStorage;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
import com.ruoyi.procurementrecord.service.ProcurementRecordService;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
@@ -26,8 +30,12 @@
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
@@ -102,10 +110,13 @@
    @Override
    public int updatePro(ProcurementUpdateDto procurementDto) {
        ProcurementRecordStorage procurementRecordStorageById = getProcurementRecordById(procurementDto.getId());
        procurementRecordStorageById.setCreateTime(LocalDate.parse(procurementDto.getInboundDate(), DateTimeFormatter.ofPattern("yyyy-MM-dd")).atTime(LocalTime.MIDNIGHT));
        procurementRecordStorageById.setInboundNum(procurementDto.getQuantityStock());
        procurementRecordStorageById.setWarnNum(procurementDto.getWarnNum());
        procurementRecordStorageById.setUpdateUser(SecurityUtils.getLoginUser().getUserId());
        procurementRecordStorageById.setUpdateTime(LocalDateTime.now());
        procurementRecordStorageById.setUnitPrice(procurementDto.getUnitPrice());
        procurementRecordStorageById.setTotalPrice(procurementDto.getTotalPrice());
        return procurementRecordMapper.updateById(procurementRecordStorageById);
    }
@@ -115,7 +126,8 @@
        procurementRecordMapper.deleteBatchIds(procurementRecordStorageById.stream().map(ProcurementRecordStorage::getId).collect(Collectors.toList()));
        // åˆ é™¤æ‰€æœ‰å¯¹åº”的出库记录
        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordOutLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordOutLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, procurementDto.getIds());
        procurementRecordOutLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, procurementDto.getIds())
                .eq(ProcurementRecordOut::getType,procurementDto.getType());
        List<ProcurementRecordOut> procurementRecordOuts = procurementRecordOutMapper.selectList(procurementRecordOutLambdaQueryWrapper);
        if(!CollectionUtils.isEmpty(procurementRecordOuts)){
            procurementRecordOutMapper.deleteBatchIds(procurementRecordOuts.stream().map(ProcurementRecordOut::getId).collect(Collectors.toList()));
@@ -124,8 +136,13 @@
    }
    @Override
    public void export(HttpServletResponse response) {
        List<ProcurementPageDto> list =procurementRecordMapper.list();
    public void export(HttpServletResponse response,Integer type) {
        List<ProcurementPageDto> list = new ArrayList<>();
        if(type == 1){
            list = procurementRecordMapper.list();
        }else{
            list = procurementRecordMapper.listOne();
        }
        // è®¡ç®—待入库数量
        // æŸ¥è¯¢é‡‡è´­è®°å½•已入库数量
        List<Integer> collect = list.stream().map(ProcurementPageDto::getId).collect(Collectors.toList());
@@ -136,6 +153,7 @@
        }
        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect);
        procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getType, type);
        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
        if(CollectionUtils.isEmpty( procurementRecords)){
            ExcelUtil<ProcurementPageDto> util = new ExcelUtil<ProcurementPageDto>(ProcurementPageDto.class);
@@ -182,21 +200,39 @@
        if(salesLedgerProduct == null){
            throw new RuntimeException("销售台账产品不存在");
        }
        // æ ¹æ®å¤§ç±»ï¼Œè§„格查询所有产品id
        LambdaQueryWrapper<SalesLedgerProduct> salesLedgerProductLambdaQueryWrapper = new LambdaQueryWrapper<>();
        salesLedgerProductLambdaQueryWrapper.eq(SalesLedgerProduct::getProductCategory, salesLedgerProduct.getProductCategory())
                .eq(SalesLedgerProduct::getSpecificationModel, salesLedgerProduct.getSpecificationModel())
                .eq(SalesLedgerProduct::getType, 1);
        List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(salesLedgerProductLambdaQueryWrapper);
        if(CollectionUtils.isEmpty(salesLedgerProducts)){
            throw new RuntimeException("没有找到对应的产品");
        }
        salesLedgerProduct.setMinStock(procurementDto.getMinStock());
        salesLedgerProductMapper.updateById(salesLedgerProduct);
        ProcurementRecordStorage procurementRecordStorageById = getProcurementRecordById(procurementDto.getId());
        procurementRecordStorageById.setCreateBy(sysUser.getNickName());
        procurementRecordStorageById.setCreateUser(sysUser.getUserId());
        procurementRecordStorageById.setUpdateTime(LocalDateTime.parse(entryDateStr,df));
        procurementRecordStorageById.setUpdateUser(loginUser.getUserId());
        procurementRecordStorageById.setCreateTime(LocalDateTime.parse(createTimeStr,df));
        procurementRecordMapper.updateById(procurementRecordStorageById);
        LambdaQueryWrapper<ProcurementRecordStorage> procurementRecordStorageLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordStorageLambdaQueryWrapper.in(ProcurementRecordStorage::getSalesLedgerProductId, salesLedgerProducts.stream().map(SalesLedgerProduct::getId).collect(Collectors.toList()));
        ProcurementRecordStorage procurementRecordStorage = ProcurementRecordStorage.builder().build();
        procurementRecordStorage.setUnitPrice(procurementDto.getUnitPrice());
        procurementRecordStorage.setTotalPrice(procurementDto.getTotalPrice());
        procurementRecordStorage.setCreateBy(sysUser.getNickName());
        procurementRecordStorage.setCreateUser(sysUser.getUserId());
        procurementRecordStorage.setUpdateTime(LocalDateTime.parse(entryDateStr,df));
        procurementRecordStorage.setUpdateUser(loginUser.getUserId());
        procurementRecordStorage.setCreateTime(LocalDateTime.parse(createTimeStr,df));
        procurementRecordMapper.update(procurementRecordStorage,procurementRecordStorageLambdaQueryWrapper);
        return 0;
    }
    @Override
    public void exportCopy(HttpServletResponse response) {
        List<ProcurementPageDtoCopy> list =procurementRecordMapper.listCopy();
    public void exportCopy(HttpServletResponse response,Integer type) {
        List<ProcurementPageDtoCopy> list = new ArrayList<>();
        if(type == 1){
            list = procurementRecordMapper.listCopy();
        }else{
            list = procurementRecordMapper.listCopyOne();
        }
        // è®¡ç®—待入库数量
        // æŸ¥è¯¢é‡‡è´­è®°å½•已入库数量
        List<Integer> collect = list.stream().map(ProcurementPageDtoCopy::getId).collect(Collectors.toList());
@@ -207,6 +243,7 @@
        }
        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect);
        procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getType, type);
        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
        if(CollectionUtils.isEmpty( procurementRecords)){
            ExcelUtil<ProcurementPageDtoCopy> util = new ExcelUtil<ProcurementPageDtoCopy>(ProcurementPageDtoCopy.class);
@@ -234,6 +271,53 @@
            dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
        }
        ExcelUtil<ProcurementPageDtoCopy> util = new ExcelUtil<ProcurementPageDtoCopy>(ProcurementPageDtoCopy.class);
        util.exportExcel(response, list, "库存管理");
    }
    @Override
    public void exportCopyTwo(HttpServletResponse response,Integer type) {
        LambdaQueryWrapper<CustomStorage> customStorageLambdaQueryWrapper = new LambdaQueryWrapper<>();
        customStorageLambdaQueryWrapper.groupBy(CustomStorage::getSupplierName, CustomStorage::getProductCategory, CustomStorage::getSpecificationModel);
        List<CustomStorage> list = customStorageMapper.selectList(customStorageLambdaQueryWrapper);
        // è®¡ç®—待入库数量
        // æŸ¥è¯¢é‡‡è´­è®°å½•已入库数量
        List<Integer> collect = list.stream().map(CustomStorage::getId).collect(Collectors.toList());
        if(CollectionUtils.isEmpty( collect)){
            ExcelUtil<CustomStorage> util = new ExcelUtil<CustomStorage>(CustomStorage.class);
            util.exportExcel(response, list, "库存管理");
            return;
        }
        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect);
        procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getType, type);
        procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getType, type);
        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
        if(CollectionUtils.isEmpty( procurementRecords)){
            ExcelUtil<CustomStorage> util = new ExcelUtil<CustomStorage>(CustomStorage.class);
            util.exportExcel(response, list, "库存管理");
            return;
        }
        for (CustomStorage dto : list) {
            // æ ¹æ®é‡‡è´­å°è´¦ID筛选对应的出库记录
            List<ProcurementRecordOut> collect1 = procurementRecords.stream()
                    .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId()))
                    .collect(Collectors.toList());
            // å¦‚果没有相关的出库记录,跳过该条数据
            if(CollectionUtils.isEmpty(collect1)){
                dto.setInboundNum0(dto.getInboundNum());
                continue;
            }
            // è®¡ç®—已出库数量总和,并设置待出库数量
            BigDecimal totalInboundNum = collect1.stream()
                    .map(ProcurementRecordOut::getInboundNum)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
            // å¾…出库数量 = æ€»æ•°é‡ - å·²å‡ºåº“数量
            dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
        }
        ExcelUtil<CustomStorage> util = new ExcelUtil<CustomStorage>(CustomStorage.class);
        util.exportExcel(response, list, "库存管理");
    }
@@ -336,20 +420,257 @@
    }
    @Override
    public IPage<ProcurementPageDto> listPageByProduction(Page page, ProcurementPageDto procurementDto) {
        IPage<ProcurementPageDto> procurementPageDtoIPage = procurementRecordMapper.listPageByProduction(page, procurementDto);
        List<ProcurementPageDto> procurementPageDtos = procurementPageDtoIPage.getRecords();
        // è®¡ç®—待入库数量
        // æŸ¥è¯¢é‡‡è´­è®°å½•已入库数量
        List<Integer> collect = procurementPageDtos.stream().map(ProcurementPageDto::getId).collect(Collectors.toList());
        if(CollectionUtils.isEmpty( collect)){
            return procurementPageDtoIPage;
        }
        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect)
                .eq(ProcurementRecordOut::getType,2);
        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
        if(CollectionUtils.isEmpty( procurementRecords)){
            return procurementPageDtoIPage;
        }
        for (ProcurementPageDto dto : procurementPageDtos) {
            // æ ¹æ®é‡‡è´­å°è´¦ID筛选对应的出库记录
            List<ProcurementRecordOut> collect1 = procurementRecords.stream()
                    .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId()))
                    .collect(Collectors.toList());
            // å¦‚果没有相关的出库记录,跳过该条数据
            if(CollectionUtils.isEmpty(collect1)){
                dto.setInboundNum0(dto.getInboundNum());
                continue;
            }
            // è®¡ç®—已出库数量总和,并设置待出库数量
            BigDecimal totalInboundNum = collect1.stream()
                    .map(ProcurementRecordOut::getInboundNum)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
            // å¾…出库数量 = æ€»æ•°é‡ - å·²å‡ºåº“数量
            dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
        }
        return procurementPageDtoIPage;
    }
    private final CustomStorageMapper customStorageMapper;
    @Override
    public AjaxResult addCustom(List<CustomStorage> customStorage) {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        if(CollectionUtils.isEmpty(customStorage)){
            return AjaxResult.error("数据不能为空");
        }
        customStorage.forEach(item -> {
            // æŸ¥è¯¢é‡‡è´­å…¥åº“数量
            Long aLong = customStorageMapper.selectCount(null);
            item.setInboundBatches(aLong.equals(0L) ? "第1批次(自定义入库)" : "第"+ (aLong + 1) + "批次(自定义入库)" );
            item.setCreateBy(loginUser.getNickName());
            item.setCode(OrderUtils.countTodayByCreateTime(customStorageMapper, ""));
            customStorageMapper.insert(item);
        });
        return AjaxResult.success("自定义入库成功");
    }
    @Override
    public IPage<CustomStorage> listPageByCustom(Page page, CustomStorage customStorage) {
        IPage<CustomStorage> procurementPageDtoIPage = customStorageMapper.listPageByCustom(page, customStorage);
        procurementPageDtoIPage.getRecords().forEach(item -> item.setInboundNum0(item.getInboundNum()));
        List<CustomStorage> procurementPageDtos = procurementPageDtoIPage.getRecords();
        // è®¡ç®—待入库数量
        // æŸ¥è¯¢é‡‡è´­è®°å½•已入库数量
        List<Integer> collect = procurementPageDtos.stream().map(CustomStorage::getId).collect(Collectors.toList());
        if(CollectionUtils.isEmpty( collect)){
            return procurementPageDtoIPage;
        }
        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect)
                .eq(ProcurementRecordOut::getType, 3);
        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
        if(CollectionUtils.isEmpty( procurementRecords)){
            return procurementPageDtoIPage;
        }
        for (CustomStorage dto : procurementPageDtos) {
            // æ ¹æ®é‡‡è´­å°è´¦ID筛选对应的出库记录
            List<ProcurementRecordOut> collect1 = procurementRecords.stream()
                    .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId()))
                    .collect(Collectors.toList());
            // å¦‚果没有相关的出库记录,跳过该条数据
            if(CollectionUtils.isEmpty(collect1)){
                dto.setInboundNum0(dto.getInboundNum());
                continue;
            }
            // è®¡ç®—已出库数量总和,并设置待出库数量
            BigDecimal totalInboundNum = collect1.stream()
                    .map(ProcurementRecordOut::getInboundNum)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
            // å¾…出库数量 = æ€»æ•°é‡ - å·²å‡ºåº“数量
            dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
        }
        return procurementPageDtoIPage;
    }
    @Override
    public IPage<ProcurementPageDtoCopy> listPageCopyByProduction(Page page, ProcurementPageDto procurementDto) {
        IPage<ProcurementPageDtoCopy> procurementPageDtoCopyIPage = procurementRecordMapper.listPageCopyByProduction(page, procurementDto);
        List<ProcurementPageDtoCopy> procurementPageDtoCopyList = procurementPageDtoCopyIPage.getRecords();
        // è®¡ç®—待入库数量
        // æŸ¥è¯¢é‡‡è´­è®°å½•已入库数量
        List<Integer> collect = procurementPageDtoCopyList.stream().map(ProcurementPageDtoCopy::getId).collect(Collectors.toList());
        if(CollectionUtils.isEmpty( collect)){
            return procurementPageDtoCopyIPage;
        }
        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect);
        procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getType, 2);
        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
        if(CollectionUtils.isEmpty( procurementRecords)){
            return procurementPageDtoCopyIPage;
        }
        for (ProcurementPageDtoCopy dto : procurementPageDtoCopyList) {
            // æ ¹æ®é‡‡è´­å°è´¦ID筛选对应的出库记录
            List<ProcurementRecordOut> collect1 = procurementRecords.stream()
                    .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId()))
                    .collect(Collectors.toList());
            // å¦‚果没有相关的出库记录,跳过该条数据
            if(CollectionUtils.isEmpty(collect1)){
                dto.setInboundNum0(dto.getInboundNum());
                dto.setTotalInboundNum(BigDecimal.ZERO);
                continue;
            }
            // è®¡ç®—已出库数量总和,并设置待出库数量
            BigDecimal totalInboundNum = collect1.stream()
                    .map(ProcurementRecordOut::getInboundNum)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
            // å‡ºåº“数量 = æ€»æ•°é‡ - å¾…出库数量
            dto.setTotalInboundNum(totalInboundNum);
            // å¾…出库数量 = æ€»æ•°é‡ - å·²å‡ºåº“数量
            dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
            // åº“存价值
            if(dto.getUnitPrice() != null){
                dto.setTotalPrice(dto.getTotalInboundNum().multiply(dto.getUnitPrice()));
            }
        }
        return procurementPageDtoCopyIPage;
    }
    @Override
    public IPage<CustomStorage> listPageCopyByCustom(Page page, CustomStorage customStorage) {
        IPage<CustomStorage> pageList = customStorageMapper.listPageCopyByCustom(page, customStorage);
        List<CustomStorage> procurementPageDtoCopyList = pageList.getRecords();
        // è®¡ç®—待入库数量
        // æŸ¥è¯¢é‡‡è´­è®°å½•已入库数量
        List<Integer> collect = procurementPageDtoCopyList.stream().map(CustomStorage::getId).collect(Collectors.toList());
        if(CollectionUtils.isEmpty( collect)){
            return pageList;
        }
        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect);
        procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getType, 3);
        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
        if(CollectionUtils.isEmpty( procurementRecords)){
            return pageList;
        }
        for (CustomStorage dto : procurementPageDtoCopyList) {
            // æ ¹æ®é‡‡è´­å°è´¦ID筛选对应的出库记录
            List<ProcurementRecordOut> collect1 = procurementRecords.stream()
                    .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId()))
                    .collect(Collectors.toList());
            // å¦‚果没有相关的出库记录,跳过该条数据
            if(CollectionUtils.isEmpty(collect1)){
                dto.setInboundNum0(dto.getInboundNum());
                dto.setTotalInboundNum(BigDecimal.ZERO);
                continue;
            }
            // è®¡ç®—已出库数量总和,并设置待出库数量
            BigDecimal totalInboundNum = collect1.stream()
                    .map(ProcurementRecordOut::getInboundNum)
                    .reduce(BigDecimal.ZERO, BigDecimal::add);
            // å‡ºåº“数量 = æ€»æ•°é‡ - å¾…出库数量
            dto.setTotalInboundNum(totalInboundNum);
            // å¾…出库数量 = æ€»æ•°é‡ - å·²å‡ºåº“数量
            dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
            // åº“存价值
            if(dto.getTaxInclusiveUnitPrice() != null){
                dto.setTaxInclusiveTotalPrice(dto.getInboundNum0().multiply(dto.getTaxInclusiveUnitPrice()));
            }
        }
        pageList.setRecords(procurementPageDtoCopyList);
        return pageList;
    }
    @Override
    public AjaxResult updateCustom(CustomStorage customStorage) {
        return AjaxResult.success(customStorageMapper.updateById(customStorage));
    }
    @Override
    public AjaxResult deleteCustom(List<Long> ids) {
        return AjaxResult.success(customStorageMapper.deleteBatchIds(ids));
    }
    @Override
    public int updateManagementByCustom(ProcurementManagementUpdateDto procurementDto) {
        CustomStorage customStorage = customStorageMapper.selectById(procurementDto.getId());
        if(customStorage == null){
            throw new RuntimeException("材料库存不存在");
        }
        LambdaQueryWrapper<CustomStorage> customStorageLambdaQueryWrapper = new LambdaQueryWrapper<>();
        customStorageLambdaQueryWrapper.eq(CustomStorage::getProductCategory, customStorage.getProductCategory())
                .eq(CustomStorage::getSpecificationModel, customStorage.getSpecificationModel());
        CustomStorage one = new CustomStorage();
        one.setTaxInclusiveUnitPrice(procurementDto.getTaxInclusiveUnitPrice());
        one.setTaxInclusiveTotalPrice(procurementDto.getTaxInclusiveTotalPrice());
        return customStorageMapper.update(one,customStorageLambdaQueryWrapper);
    }
    @Override
    public BigDecimal getProcurementAmount(Long salesProductId) {
        LambdaQueryWrapper<ProcurementRecordStorage> procurementRecordStorageLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordStorageLambdaQueryWrapper.eq(ProcurementRecordStorage::getSalesLedgerProductId, salesProductId)
                .eq(ProcurementRecordStorage::getType, 2);
        List<ProcurementRecordStorage> procurementRecordStorages = procurementRecordMapper.selectList(procurementRecordStorageLambdaQueryWrapper);
        if(CollectionUtils.isEmpty( procurementRecordStorages)){
            return BigDecimal.ZERO;
        }
        return procurementRecordStorages.stream()
                .map(ProcurementRecordStorage::getInboundNum)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
    }
    @Override
    public int add(ProcurementAddDto procurementDto) {
        LoginUser loginUser = SecurityUtils.getLoginUser();
        // æ‰¹é‡æ–°å¢ž
        for (Details detail : procurementDto.getDetails()) {
            // æŸ¥è¯¢é‡‡è´­å…¥åº“数量
            LambdaQueryWrapper<ProcurementRecordStorage> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
            procurementRecordLambdaQueryWrapper.eq(ProcurementRecordStorage::getSalesLedgerProductId, detail.getId());
            procurementRecordLambdaQueryWrapper.eq(ProcurementRecordStorage::getSalesLedgerProductId, detail.getId())
                    .eq(ProcurementRecordStorage::getType, procurementDto.getType());
            Long aLong = procurementRecordMapper.selectCount(procurementRecordLambdaQueryWrapper);
            ProcurementRecordStorage.ProcurementRecordStorageBuilder procurementRecordBuilder = ProcurementRecordStorage.builder()
                    .salesLedgerProductId(detail.getId())
                    .inboundBatches(aLong.equals(0L) ? "第1批次" : "第"+ (aLong + 1) + "批次")
                    .inboundBatches(aLong.equals(0L) ? "第1批次("+ procurementDto.getTypeName() +")" : "第"+ (aLong + 1) + "批次(" + procurementDto.getTypeName() + ")" )
                    .inboundNum(detail.getInboundQuantity())
                    .type(procurementDto.getType())
                    .warnNum(detail.getWarnNum())
                    .unitPrice(detail.getTaxInclusiveUnitPrice())
                    .totalPrice(detail.getInboundQuantity().multiply(detail.getTaxInclusiveUnitPrice()))
                    .createTime(LocalDateTime.now())
                    .createUser(loginUser.getUserId())
                    .updateTime(LocalDateTime.now())
@@ -380,7 +701,8 @@
            return procurementPageDtoIPage;
        }
        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect);
        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect)
                .eq(ProcurementRecordOut::getType, 1);
        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
        if(CollectionUtils.isEmpty( procurementRecords)){
            return procurementPageDtoIPage;
@@ -420,6 +742,7 @@
        }
        LambdaQueryWrapper<ProcurementRecordOut> procurementRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        procurementRecordLambdaQueryWrapper.in(ProcurementRecordOut::getProcurementRecordStorageId, collect);
        procurementRecordLambdaQueryWrapper.eq(ProcurementRecordOut::getType,1);
        List<ProcurementRecordOut> procurementRecords = procurementRecordOutMapper.selectList(procurementRecordLambdaQueryWrapper);
        if(CollectionUtils.isEmpty( procurementRecords)){
            return procurementPageDtoCopyIPage;
@@ -427,12 +750,13 @@
        for (ProcurementPageDtoCopy dto : procurementPageDtoCopyList) {
            // æ ¹æ®é‡‡è´­å°è´¦ID筛选对应的出库记录
            List<ProcurementRecordOut> collect1 = procurementRecords.stream()
                    .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId()))
                    .filter(ProcurementRecordOut -> ProcurementRecordOut.getProcurementRecordStorageId().equals(dto.getId()) && ProcurementRecordOut.getType().equals(1))
                    .collect(Collectors.toList());
            // å¦‚果没有相关的出库记录,跳过该条数据
            if(CollectionUtils.isEmpty(collect1)){
                dto.setInboundNum0(dto.getInboundNum());
                dto.setTotalInboundNum(BigDecimal.ZERO);
                continue;
            }
@@ -444,6 +768,10 @@
            dto.setTotalInboundNum(totalInboundNum);
            // å¾…出库数量 = æ€»æ•°é‡ - å·²å‡ºåº“数量
            dto.setInboundNum0(dto.getInboundNum().subtract(totalInboundNum));
            // åº“存价值
            if(dto.getUnitPrice() != null){
                dto.setTotalPrice(dto.getInboundNum0().multiply(dto.getUnitPrice()));
            }
        }
        return procurementPageDtoCopyIPage;
    }
src/main/java/com/ruoyi/production/controller/ProductionOrderController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,90 @@
package com.ruoyi.production.controller;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.OrderUtils;
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.production.mapper.ProductionOrderMapper;
import com.ruoyi.production.pojo.ProductionOrder;
import com.ruoyi.production.service.ProductionOrderService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
/**
 * @author :yys
 * @date : 2025/11/26 14:21
 */
@RestController
@Api(tags = "生产订单")
@RequestMapping("/productionOrder")
public class ProductionOrderController extends BaseController {
    @Autowired
    private ProductionOrderService productionOrderService;
    @Autowired
    private ProductionOrderMapper productionOrderMapper;
    @GetMapping("/listPage")
    @Log(title = "生产订单-分页查询", businessType = BusinessType.OTHER)
    @ApiOperation("生产订单-分页查询")
    public AjaxResult listPage(Page page, ProductionOrder productionOrder) {
        return productionOrderService.listPage(page, productionOrder);
    }
    @PostMapping("/addProductionOrder")
    @Log(title = "生产订单-新增", businessType = BusinessType.INSERT)
    @ApiOperation("生产订单-新增")
    public AjaxResult addProductionOrder(@RequestBody ProductionOrder productionOrder) {
        String scdd = OrderUtils.countTodayByCreateTime(productionOrderMapper, "SCDD");
        productionOrder.setOrderNo(scdd);
        return AjaxResult.success(productionOrderService.save(productionOrder));
    }
    @PostMapping("/updateProductionOrder")
    @Log(title = "生产订单-修改", businessType = BusinessType.UPDATE)
    @ApiOperation("生产订单-修改")
    public AjaxResult updateProductionOrder(@RequestBody ProductionOrder productionOrder) {
        return AjaxResult.success(productionOrderService.updateById(productionOrder));
    }
    @DeleteMapping("/deleteProductionOrder")
    @Log(title = "生产订单-删除", businessType = BusinessType.DELETE)
    @ApiOperation("生产订单-删除")
    public AjaxResult deleteProductionOrder(@RequestBody List<Long> ids) {
        if (CollectionUtils.isEmpty(ids)) return AjaxResult.error("请传入要删除的ID");
        return AjaxResult.success(productionOrderService.removeBatchByIds(ids));
    }
    /**
     * å¯¼å‡º
     * @param response
     */
    @PostMapping("/export")
    @ApiOperation("生产管理-生产订单-导出")
    @Log(title = "生产订单-导出", businessType = BusinessType.EXPORT)
    public void export(HttpServletResponse response) {
        productionOrderService.export(response);
    }
    /**
     * å¯¼å‡º
     * @param response
     */
    @PostMapping("/exportOne")
    @ApiOperation("生产管理-生产派工-导出")
    @Log(title = "生产订单-导出", businessType = BusinessType.EXPORT)
    public void exportOne(HttpServletResponse response) {
        productionOrderService.exportOne(response);
    }
}
src/main/java/com/ruoyi/production/controller/SalesLedgerProductionAccountingController.java
@@ -7,7 +7,6 @@
import com.ruoyi.framework.web.controller.BaseController;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.production.dto.SalesLedgerProductionAccountingDto;
import com.ruoyi.production.pojo.SalesLedgerProductionAccounting;
import com.ruoyi.production.service.impl.SalesLedgerProductionAccountingServiceImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
src/main/java/com/ruoyi/production/controller/SalesLedgerSchedulingController.java
@@ -7,10 +7,8 @@
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.procurementrecord.dto.ProcurementDto;
import com.ruoyi.production.dto.ProcessSchedulingDto;
import com.ruoyi.production.dto.ProductionDispatchAddDto;
import com.ruoyi.production.dto.SalesLedgerSchedulingDto;
import com.ruoyi.production.dto.SalesLedgerSchedulingProcessDto;
import com.ruoyi.production.service.impl.SalesLedgerSchedulingServiceImpl;
import io.swagger.annotations.Api;
@@ -35,34 +33,25 @@
    private SalesLedgerSchedulingServiceImpl salesLedgerSchedulingService;
    @GetMapping("/listPage")
    @Log(title = "生产管理-生产订单-分页查询", businessType = BusinessType.OTHER)
    @ApiOperation("生产管理-生产订单-分页查询")
    public AjaxResult listPage(Page page, SalesLedgerSchedulingDto salesLedgerSchedulingDto) {
        IPage<SalesLedgerSchedulingDto> result = salesLedgerSchedulingService.listPage(page,salesLedgerSchedulingDto);
        return AjaxResult.success(result);
    }
//    @GetMapping("/listPage")
//    @Log(title = "生产管理-生产订单-分页查询", businessType = BusinessType.OTHER)
//    @ApiOperation("生产管理-生产订单-分页查询")
//    public AjaxResult listPage(Page page, SalesLedgerSchedulingDto salesLedgerSchedulingDto) {
//        IPage<SalesLedgerSchedulingDto> result = salesLedgerSchedulingService.listPage(page,salesLedgerSchedulingDto);
//        return AjaxResult.success(result);
//    }
    /**
     * å¯¼å‡º
     * @param response
     */
    @PostMapping("/export")
    @ApiOperation("生产管理-生产订单-导出")
    public void export(HttpServletResponse response) {
        salesLedgerSchedulingService.export(response);
    }
//    /**
//     * å¯¼å‡º
//     * @param response
//     */
//    @PostMapping("/export")
//    @ApiOperation("生产管理-生产订单-导出")
//    public void export(HttpServletResponse response) {
//        salesLedgerSchedulingService.export(response);
//    }
    /**
     * å¯¼å‡º
     * @param response
     */
    @PostMapping("/exportOne")
    @ApiOperation("生产管理-生产派工-导出")
    public void exportOne(HttpServletResponse response) {
        salesLedgerSchedulingService.exportOne(response);
    }
    @PostMapping("/productionDispatch")
    @Log(title = "生产管理-生产订单-生产派工", businessType = BusinessType.INSERT)
src/main/java/com/ruoyi/production/controller/SalesLedgerWorkController.java
@@ -7,12 +7,8 @@
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.production.dto.ProcessSchedulingDto;
import com.ruoyi.production.dto.ProductionReportDto;
import com.ruoyi.production.dto.SalesLedgerSchedulingProcessDto;
import com.ruoyi.production.dto.SalesLedgerWorkDto;
import com.ruoyi.production.pojo.SalesLedgerWork;
import com.ruoyi.production.service.SalesLedgerWorkService;
import com.ruoyi.production.service.impl.SalesLedgerWorkServiceImpl;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
src/main/java/com/ruoyi/production/dto/DaiDto.java
@@ -1,13 +1,13 @@
package com.ruoyi.production.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.util.Date;
import java.time.LocalDate;
/**
 * @author :yys
@@ -19,92 +19,59 @@
    @Excel(name = "待排数量")
    private BigDecimal daiNum;
    @ApiModelProperty(value = "销售产品ID")
    private Long salesLedgerProductId;
    @ApiModelProperty(value = "销售台账ID")
    private Long salesLedgerId;
    /**
     * é”€å”®åˆåŒå·
     * ç”Ÿäº§è®¢å•号
     */
    @Excel(name = "销售合同号")
    @ApiModelProperty(value = "销售合同号")
    private String salesContractNo;
    /**
     * å®¢æˆ·åˆåŒå·
     */
    @Excel(name = "客户合同号")
    @ApiModelProperty(value = "客户合同号")
    private String customerContractNo;
    /**
     * é¡¹ç›®åç§°
     */
    @Excel(name = "项目名称")
    @ApiModelProperty(value = "项目名称")
    private String projectName;
    /**
     * å½•入日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "录入日期", width = 30, dateFormat = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "录入日期")
    private Date entryDate;
    @ApiModelProperty(value = "录入日期开始")
    private String entryDateStart;
    @ApiModelProperty(value = "录入日期结束")
    private String entryDateEnd;
    /**
     * å®¢æˆ·åç§°
     */
    @Excel(name = "客户名称")
    @ApiModelProperty(value = "客户名称")
    private String customerName;
    @Excel(name = "生产订单号")
    private String orderNo;
    /**
     * äº§å“å¤§ç±»
     */
    @Excel(name = "产品大类")
    @ApiModelProperty(value = "产品大类")
    private String productCategory;
    /**
     * è§„格型号
     */
    @Excel(name = "规格型号")
    @ApiModelProperty(value = "规格型号")
    private String specificationModel;
    /**
     * å•位
     */
    @Excel(name = "单位")
    @ApiModelProperty(value = "单位")
    private String unit;
    /**
     * æ•°é‡
     */
    @Excel(name = "数量")
    @ApiModelProperty(value = "数量")
    private BigDecimal quantity;
    /**
     * æŽ’产数量
     * è®¢å•状态
     */
    @Excel(name = "排产数量")
    @ApiModelProperty(value = "排产数量")
    private BigDecimal schedulingNum;
    @Excel(name = "订单状态")
    @TableField(exist = false)
    private String status;
    @ApiModelProperty(value = "租户ID")
    private Long tenantId;
    @ApiModelProperty(value = "完工数量")
    @TableField(exist = false)
    private BigDecimal successNum;
    /**
     * å½•入日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @Excel(name = "录入日期", width = 30, dateFormat = "yyyy-MM-dd")
    private LocalDate registerDate;
    /**
     * å½•入人
     */
    @Excel(name = "录入人")
    private String createBy;
}
src/main/java/com/ruoyi/production/dto/ProcessSchedulingDto.java
@@ -5,7 +5,6 @@
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
 * @author :yys
@@ -15,6 +14,26 @@
@ApiModel
public class ProcessSchedulingDto {
    /**
     * å£å‘³åˆ†ç±»
     */
    private String type;
    /**
     * å¤‡æ³¨
     */
    private String remark;
    /**
     * æŸè€—
     */
    private String loss;
    /**
     * é¢†ç”¨
     */
    private String receive;
    private Long id;
    /**
src/main/java/com/ruoyi/production/dto/ProductionDispatchAddDto.java
@@ -17,7 +17,7 @@
    @ApiModelProperty(value = "销售台账ID")
    private Long salesLedgerId;
    @ApiModelProperty(value = "销售产品ID")
    @ApiModelProperty(value = "生产订单ID")
    private Long salesLedgerProductId;
    /**
src/main/java/com/ruoyi/production/dto/SalesLedgerProductDto.java
@@ -1,13 +1,9 @@
package com.ruoyi.production.dto;
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;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
 * @author :yys
@@ -17,34 +13,34 @@
@ApiModel
public class SalesLedgerProductDto {
    /**
     * é”€å”®åˆåŒå·
     */
    @Excel(name = "销售合同号")
    @ApiModelProperty(value = "销售合同号")
    private String salesContractNo;
    /**
     * å®¢æˆ·åˆåŒå·
     */
    @Excel(name = "客户合同号")
    @ApiModelProperty(value = "客户合同号")
    private String customerContractNo;
    /**
     * é¡¹ç›®åç§°
     */
    @Excel(name = "项目名称")
    @ApiModelProperty(value = "项目名称")
    private String projectName;
//    /**
//     * é”€å”®åˆåŒå·
//     */
//    @Excel(name = "销售合同号")
//    @ApiModelProperty(value = "销售合同号")
//    private String salesContractNo;
//
//    /**
//     * å®¢æˆ·åˆåŒå·
//     */
//    @Excel(name = "客户合同号")
//    @ApiModelProperty(value = "客户合同号")
//    private String customerContractNo;
//
//    /**
//     * é¡¹ç›®åç§°
//     */
//    @Excel(name = "项目名称")
//    @ApiModelProperty(value = "项目名称")
//    private String projectName;
    /**
     * å®¢æˆ·åç§°
     * ç”Ÿäº§è®¢å•号
     */
    @Excel(name = "客户名称")
    @ApiModelProperty(value = "客户名称")
    private String customerName;
    @Excel(name = "生产订单号")
    @ApiModelProperty(value = "生产订单号")
    private String orderNo;
    /**
src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingDto.java
@@ -1,7 +1,5 @@
package com.ruoyi.production.dto;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModel;
@@ -10,7 +8,6 @@
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date;
/**
src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingProcessDto.java
@@ -1,7 +1,5 @@
package com.ruoyi.production.dto;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModel;
@@ -20,11 +18,8 @@
@ApiModel
public class SalesLedgerSchedulingProcessDto {
    @ApiModelProperty(value = "销售产品ID")
    @ApiModelProperty(value = "生产订单ID")
    private Long salesLedgerProductId;
    @ApiModelProperty(value = "销售台账ID")
    private Long salesLedgerId;
    @ApiModelProperty(value = "开始时间")
    private String entryDateStart;
@@ -38,38 +33,17 @@
    private Long id;
    /**
     * é”€å”®åˆåŒå·
     * ç”Ÿäº§è®¢å•号
     */
    @Excel(name = "销售合同号")
    @ApiModelProperty(value = "销售合同号")
    private String salesContractNo;
    /**
     * å®¢æˆ·åˆåŒå·
     */
    @Excel(name = "客户合同号")
    @ApiModelProperty(value = "客户合同号")
    private String customerContractNo;
    /**
     * é¡¹ç›®åç§°
     */
    @Excel(name = "项目名称")
    @ApiModelProperty(value = "项目名称")
    private String projectName;
    @Excel(name = "生产订单号")
    @ApiModelProperty(value = "生产订单号")
    private String orderNo;
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "派工日期", width = 30, dateFormat = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "派工日期")
    private Date schedulingDate;
    /**
     * å®¢æˆ·åç§°
     */
    @Excel(name = "客户名称")
    @ApiModelProperty(value = "客户名称")
    private String customerName;
    /**
src/main/java/com/ruoyi/production/dto/SalesLedgerWorkDto.java
@@ -6,7 +6,6 @@
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
/**
 * @author :yys
@@ -86,5 +85,29 @@
    @Excel(name = "状态", readConverterExp = "1=待生产,2=生产中,3=已报工")
    private String statusName;
    /**
     * å£å‘³åˆ†ç±»
     */
    @ApiModelProperty(value = "口味分类")
    private String type;
    /**
     * å¤‡æ³¨
     */
    @ApiModelProperty(value = "备注")
    private String remark;
    /**
     * æŸè€—
     */
    @ApiModelProperty(value = "损耗")
    private String loss;
    /**
     * é¢†ç”¨
     */
    @ApiModelProperty(value = "领用")
    private String receive;
}
src/main/java/com/ruoyi/production/mapper/ProductionOrderMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.ruoyi.production.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.production.pojo.ProductionOrder;
/**
 * @author :yys
 * @date : 2025/11/26 14:18
 */
public interface ProductionOrderMapper extends BaseMapper<ProductionOrder> {
}
src/main/java/com/ruoyi/production/pojo/ProductionOrder.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,139 @@
package com.ruoyi.production.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
 * @author :yys
 * @date : 2025/11/26 14:15
 */
@Data
@TableName("production_order")
public class ProductionOrder {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "录入日期开始")
    @TableField(exist = false)
    private String entryDateStart;
    @ApiModelProperty(value = "录入日期结束")
    @TableField(exist = false)
    private String entryDateEnd;
    /**
     * ç”Ÿäº§è®¢å•号
     */
    @Excel(name = "生产订单号")
    @ApiModelProperty(value = "生产订单号")
    private String orderNo;
    /**
     * äº§å“å¤§ç±»
     */
    @Excel(name = "产品大类")
    @ApiModelProperty(value = "产品大类")
    private String productCategory;
    /**
     * è§„格型号
     */
    @Excel(name = "规格型号")
    @ApiModelProperty(value = "规格型号")
    private String specificationModel;
    /**
     * å•位
     */
    @Excel(name = "单位")
    @ApiModelProperty(value = "单位")
    private String unit;
    /**
     * æ•°é‡
     */
    @Excel(name = "数量")
    @ApiModelProperty(value = "数量")
    private BigDecimal quantity;
    /**
     * è®¢å•状态
     */
    @Excel(name = "订单状态")
    @TableField(exist = false)
    private String status = "未完成";
    /**
     * æŽ’产数量
     */
    @Excel(name = "排产数量")
    @ApiModelProperty(value = "排产数量")
    @TableField(exist = false)
    private BigDecimal schedulingNum;
    /**
     * å®Œå·¥æ•°é‡
     */
    @Excel(name = "完工数量")
    @ApiModelProperty(value = "完工数量")
    @TableField(exist = false)
    private BigDecimal successNum = BigDecimal.ZERO;
    /**
     * å½•入日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @Excel(name = "录入日期", width = 30, dateFormat = "yyyy-MM-dd")
    @ApiModelProperty(value = "录入日期")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private LocalDate registerDate;
    /**
     * å½•入人
     */
    @Excel(name = "录入人")
    @ApiModelProperty(value = "录入人")
    private String createBy;
    /**
     * åˆ›å»ºè€…
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     * ä¿®æ”¹è€…
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
src/main/java/com/ruoyi/production/pojo/SalesLedgerScheduling.java
@@ -28,7 +28,7 @@
    private Long salesLedgerId;
    /**
     * é”€å”®äº§å“id
     * ç”Ÿäº§è®¢å•id
     */
    private Long salesLedgerProductId;
src/main/java/com/ruoyi/production/pojo/SalesLedgerWork.java
@@ -33,7 +33,7 @@
    private Long salesLedgerId;
    /**
     * é”€å”®äº§å“id
     * ç”Ÿäº§è®¢å•id
     */
    private Long salesLedgerProductId;
@@ -67,6 +67,26 @@
     * å·¥åº
     */
    private String process;
    /**
     * å£å‘³åˆ†ç±»
     */
    private String type;
    /**
     * å¤‡æ³¨
     */
    private String remark;
    /**
     * æŸè€—
     */
    private String loss;
    /**
     * é¢†ç”¨
     */
    private String receive;
    /**
     * æŽ’产日期
     */
src/main/java/com/ruoyi/production/service/ProductionOrderService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.production.service;
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.production.pojo.ProductionOrder;
import javax.servlet.http.HttpServletResponse;
/**
 * @author :yys
 * @date : 2025/11/26 14:19
 */
public interface ProductionOrderService extends IService<ProductionOrder> {
    AjaxResult listPage(Page page, ProductionOrder productionOrder);
    void export(HttpServletResponse response);
    void exportOne(HttpServletResponse response);
}
src/main/java/com/ruoyi/production/service/SalesLedgerSchedulingService.java
@@ -29,6 +29,4 @@
    int productionDispatchDelete(List<Long> ids);
    int processScheduling(List<ProcessSchedulingDto> processSchedulingDto);
    void exportOne(HttpServletResponse response);
}
src/main/java/com/ruoyi/production/service/SalesLedgerWorkService.java
@@ -3,7 +3,6 @@
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.production.dto.ProductionReportDto;
import com.ruoyi.production.dto.SalesLedgerWorkDto;
import com.ruoyi.production.pojo.SalesLedgerWork;
src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,147 @@
package com.ruoyi.production.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.production.dto.DaiDto;
import com.ruoyi.production.mapper.ProductionOrderMapper;
import com.ruoyi.production.mapper.SalesLedgerSchedulingMapper;
import com.ruoyi.production.mapper.SalesLedgerWorkMapper;
import com.ruoyi.production.pojo.ProductionOrder;
import com.ruoyi.production.pojo.SalesLedgerScheduling;
import com.ruoyi.production.pojo.SalesLedgerWork;
import com.ruoyi.production.service.ProductionOrderService;
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.util.CollectionUtils;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
/**
 * @author :yys
 * @date : 2025/11/26 14:20
 */
@Service
@Slf4j
public class ProductionOrderServiceImpl extends ServiceImpl<ProductionOrderMapper, ProductionOrder> implements ProductionOrderService {
    @Autowired
    private ProductionOrderMapper productionOrderMapper;
    @Autowired
    private SalesLedgerWorkMapper salesLedgerWorkMapper;
    @Autowired
    private SalesLedgerSchedulingMapper salesLedgerSchedulingMapper;
    @Override
    public AjaxResult listPage(Page page, ProductionOrder productionOrder) {
        LambdaQueryWrapper<ProductionOrder> productionOrderLambdaQueryWrapper = new LambdaQueryWrapper<>();
        if(productionOrder != null){
            if(StringUtils.isNotEmpty(productionOrder.getOrderNo())){
                productionOrderLambdaQueryWrapper.like(ProductionOrder::getOrderNo, productionOrder.getOrderNo());
            }
            if(StringUtils.isNotEmpty(productionOrder.getProductCategory())){
                productionOrderLambdaQueryWrapper.like(ProductionOrder::getProductCategory, productionOrder.getProductCategory());
            }
            if(StringUtils.isNotEmpty(productionOrder.getEntryDateStart()) && StringUtils.isNotEmpty(productionOrder.getEntryDateEnd())){
                productionOrderLambdaQueryWrapper.ge(ProductionOrder::getRegisterDate, productionOrder.getEntryDateStart())
                        .le(ProductionOrder::getRegisterDate, productionOrder.getEntryDateEnd());
            }
        }
        IPage<ProductionOrder> list = productionOrderMapper.selectPage(page,productionOrderLambdaQueryWrapper);
        if(CollectionUtils.isEmpty(list.getRecords())){
            return AjaxResult.success(list);
        }
        Set<Long> collect = list.getRecords().stream().map(ProductionOrder::getId).collect(Collectors.toSet());
        // èŽ·å–æŽ’äº§æ•°é‡
        LambdaQueryWrapper<SalesLedgerScheduling> salesLedgerSchedulingLambdaQueryWrapper = new LambdaQueryWrapper<>();
        salesLedgerSchedulingLambdaQueryWrapper.in(SalesLedgerScheduling::getSalesLedgerProductId, collect);
        List<SalesLedgerScheduling> salesLedgerSchedulings = salesLedgerSchedulingMapper.selectList(salesLedgerSchedulingLambdaQueryWrapper);
        // è®¡ç®—完工数量
        LambdaQueryWrapper<SalesLedgerWork> salesLedgerWorkLambdaQueryWrapper = new LambdaQueryWrapper<>();
        salesLedgerWorkLambdaQueryWrapper.in(SalesLedgerWork::getSalesLedgerProductId, collect)
                .ne(SalesLedgerWork::getStatus, 1);
        List<SalesLedgerWork> salesLedgerWorks = salesLedgerWorkMapper.selectList(salesLedgerWorkLambdaQueryWrapper);
        list.getRecords().forEach(i -> {
            // èŽ·å–æŽ’äº§æ•°é‡
            i.setSchedulingNum(salesLedgerSchedulings
                    .stream()
                    .filter(j -> j.getSalesLedgerProductId().equals(i.getId()))
                    .map(SalesLedgerScheduling::getSchedulingNum)
                    .reduce(BigDecimal.ZERO, BigDecimal::add));
            // èŽ·å–å®Œæˆæ•°é‡
            i.setSuccessNum(salesLedgerWorks
                    .stream()
                    .filter(j -> j.getSalesLedgerProductId().equals(i.getId()))
                    .map(SalesLedgerWork::getFinishedNum)
                    .reduce(BigDecimal.ZERO, BigDecimal::add));
            // çŠ¶æ€ = æ•°é‡å’Œå®Œå·¥æ•°é‡æ¯”较
            if(i.getSchedulingNum().compareTo(i.getSuccessNum()) == 0){
                i.setStatus("已完成");
            }else{
                i.setStatus("未完成");
            }
        });
        return AjaxResult.success(list);
    }
    @Override
    public void export(HttpServletResponse response) {
        List<ProductionOrder> list = this.list();
        if(CollectionUtils.isEmpty(list)){
            throw new RuntimeException("无导出数据");
        }
        Set<Long> collect = list.stream().map(ProductionOrder::getId).collect(Collectors.toSet());
        LambdaQueryWrapper<SalesLedgerWork> salesLedgerWorkLambdaQueryWrapper = new LambdaQueryWrapper<>();
        salesLedgerWorkLambdaQueryWrapper.in(SalesLedgerWork::getSalesLedgerProductId, collect)
                .ne(SalesLedgerWork::getStatus, 1);
        List<SalesLedgerWork> salesLedgerWorks = salesLedgerWorkMapper.selectList(salesLedgerWorkLambdaQueryWrapper);
        list.forEach(i -> {
            // èŽ·å–å®Œæˆæ•°é‡
            i.setSuccessNum(salesLedgerWorks
                    .stream()
                    .filter(j -> j.getSalesLedgerProductId().equals(i.getId()))
                    .map(SalesLedgerWork::getFinishedNum)
                    .reduce(BigDecimal.ZERO, BigDecimal::add));
            // çŠ¶æ€ = æ•°é‡å’Œå®Œå·¥æ•°é‡æ¯”较
            if(i.getQuantity().compareTo(i.getSuccessNum()) == 0){
                i.setStatus("已完成");
            }else{
                i.setStatus("未完成");
            }
        });
        ExcelUtil<ProductionOrder> util = new ExcelUtil<>(ProductionOrder.class);
        util.exportExcel(response, list, "生产订单");
    }
    @Override
    public void exportOne(HttpServletResponse response) {
        List<ProductionOrder> list = this.list();
        if(CollectionUtils.isEmpty(list)){
            throw new RuntimeException("无导出数据");
        }
        List<DaiDto> dais = new ArrayList<>();
        list.forEach(i -> {
            DaiDto daiDto = new DaiDto();
            BeanUtils.copyProperties(i, daiDto);
            // èŽ·å–å¾…æŽ’äº§æ•°é‡
            daiDto.setDaiNum(daiDto.getQuantity().subtract(i.getSuccessNum()));
            dais.add(daiDto);
        });
        ExcelUtil<DaiDto> util = new ExcelUtil<>(DaiDto.class);
        util.exportExcel(response, dais, "生产派工");
    }
}
src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java
@@ -5,8 +5,10 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto;
import com.ruoyi.production.dto.*;
import com.ruoyi.production.dto.ProcessSchedulingDto;
import com.ruoyi.production.dto.ProductionDispatchAddDto;
import com.ruoyi.production.dto.SalesLedgerSchedulingDto;
import com.ruoyi.production.dto.SalesLedgerSchedulingProcessDto;
import com.ruoyi.production.mapper.SalesLedgerSchedulingMapper;
import com.ruoyi.production.mapper.SalesLedgerWorkMapper;
import com.ruoyi.production.pojo.SalesLedgerScheduling;
@@ -16,7 +18,6 @@
import com.ruoyi.project.system.mapper.SysUserMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@@ -24,7 +25,6 @@
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
@@ -152,10 +152,6 @@
            SysUser sysUser = sysUserMapper.selectUserById(processSchedulingDto.getSchedulingUserId());
            if(sysUser == null) throw new RuntimeException("排产人不存在");
            salesLedgerScheduling.setFinishedNum(salesLedgerScheduling.getFinishedNum().add(processSchedulingDto.getSchedulingNum()));
            LambdaQueryWrapper<SalesLedgerWork> salesLedgerWorkLambdaQueryWrapper = new LambdaQueryWrapper<>();
            salesLedgerWorkLambdaQueryWrapper.eq(SalesLedgerWork::getSalesLedgerSchedulingId, salesLedgerScheduling.getId())
                    .ne(SalesLedgerWork::getStatus, 1);
            List<SalesLedgerWork> salesLedgerWorks = salesLedgerWorkMapper.selectList(salesLedgerWorkLambdaQueryWrapper);
            if(salesLedgerScheduling.getSchedulingNum().compareTo(salesLedgerScheduling.getFinishedNum()) < 0){
                throw new RuntimeException("当前排产数量大于待排产数量,请仔细核对!");
            }
@@ -171,6 +167,10 @@
                    .salesLedgerProductId(salesLedgerScheduling.getSalesLedgerProductId())
                    .schedulingUserId(salesLedgerScheduling.getSchedulingUserId())
                    .schedulingUserName(sysUser.getNickName())
                    .type(processSchedulingDto.getType())
                    .remark(processSchedulingDto.getRemark())
                    .loss(processSchedulingDto.getLoss())
                    .receive(processSchedulingDto.getReceive())
                    .schedulingNum(processSchedulingDto.getSchedulingNum())
                    .workHours(processSchedulingDto.getWorkHours())
                    .process(processSchedulingDto.getProcess())
@@ -181,21 +181,4 @@
        return 0;
    }
    @Override
    public void exportOne(HttpServletResponse response) {
        List<SalesLedgerSchedulingDto> list = salesLedgerSchedulingMapper.list();
        if(CollectionUtils.isEmpty(list)){
            throw new RuntimeException("无导出数据");
        }
        List<DaiDto> dais = new ArrayList<>();
        list.forEach(i -> {
            DaiDto daiDto = new DaiDto();
            BeanUtils.copyProperties(i, daiDto);
            // èŽ·å–å¾…æŽ’äº§æ•°é‡
            daiDto.setDaiNum(daiDto.getQuantity().subtract(i.getSchedulingNum()));
            dais.add(daiDto);
        });
        ExcelUtil<DaiDto> util = new ExcelUtil<>(DaiDto.class);
        util.exportExcel(response, dais, "生产派工");
    }
}
src/main/java/com/ruoyi/production/service/impl/SalesLedgerWorkServiceImpl.java
@@ -4,14 +4,12 @@
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.framework.web.domain.AjaxResult;
import com.ruoyi.production.dto.ProductionReportDto;
import com.ruoyi.production.dto.SalesLedgerWorkDto;
import com.ruoyi.production.mapper.SalesLedgerProductionAccountingMapper;
import com.ruoyi.production.mapper.SalesLedgerWorkMapper;
import com.ruoyi.production.pojo.SalesLedgerProductionAccounting;
import com.ruoyi.production.pojo.SalesLedgerWork;
import com.ruoyi.production.service.SalesLedgerProductionAccountingService;
import com.ruoyi.production.service.SalesLedgerWorkService;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysUserMapper;
src/main/java/com/ruoyi/project/system/controller/SysDeptController.java
@@ -1,6 +1,8 @@
package com.ruoyi.project.system.controller;
import java.util.List;
import com.ruoyi.common.utils.SecurityUtils;
import org.apache.commons.lang3.ArrayUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
@@ -81,6 +83,7 @@
            return error("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在");
        }
        dept.setCreateBy(getUsername());
        dept.setTenantId(SecurityUtils.getLoginUser().getTenantId());
        return toAjax(deptService.insertDept(dept));
    }
src/main/java/com/ruoyi/project/system/controller/SysPostController.java
@@ -2,6 +2,8 @@
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import com.ruoyi.common.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
@@ -86,6 +88,7 @@
            return error("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在");
        }
        post.setCreateBy(getUsername());
        post.setTenantId(SecurityUtils.getLoginUser().getTenantId());
        return toAjax(postService.insertPost(post));
    }
src/main/java/com/ruoyi/project/system/controller/SysRoleController.java
@@ -2,6 +2,8 @@
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import com.ruoyi.common.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated;
@@ -93,15 +95,16 @@
    @PostMapping
    public AjaxResult add(@Validated @RequestBody SysRole role)
    {
        if (!roleService.checkRoleNameUnique(role))
        {
            return error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在");
        }
        else if (!roleService.checkRoleKeyUnique(role))
        {
            return error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在");
        }
//        if (!roleService.checkRoleNameUnique(role))
//        {
//            return error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在");
//        }
//        else if (!roleService.checkRoleKeyUnique(role))
//        {
//            return error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在");
//        }
        role.setCreateBy(getUsername());
        role.setTenantId(SecurityUtils.getLoginUser().getTenantId());
        return toAjax(roleService.insertRole(role));
    }
@@ -116,14 +119,14 @@
    {
        roleService.checkRoleAllowed(role);
        roleService.checkRoleDataScope(role.getRoleId());
        if (!roleService.checkRoleNameUnique(role))
        {
            return error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在");
        }
        else if (!roleService.checkRoleKeyUnique(role))
        {
            return error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在");
        }
//        if (!roleService.checkRoleNameUnique(role))
//        {
//            return error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在");
//        }
//        else if (!roleService.checkRoleKeyUnique(role))
//        {
//            return error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在");
//        }
        role.setUpdateBy(getUsername());
        
        if (roleService.updateRole(role) > 0)
src/main/java/com/ruoyi/project/system/controller/SysUserController.java
@@ -114,7 +114,8 @@
        }
        List<SysRole> roles = roleService.selectRoleAll();
        ajax.put("roles", SysUser.isAdmin(userId) ? roles : roles.stream().filter(r -> !r.isAdmin()).collect(Collectors.toList()));
        ajax.put("posts", postService.selectPostAll());
//        ajax.put("posts", postService.selectPostAll());
        ajax.put("posts", postService.selectPostByTenantId(SecurityUtils.getLoginUser().getTenantId()));
        SysUserDeptVo sysUserDeptVo = new SysUserDeptVo();
        sysUserDeptVo.setUserId(userId);
        List<SysUserDeptVo> sysUserDeptVos = userDeptService.userLoginFacotryList(sysUserDeptVo);
@@ -144,6 +145,7 @@
            return error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
        }
        user.setCreateBy(getUsername());
        user.setTenantId(SecurityUtils.getLoginUser().getTenantId());
        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
        return toAjax(userService.insertUser(user));
    }
@@ -278,8 +280,8 @@
    @GetMapping("/userListNoPageByTenantId")
    public AjaxResult userListNoPageByTenantId(SysUser user){
        //获取登录用户信息
        SysUser loginUser = SecurityUtils.getLoginUser().getUser();
        user.setTenantId(loginUser.getTenantId());
//        SysUser loginUser = SecurityUtils.getLoginUser().getUser();
        user.setTenantId(SecurityUtils.getLoginUser().getTenantId());
        List<SysUser> sysUserList = userService.userListNoPage(user);
        return AjaxResult.success(sysUserList);
    }
src/main/java/com/ruoyi/project/system/domain/SysDept.java
@@ -55,6 +55,16 @@
    /** éƒ¨é—¨ç¼–号 */
    private String deptNick;
    
    private Long tenantId;
    public Long getTenantId() {
        return tenantId;
    }
    public void setTenantId(Long tenantId) {
        this.tenantId = tenantId;
    }
    /** å­éƒ¨é—¨ */
    private List<SysDept> children = new ArrayList<SysDept>();
src/main/java/com/ruoyi/project/system/domain/SysPost.java
@@ -38,6 +38,16 @@
    @Excel(name = "状态", readConverterExp = "0=正常,1=停用")
    private String status;
    private Long tenantId;
    public Long getTenantId() {
        return tenantId;
    }
    public void setTenantId(Long tenantId) {
        this.tenantId = tenantId;
    }
    /** ç”¨æˆ·æ˜¯å¦å­˜åœ¨æ­¤å²—位标识 é»˜è®¤ä¸å­˜åœ¨ */
    private boolean flag = false;
src/main/java/com/ruoyi/project/system/domain/SysRole.java
@@ -4,6 +4,9 @@
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
@@ -64,6 +67,17 @@
    /** è§’色菜单权限 */
    private Set<String> permissions;
    /**租户id*/
    private Long tenantId;
    public Long getTenantId() {
        return tenantId;
    }
    public void setTenantId(Long tenantId) {
        this.tenantId = tenantId;
    }
    public SysRole()
    {
src/main/java/com/ruoyi/project/system/mapper/SysDeptMapper.java
@@ -122,4 +122,6 @@
     * @return
     */
    Long maxLevelDeptId(Long deptId);
    SysDept selectDeptByDeptName(@Param("deptName") String deptName);
}
src/main/java/com/ruoyi/project/system/mapper/SysPostMapper.java
@@ -2,6 +2,7 @@
import java.util.List;
import com.ruoyi.project.system.domain.SysPost;
import org.apache.ibatis.annotations.Param;
/**
 * å²—位信息 æ•°æ®å±‚
@@ -96,4 +97,6 @@
     * @return ç»“æžœ
     */
    public SysPost checkPostCodeUnique(String postCode);
    List<SysPost> selectPostByTenantId(@Param("tenantId") Long tenantId);
}
src/main/java/com/ruoyi/project/system/service/ISysDeptService.java
@@ -20,6 +20,14 @@
    public List<SysDept> selectDeptList(SysDept dept);
    /**
     * æ ¹æ®éƒ¨é—¨åç§°æŸ¥è¯¢éƒ¨é—¨ä¿¡æ¯
     *
     * @param deptName éƒ¨é—¨åç§°
     * @return éƒ¨é—¨ä¿¡æ¯é›†åˆ
     */
    public SysDept selectDeptByDeptName(String deptName);
    /**
     * æŸ¥è¯¢éƒ¨é—¨æ ‘结构信息
     * 
     * @param dept éƒ¨é—¨ä¿¡æ¯
src/main/java/com/ruoyi/project/system/service/ISysPostService.java
@@ -96,4 +96,6 @@
     * @return ç»“æžœ
     */
    public int updatePost(SysPost post);
    public List<SysPost> selectPostByTenantId(Long tenantId);
}
src/main/java/com/ruoyi/project/system/service/impl/SysDeptServiceImpl.java
@@ -42,12 +42,17 @@
     * @return éƒ¨é—¨ä¿¡æ¯é›†åˆ
     */
    @Override
    @DataScope(deptAlias = "d")
    @DataScope(tenantIdFelid = "d")
    public List<SysDept> selectDeptList(SysDept dept)
    {
        return deptMapper.selectDeptList(dept);
    }
    
    @Override
    public SysDept selectDeptByDeptName(String deptName) {
        return deptMapper.selectDeptByDeptName(deptName);
    }
    /**
     * æŸ¥è¯¢éƒ¨é—¨æ ‘结构信息
     * 
src/main/java/com/ruoyi/project/system/service/impl/SysPostServiceImpl.java
@@ -1,6 +1,9 @@
package com.ruoyi.project.system.service.impl;
import java.util.Collections;
import java.util.List;
import com.ruoyi.framework.aspectj.lang.annotation.DataScope;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.common.constant.UserConstants;
@@ -32,6 +35,7 @@
     * @return å²—位信息集合
     */
    @Override
    @DataScope(tenantIdFelid = "p")
    public List<SysPost> selectPostList(SysPost post)
    {
        return postMapper.selectPostList(post);
@@ -175,4 +179,10 @@
    {
        return postMapper.updatePost(post);
    }
    @Override
    @DataScope(tenantIdFelid = "p")
    public List<SysPost> selectPostByTenantId(Long tenantId) {
        return postMapper.selectPostByTenantId(tenantId);
    }
}
src/main/java/com/ruoyi/project/system/service/impl/SysRoleServiceImpl.java
@@ -52,7 +52,7 @@
     * @return è§’色数据集合信息
     */
    @Override
    @DataScope(deptAlias = "d")
    @DataScope(tenantIdFelid = "r")
    public List<SysRole> selectRoleList(SysRole role)
    {
        return roleMapper.selectRoleList(role);
src/main/java/com/ruoyi/project/system/service/impl/SysUserServiceImpl.java
@@ -72,7 +72,7 @@
     * @return ç”¨æˆ·ä¿¡æ¯é›†åˆä¿¡æ¯
     */
    @Override
    @DataScope(deptAlias = "d", userAlias = "u")
    @DataScope(tenantIdFelid = "u")
    public List<SysUser> selectUserList(SysUser user)
    {
        return userMapper.selectUserList(user);
src/main/java/com/ruoyi/purchase/dto/TicketRegistrationDto.java
@@ -19,6 +19,8 @@
@Data
@TableName("ticket_registration")
public class TicketRegistrationDto extends TicketRegistration {
    @TableField(exist = false)
    private Long userId;
    /**
     * ä¸»é”®ID
src/main/java/com/ruoyi/purchase/service/impl/PaymentRegistrationServiceImpl.java
@@ -10,6 +10,7 @@
import com.ruoyi.basic.pojo.SupplierManage;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.framework.aspectj.lang.annotation.DataScope;
import com.ruoyi.framework.security.LoginUser;
import com.ruoyi.purchase.dto.PaymentHistoryRecordVo;
import com.ruoyi.purchase.dto.PaymentLedgerDto;
src/main/java/com/ruoyi/purchase/service/impl/ProductRecordServiceImpl.java
@@ -5,6 +5,7 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.enums.FileNameType;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.purchase.dto.ProductRecordDto;
import com.ruoyi.purchase.dto.TicketRegistrationDto;
@@ -60,6 +61,8 @@
    @Override
    public IPage<ProductRecordDto> productRecordPage(Page page, TicketRegistrationDto ticketRegistrationDto) {
        Long userId = SecurityUtils.getUserId();
        ticketRegistrationDto.setUserId(userId);
        IPage<ProductRecordDto> productRecordDtoIPage1 = productRecordMapper.productRecordPage(page, ticketRegistrationDto);
        page.setSize(productRecordDtoIPage1.getTotal());
        IPage<ProductRecordDto> productRecordDtoIPage = productRecordMapper.productRecordPage(page, ticketRegistrationDto);
src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -114,7 +114,6 @@
    @Transactional(rollbackFor = Exception.class)
    public int addOrEditPurchase(PurchaseLedgerDto purchaseLedgerDto) throws IOException {
        SalesLedger salesLedger = salesLedgerMapper.selectById(purchaseLedgerDto.getSalesLedgerId());
        //录入人
        SysUser sysUser = userMapper.selectUserById(purchaseLedgerDto.getRecorderId());
@@ -127,7 +126,7 @@
        if(ObjectUtils.isNotEmpty(loginUser) && null != loginUser.getTenantId()) {
            purchaseLedger.setTenantId(loginUser.getTenantId());
        }
        purchaseLedger.setSalesContractNo(ObjectUtils.isNotEmpty(salesLedger) ? salesLedger.getSalesContractNo() : null);
        purchaseLedger.setSalesContractNo(purchaseLedgerDto.getSalesContractNo());
        purchaseLedger.setSupplierName(supplierManage.getSupplierName());
        purchaseLedger.setRecorderId(purchaseLedgerDto.getRecorderId());
        purchaseLedger.setRecorderName(sysUser.getNickName());
@@ -473,6 +472,8 @@
    @Override
    public IPage<PurchaseLedgerDto> selectPurchaseLedgerListPage(IPage ipage, PurchaseLedgerDto purchaseLedger) {
        Long userId = SecurityUtils.getUserId();
        purchaseLedger.setRecorderId(userId);
        IPage<PurchaseLedgerDto> purchaseLedgerDtoIPage = purchaseLedgerMapper.selectPurchaseLedgerListPage(ipage, purchaseLedger);
        purchaseLedgerDtoIPage.getRecords().forEach(purchaseLedgerDto -> {
            List<CommonFile> commonFiles = commonFileMapper.selectList(new LambdaQueryWrapper<CommonFile>().eq(CommonFile::getCommonId, purchaseLedgerDto.getId()).eq(CommonFile::getType, FileNameType.PURCHASELEDGER.getValue()));
src/main/java/com/ruoyi/purchase/service/impl/TicketRegistrationServiceImpl.java
@@ -10,6 +10,7 @@
import com.ruoyi.common.enums.SalesLedgerType;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.other.mapper.TempFileMapper;
@@ -343,6 +344,7 @@
        if (!ObjectUtils.isEmpty(ticketRegistration.getIssueDateStart()) && !ObjectUtils.isEmpty(ticketRegistration.getIssueDateEnd())) {
            queryWrapper.between(TicketRegistration::getIssueDate, LocalDate.parse(ticketRegistration.getIssueDateStart(), DateTimeFormatter.ofPattern("yyyy-MM-dd")), LocalDate.parse(ticketRegistration.getIssueDateEnd(), DateTimeFormatter.ofPattern("yyyy-MM-dd")));
        }
        queryWrapper.eq(TicketRegistration::getIssUerId, SecurityUtils.getUserId());
        IPage<TicketRegistration> ticketRegistrationIPage = ticketRegistrationMapper.selectPage(page, queryWrapper);
        // è®¡ç®—已付款金额
        if (CollectionUtils.isNotEmpty(ticketRegistrationIPage.getRecords())) {
src/main/java/com/ruoyi/tide/controller/TideController.java
@@ -1,5 +1,6 @@
package com.ruoyi.tide.controller;
import cn.hutool.core.collection.CollectionUtil;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.ruoyi.common.constant.Constants;
@@ -7,20 +8,28 @@
import com.ruoyi.framework.aspectj.lang.annotation.Anonymous;
import com.ruoyi.framework.security.service.SysLoginService;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.project.system.domain.SysDept;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.service.ISysDeptService;
import com.ruoyi.project.system.service.ISysUserService;
import com.ruoyi.tide.pojo.TidePojo;
import com.ruoyi.tide.utils.TideUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PreDestroy;
import javax.annotation.security.PermitAll;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -37,6 +46,9 @@
    @Autowired
    private ISysUserService userService;
    @Autowired
    private ISysDeptService deptService;
    @ApiOperation(value = "登录")
    @PostMapping("/tideLogin")
    public AjaxResult login(@RequestBody TidePojo tidePojo) {
@@ -52,12 +64,28 @@
    }
    @PostMapping("/applicationOrdering")
    @Transactional(rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED)
    public JSONObject order (@RequestBody TidePojo tidePojo) {
        SysUser user = userService.selectUserByUserName(tidePojo.getPltAccountLogin());
        String defaultPwd = "I73Kj+Mn$+SI";//默认开通密码固定写死
//        String randomString = TideUtils.getRandomString(12);
        //账号不存在,执行新增操作
        if(Objects.isNull(user)){
        if(ObjectUtils.isEmpty(user)){
            //1.先新增用户对应的公司
            SysDept dept = new SysDept();
            dept.setParentId(100L);//父公司id
            dept.setDeptName(tidePojo.getEnterpriseName());
            dept.setDeptNick(tidePojo.getEnterpriseName());
            dept.setOrderNum(0);
            boolean deptNameUnique = deptService.checkDeptNameUnique(dept);
            if (deptNameUnique){
                deptService.insertDept(dept);
            }
            //查询公司
            SysDept newSysDept = deptService.selectDeptByDeptName(dept.getDeptName());
            dept.setDeptId(ObjectUtils.isEmpty(newSysDept)?100L:newSysDept.getDeptId());
            dept.setTenantId(dept.getDeptId());
            deptService.updateDept(dept);
            user = new SysUser();
            String password = SecurityUtils.encryptPassword(defaultPwd);
            user.setPassword(password);
@@ -67,8 +95,9 @@
            user.setDelFlag("0");
            user.setPostIds(new Long[]{1L});
            user.setRoleId(1L);
            user.setRoleIds(new Long[]{2L});
            user.setDeptIds(new Long[]{100L});
            user.setRoleIds(new Long[]{2L});//默认普通角色
            user.setDeptIds(new Long[]{dept.getDeptId()});//绑定公司
            user.setTenantId(dept.getDeptId());
            userService.insertUser(user);
        }
        Map<String, Object> map = new HashMap<>();
src/main/java/com/ruoyi/tide/utils/TideUtils.java
@@ -26,7 +26,7 @@
    private final static String appSecret = "6g3GMjkxMjIwMjUxNDUzMDY4NzE2aH";
    // å†…网地址
    private final static String ip = "http://10.136.0.8:8083";
    private final static String ip = "http://58.56.84.138:8083";
    // MD5加密并转换为16进制
    public static String md5Encryption(String input) {
@@ -104,7 +104,7 @@
    /**
     * äº”分钟一次的心跳
     */
    @Scheduled(cron = "0 0/5 * * * ?")
//    @Scheduled(cron = "0 0/5 * * * ?")
    public static void heartbeat(){
        HashMap<String, String> header = getGetHeader(null);
        String url = ip + "/cpn/api/extra/v1/application/heartbeat";
src/main/java/com/ruoyi/vehicleInformationCollectionReview/controller/VehicleInformationCollectionController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,51 @@
package com.ruoyi.vehicleInformationCollectionReview.controller;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.vehicleInformationCollectionReview.dto.VehicleInformationCollectionReviewDTO;
import com.ruoyi.vehicleInformationCollectionReview.pojo.VehicleInformationCollectionReview;
import com.ruoyi.vehicleInformationCollectionReview.service.VehicleInformationCollectionReviewService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@Slf4j
@RestController
@RequestMapping("/environmentAccess")
public class VehicleInformationCollectionController {
    @Autowired
    private VehicleInformationCollectionReviewService vehicleInformationCollectionReviewService;
    // æŸ¥è¯¢è½¦è¾†ä¿¡æ¯åˆ†é¡µåˆ—表
    @GetMapping("/vehicleInfoPage")
    public AjaxResult vehicleInfoPage(Page page, VehicleInformationCollectionReview vehicleInformationCollectionReview){
        return AjaxResult.success(vehicleInformationCollectionReviewService.listPage(page,vehicleInformationCollectionReview));
    }
    // æ–°å¢žè½¦è¾†ä¿¡æ¯
    @PostMapping("/vehicleInfoAdd")
    public AjaxResult vehicleInfoAdd(@RequestBody VehicleInformationCollectionReview vehicleInformationCollectionReview){
        return AjaxResult.success(vehicleInformationCollectionReviewService.insert(vehicleInformationCollectionReview));
    }
    // ä¿®æ”¹è½¦è¾†ä¿¡æ¯
    @PutMapping("/vehicleInfoUpdate")
    public AjaxResult updateRecord(VehicleInformationCollectionReview vehicleInformationCollectionReview){
        return AjaxResult.success(vehicleInformationCollectionReviewService.updateById(vehicleInformationCollectionReview));
    }
    // åˆ é™¤è½¦è¾†ä¿¡æ¯ï¼ˆæ”¯æŒæ‰¹é‡ï¼‰
    @DeleteMapping("/vehicleInfoDelete")
    public AjaxResult removeRecords(@RequestBody List<Long> ids){
        return AjaxResult.success(vehicleInformationCollectionReviewService.removeBatchByIds(ids));
    }
    // å®¡æ ¸è½¦è¾†ä¿¡æ¯
    @PostMapping("/vehicleInfoReview")
    public AjaxResult vehicleInfoReview(@RequestBody VehicleInformationCollectionReviewDTO vehicleInformationCollectionReviewDTO){
        return AjaxResult.success(vehicleInformationCollectionReviewService.update(Wrappers.<VehicleInformationCollectionReview>lambdaUpdate()
                .set(VehicleInformationCollectionReview::getReviewStatus,vehicleInformationCollectionReviewDTO.getReviewStatus())
                .eq(VehicleInformationCollectionReview::getId,vehicleInformationCollectionReviewDTO.getId())));
    }
}
src/main/java/com/ruoyi/vehicleInformationCollectionReview/dto/VehicleInformationCollectionReviewDTO.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.vehicleInformationCollectionReview.dto;
import com.ruoyi.vehicleInformationCollectionReview.pojo.VehicleInformationCollectionReview;
import lombok.Data;
@Data
public class VehicleInformationCollectionReviewDTO extends VehicleInformationCollectionReview {
}
src/main/java/com/ruoyi/vehicleInformationCollectionReview/mapper/VehicleInformationCollectionReviewMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.vehicleInformationCollectionReview.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.vehicleInformationCollectionReview.pojo.VehicleInformationCollectionReview;
import org.apache.ibatis.annotations.Mapper;
/**
* @author 27233
* @description é’ˆå¯¹è¡¨ã€vehicle_information_collection_review】的数据库操作Mapper
* @createDate 2026-01-06 19:50:48
* @Entity com.ruoyi.pojo.VehicleInformationCollectionReview
*/
@Mapper
public interface VehicleInformationCollectionReviewMapper extends BaseMapper<VehicleInformationCollectionReview> {
}
src/main/java/com/ruoyi/vehicleInformationCollectionReview/pojo/VehicleInformationCollectionReview.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,116 @@
package com.ruoyi.vehicleInformationCollectionReview.pojo;
import com.baomidou.mybatisplus.annotation.*;
import java.time.LocalDateTime;
import java.util.Date;
import lombok.Data;
/**
 *
 * @TableName vehicle_information_collection_review
 */
@TableName(value ="vehicle_information_collection_review")
@Data
public class VehicleInformationCollectionReview {
    /**
     * ä¸»é”®id
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * è½¦ç‰Œå·ç 
     */
    private String plateNo;
    /**
     * å·ç‰Œé¢œè‰²
     */
    private String plateColor;
    /**
     * è½¦è¾†ç±»åž‹
     */
    private String carType;
    /**
     * è½¦è¾†è¯†åˆ«ä»£ç ((vin)
     */
    private String carVin;
    /**
     * è½¦è¾†åž‹å·
     */
    private String carModel;
    /**
     * å‘动机型号
     */
    private String engineModel;
    /**
     * å‘动机生产厂
     */
    private String engineProductFactory;
    /**
     * å‘动机编号
     */
    private String engineNo;
    /**
     * æŽ’放标准
     */
    private String emissionStandard;
    /**
     * æ³¨å†Œç™»è®°æ—¶é—´
     */
    private Date registeDate;
    /**
     * ä½¿ç”¨æ€§è´¨
     */
    private String natureOfUse;
    /**
     * ç‡ƒæ²¹ç±»åž‹
     */
    private String fuelType;
    /**
     * å®¡æ ¸çŠ¶æ€
     */
    private String reviewStatus;
    /**
     * ç§Ÿæˆ·id
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    /**
     * åˆ›å»ºäºº
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     * æ›´æ–°äºº
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * æ›´æ–°æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}
src/main/java/com/ruoyi/vehicleInformationCollectionReview/service/VehicleInformationCollectionReviewService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.vehicleInformationCollectionReview.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.vehicleInformationCollectionReview.pojo.VehicleInformationCollectionReview;
/**
* @author 27233
* @description é’ˆå¯¹è¡¨ã€vehicle_information_collection_review】的数据库操作Service
* @createDate 2026-01-06 19:50:48
*/
public interface VehicleInformationCollectionReviewService extends IService<VehicleInformationCollectionReview> {
    IPage<VehicleInformationCollectionReview> listPage(Page page, VehicleInformationCollectionReview vehicleInformationCollectionReview);
    long insert(VehicleInformationCollectionReview vehicleInformationCollectionReview);
}
src/main/java/com/ruoyi/vehicleInformationCollectionReview/service/impl/VehicleInformationCollectionReviewServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.ruoyi.vehicleInformationCollectionReview.service.impl;
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.QueryWrappers;
import com.ruoyi.vehicleInformationCollectionReview.mapper.VehicleInformationCollectionReviewMapper;
import com.ruoyi.vehicleInformationCollectionReview.pojo.VehicleInformationCollectionReview;
import com.ruoyi.vehicleInformationCollectionReview.service.VehicleInformationCollectionReviewService;
import org.springframework.stereotype.Service;
/**
* @author 27233
* @description é’ˆå¯¹è¡¨ã€vehicle_information_collection_review】的数据库操作Service实现
* @createDate 2026-01-06 19:50:48
*/
@Service
public class VehicleInformationCollectionReviewServiceImpl extends ServiceImpl<VehicleInformationCollectionReviewMapper, VehicleInformationCollectionReview>
    implements VehicleInformationCollectionReviewService{
    @Override
    public IPage<VehicleInformationCollectionReview> listPage(Page page, VehicleInformationCollectionReview vehicleInformationCollectionReview) {
        return baseMapper.selectPage(page, QueryWrappers.queryWrappers(vehicleInformationCollectionReview));
    }
    @Override
    public long insert(VehicleInformationCollectionReview vehicleInformationCollectionReview) {
        return baseMapper.insert(vehicleInformationCollectionReview);
    }
}
src/main/resources/application-cgglxt.yml
src/main/resources/application-sbglxt.yml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,222 @@
# èН坼-设备管理系统项目相关配置
inspur:
  appId: 1205969741508771840
  appSecret: rnAvMDYwMTIwMjYxNzM0MTc4NDEIxC
ruoyi:
  # åç§°
  name: RuoYi
  # ç‰ˆæœ¬
  version: 3.8.9
  # ç‰ˆæƒå¹´ä»½
  copyrightYear: 2025
  # æ–‡ä»¶è·¯å¾„ ç¤ºä¾‹ï¼ˆ Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
  profile: /center-lims/mis/file
  # èŽ·å–ip地址开关
  addressEnabled: false
  # éªŒè¯ç ç±»åž‹ math æ•°å­—计算 char å­—符验证
  captchaType: math
# å¼€å‘环境配置
server:
  # æœåŠ¡å™¨çš„HTTP端口,默认为8080
  port: 7003
  servlet:
    # åº”用的访问路径
    context-path: /
  tomcat:
    # tomcat的URI编码
    uri-encoding: UTF-8
    # è¿žæŽ¥æ•°æ»¡åŽçš„æŽ’队数,默认为100
    accept-count: 1000
    threads:
      # tomcat最大线程数,默认为200
      max: 800
      # Tomcat启动初始化的线程数,默认值10
      min-spare: 100
# æ—¥å¿—配置
logging:
  level:
    com.ruoyi: warn
    org.springframework: warn
minio:
  endpoint: http://114.132.189.42/
  port: 7019
  secure: false
  accessKey: admin
  secretKey: 12345678
  preview-expiry: 24 # é¢„览地址默认24小时
  default-bucket: uploadPath
# ç”¨æˆ·é…ç½®
user:
  password:
    # å¯†ç æœ€å¤§é”™è¯¯æ¬¡æ•°
    maxRetryCount: 5
    # å¯†ç é”å®šæ—¶é—´ï¼ˆé»˜è®¤10分钟)
    lockTime: 10
# Spring配置
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://127.0.0.1:3306/mis-ruoyi?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: zttZTT123!
      # ä»Žåº“数据源
      slave:
        # ä»Žæ•°æ®æºå¼€å…³/默认关闭
        enabled: false
        url:
        username:
        password:
      # åˆå§‹è¿žæŽ¥æ•°
      initialSize: 5
      # æœ€å°è¿žæŽ¥æ± æ•°é‡
      minIdle: 10
      # æœ€å¤§è¿žæŽ¥æ± æ•°é‡
      maxActive: 20
      # é…ç½®èŽ·å–è¿žæŽ¥ç­‰å¾…è¶…æ—¶çš„æ—¶é—´
      maxWait: 60000
      # é…ç½®è¿žæŽ¥è¶…æ—¶æ—¶é—´
      connectTimeout: 30000
      # é…ç½®ç½‘络超时时间
      socketTimeout: 60000
      # é…ç½®é—´éš”多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 60000
      # é…ç½®ä¸€ä¸ªè¿žæŽ¥åœ¨æ± ä¸­æœ€å°ç”Ÿå­˜çš„æ—¶é—´ï¼Œå•位是毫秒
      minEvictableIdleTimeMillis: 300000
      # é…ç½®ä¸€ä¸ªè¿žæŽ¥åœ¨æ± ä¸­æœ€å¤§ç”Ÿå­˜çš„æ—¶é—´ï¼Œå•位是毫秒
      maxEvictableIdleTimeMillis: 900000
      # é…ç½®æ£€æµ‹è¿žæŽ¥æ˜¯å¦æœ‰æ•ˆ
      validationQuery: SELECT 1 FROM DUAL
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      webStatFilter:
        enabled: true
      statViewServlet:
        enabled: true
        # è®¾ç½®ç™½åå•,不填则允许所有访问
        allow:
        url-pattern: /druid/*
        # æŽ§åˆ¶å°ç®¡ç†ç”¨æˆ·åå’Œå¯†ç 
        login-username: ruoyi
        login-password: 123456
      filter:
        stat:
          enabled: true
          # æ…¢SQL记录
          log-slow-sql: true
          slow-sql-millis: 1000
          merge-sql: true
        wall:
          config:
            multi-statement-allow: true
  # èµ„源信息
  messages:
    # å›½é™…化资源文件路径
    basename: i18n/messages
  # æ–‡ä»¶ä¸Šä¼ 
  servlet:
    multipart:
      # å•个文件大小
      max-file-size: 1GB
      # è®¾ç½®æ€»ä¸Šä¼ çš„æ–‡ä»¶å¤§å°
      max-request-size: 2GB
  # æœåŠ¡æ¨¡å—
  devtools:
    restart:
      # çƒ­éƒ¨ç½²å¼€å…³
      enabled: false
  # redis é…ç½®
  redis:
    # åœ°å€
    host: 127.0.0.1
#    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6379
    # æ•°æ®åº“索引
    database: 0
    # å¯†ç 
    password: zttZTT123!
#    password: 123456
    # è¿žæŽ¥è¶…æ—¶æ—¶é—´
    timeout: 10s
    lettuce:
      pool:
        # è¿žæŽ¥æ± ä¸­çš„æœ€å°ç©ºé—²è¿žæŽ¥
        min-idle: 0
        # è¿žæŽ¥æ± ä¸­çš„æœ€å¤§ç©ºé—²è¿žæŽ¥
        max-idle: 8
        # è¿žæŽ¥æ± çš„æœ€å¤§æ•°æ®åº“连接数
        max-active: 8
        # #连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1ms
# token配置
token:
  # ä»¤ç‰Œè‡ªå®šä¹‰æ ‡è¯†
  header: Authorization
  # ä»¤ç‰Œå¯†é’¥
  secret: abcdefghijklmnopqrstuvwxyz
  # ä»¤ç‰Œæœ‰æ•ˆæœŸï¼ˆé»˜è®¤30分钟)
  expireTime: 450
# MyBatis Plus配置
mybatis-plus:
  # æœç´¢æŒ‡å®šåŒ…别名   æ ¹æ®è‡ªå·±çš„项目来
  typeAliasesPackage: com.ruoyi.**.pojo
  # é…ç½®mapper的扫描,找到所有的mapper.xml映射文件
  mapperLocations: classpath*:mapper/**/*Mapper.xml
  # åŠ è½½å…¨å±€çš„é…ç½®æ–‡ä»¶
  configLocation: classpath:mybatis/mybatis-config.xml
  global-config:
    enable-sql-runner: true
    db-config:
      id-type: auto
# PageHelper分页插件
pagehelper:
  helperDialect: mysql
  supportMethodsArguments: true
  params: count=countSql
# Swagger配置
swagger:
  # æ˜¯å¦å¼€å¯swagger
  enabled: false
  # è¯·æ±‚前缀
  pathMapping: /dev-api
# é˜²æ­¢XSS攻击
xss:
  # è¿‡æ»¤å¼€å…³
  enabled: true
  # æŽ’除链接(多个用逗号分隔)
  excludes: /system/notice
  # åŒ¹é…é“¾æŽ¥
  urlPatterns: /system/*,/monitor/*,/tool/*
# ä»£ç ç”Ÿæˆ
gen:
  # ä½œè€…
  author: ruoyi
  # é»˜è®¤ç”ŸæˆåŒ…路径 system éœ€æ”¹æˆè‡ªå·±çš„æ¨¡å—名称 å¦‚ system monitor tool
  packageName: com.ruoyi.project.system
  # è‡ªåŠ¨åŽ»é™¤è¡¨å‰ç¼€ï¼Œé»˜è®¤æ˜¯true
  autoRemovePre: false
  # è¡¨å‰ç¼€ï¼ˆç”Ÿæˆç±»åä¸ä¼šåŒ…含表前缀,多个用逗号分隔)
  tablePrefix: sys_
  # æ˜¯å¦å…è®¸ç”Ÿæˆæ–‡ä»¶è¦†ç›–到本地(自定义路径),默认不允许
  allowOverwrite: false
file:
  temp-dir: /center-lims/mis/file/temp/uploads
  upload-dir: /center-lims/mis/file/prod/uploads
src/main/resources/application-scgkxt.yml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,222 @@
# èН坼-生产管控系统项目相关配置
inspur:
  appId: 1205970458172719104
  appSecret: GFHKMDYwMTIwMjYxNzM3MDg3MDc0g1
ruoyi:
  # åç§°
  name: RuoYi
  # ç‰ˆæœ¬
  version: 3.8.9
  # ç‰ˆæƒå¹´ä»½
  copyrightYear: 2025
  # æ–‡ä»¶è·¯å¾„ ç¤ºä¾‹ï¼ˆ Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
  profile: /center-lims/mis/file
  # èŽ·å–ip地址开关
  addressEnabled: false
  # éªŒè¯ç ç±»åž‹ math æ•°å­—计算 char å­—符验证
  captchaType: math
# å¼€å‘环境配置
server:
  # æœåŠ¡å™¨çš„HTTP端口,默认为8080
  port: 7003
  servlet:
    # åº”用的访问路径
    context-path: /
  tomcat:
    # tomcat的URI编码
    uri-encoding: UTF-8
    # è¿žæŽ¥æ•°æ»¡åŽçš„æŽ’队数,默认为100
    accept-count: 1000
    threads:
      # tomcat最大线程数,默认为200
      max: 800
      # Tomcat启动初始化的线程数,默认值10
      min-spare: 100
# æ—¥å¿—配置
logging:
  level:
    com.ruoyi: warn
    org.springframework: warn
minio:
  endpoint: http://114.132.189.42/
  port: 7019
  secure: false
  accessKey: admin
  secretKey: 12345678
  preview-expiry: 24 # é¢„览地址默认24小时
  default-bucket: uploadPath
# ç”¨æˆ·é…ç½®
user:
  password:
    # å¯†ç æœ€å¤§é”™è¯¯æ¬¡æ•°
    maxRetryCount: 5
    # å¯†ç é”å®šæ—¶é—´ï¼ˆé»˜è®¤10分钟)
    lockTime: 10
# Spring配置
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://127.0.0.1:3306/mis-ruoyi?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: zttZTT123!
      # ä»Žåº“数据源
      slave:
        # ä»Žæ•°æ®æºå¼€å…³/默认关闭
        enabled: false
        url:
        username:
        password:
      # åˆå§‹è¿žæŽ¥æ•°
      initialSize: 5
      # æœ€å°è¿žæŽ¥æ± æ•°é‡
      minIdle: 10
      # æœ€å¤§è¿žæŽ¥æ± æ•°é‡
      maxActive: 20
      # é…ç½®èŽ·å–è¿žæŽ¥ç­‰å¾…è¶…æ—¶çš„æ—¶é—´
      maxWait: 60000
      # é…ç½®è¿žæŽ¥è¶…æ—¶æ—¶é—´
      connectTimeout: 30000
      # é…ç½®ç½‘络超时时间
      socketTimeout: 60000
      # é…ç½®é—´éš”多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 60000
      # é…ç½®ä¸€ä¸ªè¿žæŽ¥åœ¨æ± ä¸­æœ€å°ç”Ÿå­˜çš„æ—¶é—´ï¼Œå•位是毫秒
      minEvictableIdleTimeMillis: 300000
      # é…ç½®ä¸€ä¸ªè¿žæŽ¥åœ¨æ± ä¸­æœ€å¤§ç”Ÿå­˜çš„æ—¶é—´ï¼Œå•位是毫秒
      maxEvictableIdleTimeMillis: 900000
      # é…ç½®æ£€æµ‹è¿žæŽ¥æ˜¯å¦æœ‰æ•ˆ
      validationQuery: SELECT 1 FROM DUAL
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      webStatFilter:
        enabled: true
      statViewServlet:
        enabled: true
        # è®¾ç½®ç™½åå•,不填则允许所有访问
        allow:
        url-pattern: /druid/*
        # æŽ§åˆ¶å°ç®¡ç†ç”¨æˆ·åå’Œå¯†ç 
        login-username: ruoyi
        login-password: 123456
      filter:
        stat:
          enabled: true
          # æ…¢SQL记录
          log-slow-sql: true
          slow-sql-millis: 1000
          merge-sql: true
        wall:
          config:
            multi-statement-allow: true
  # èµ„源信息
  messages:
    # å›½é™…化资源文件路径
    basename: i18n/messages
  # æ–‡ä»¶ä¸Šä¼ 
  servlet:
    multipart:
      # å•个文件大小
      max-file-size: 1GB
      # è®¾ç½®æ€»ä¸Šä¼ çš„æ–‡ä»¶å¤§å°
      max-request-size: 2GB
  # æœåŠ¡æ¨¡å—
  devtools:
    restart:
      # çƒ­éƒ¨ç½²å¼€å…³
      enabled: false
  # redis é…ç½®
  redis:
    # åœ°å€
    host: 127.0.0.1
#    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6379
    # æ•°æ®åº“索引
    database: 0
    # å¯†ç 
    password: zttZTT123!
#    password: 123456
    # è¿žæŽ¥è¶…æ—¶æ—¶é—´
    timeout: 10s
    lettuce:
      pool:
        # è¿žæŽ¥æ± ä¸­çš„æœ€å°ç©ºé—²è¿žæŽ¥
        min-idle: 0
        # è¿žæŽ¥æ± ä¸­çš„æœ€å¤§ç©ºé—²è¿žæŽ¥
        max-idle: 8
        # è¿žæŽ¥æ± çš„æœ€å¤§æ•°æ®åº“连接数
        max-active: 8
        # #连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1ms
# token配置
token:
  # ä»¤ç‰Œè‡ªå®šä¹‰æ ‡è¯†
  header: Authorization
  # ä»¤ç‰Œå¯†é’¥
  secret: abcdefghijklmnopqrstuvwxyz
  # ä»¤ç‰Œæœ‰æ•ˆæœŸï¼ˆé»˜è®¤30分钟)
  expireTime: 450
# MyBatis Plus配置
mybatis-plus:
  # æœç´¢æŒ‡å®šåŒ…别名   æ ¹æ®è‡ªå·±çš„项目来
  typeAliasesPackage: com.ruoyi.**.pojo
  # é…ç½®mapper的扫描,找到所有的mapper.xml映射文件
  mapperLocations: classpath*:mapper/**/*Mapper.xml
  # åŠ è½½å…¨å±€çš„é…ç½®æ–‡ä»¶
  configLocation: classpath:mybatis/mybatis-config.xml
  global-config:
    enable-sql-runner: true
    db-config:
      id-type: auto
# PageHelper分页插件
pagehelper:
  helperDialect: mysql
  supportMethodsArguments: true
  params: count=countSql
# Swagger配置
swagger:
  # æ˜¯å¦å¼€å¯swagger
  enabled: false
  # è¯·æ±‚前缀
  pathMapping: /dev-api
# é˜²æ­¢XSS攻击
xss:
  # è¿‡æ»¤å¼€å…³
  enabled: true
  # æŽ’除链接(多个用逗号分隔)
  excludes: /system/notice
  # åŒ¹é…é“¾æŽ¥
  urlPatterns: /system/*,/monitor/*,/tool/*
# ä»£ç ç”Ÿæˆ
gen:
  # ä½œè€…
  author: ruoyi
  # é»˜è®¤ç”ŸæˆåŒ…路径 system éœ€æ”¹æˆè‡ªå·±çš„æ¨¡å—名称 å¦‚ system monitor tool
  packageName: com.ruoyi.project.system
  # è‡ªåŠ¨åŽ»é™¤è¡¨å‰ç¼€ï¼Œé»˜è®¤æ˜¯true
  autoRemovePre: false
  # è¡¨å‰ç¼€ï¼ˆç”Ÿæˆç±»åä¸ä¼šåŒ…含表前缀,多个用逗号分隔)
  tablePrefix: sys_
  # æ˜¯å¦å…è®¸ç”Ÿæˆæ–‡ä»¶è¦†ç›–到本地(自定义路径),默认不允许
  allowOverwrite: false
file:
  temp-dir: /center-lims/mis/file/temp/uploads
  upload-dir: /center-lims/mis/file/prod/uploads
src/main/resources/application-xtbgxt.yml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,222 @@
# èН坼-协同办公系统项目相关配置
inspur:
  appId: 1205970862683979776
  appSecret: 9UR1MDYwMTIwMjYxNzM4NDUxNTARkN
ruoyi:
  # åç§°
  name: RuoYi
  # ç‰ˆæœ¬
  version: 3.8.9
  # ç‰ˆæƒå¹´ä»½
  copyrightYear: 2025
  # æ–‡ä»¶è·¯å¾„ ç¤ºä¾‹ï¼ˆ Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
  profile: /center-lims/mis/file
  # èŽ·å–ip地址开关
  addressEnabled: false
  # éªŒè¯ç ç±»åž‹ math æ•°å­—计算 char å­—符验证
  captchaType: math
# å¼€å‘环境配置
server:
  # æœåŠ¡å™¨çš„HTTP端口,默认为8080
  port: 7003
  servlet:
    # åº”用的访问路径
    context-path: /
  tomcat:
    # tomcat的URI编码
    uri-encoding: UTF-8
    # è¿žæŽ¥æ•°æ»¡åŽçš„æŽ’队数,默认为100
    accept-count: 1000
    threads:
      # tomcat最大线程数,默认为200
      max: 800
      # Tomcat启动初始化的线程数,默认值10
      min-spare: 100
# æ—¥å¿—配置
logging:
  level:
    com.ruoyi: warn
    org.springframework: warn
minio:
  endpoint: http://114.132.189.42/
  port: 7019
  secure: false
  accessKey: admin
  secretKey: 12345678
  preview-expiry: 24 # é¢„览地址默认24小时
  default-bucket: uploadPath
# ç”¨æˆ·é…ç½®
user:
  password:
    # å¯†ç æœ€å¤§é”™è¯¯æ¬¡æ•°
    maxRetryCount: 5
    # å¯†ç é”å®šæ—¶é—´ï¼ˆé»˜è®¤10分钟)
    lockTime: 10
# Spring配置
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://127.0.0.1:3306/mis-ruoyi?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: zttZTT123!
      # ä»Žåº“数据源
      slave:
        # ä»Žæ•°æ®æºå¼€å…³/默认关闭
        enabled: false
        url:
        username:
        password:
      # åˆå§‹è¿žæŽ¥æ•°
      initialSize: 5
      # æœ€å°è¿žæŽ¥æ± æ•°é‡
      minIdle: 10
      # æœ€å¤§è¿žæŽ¥æ± æ•°é‡
      maxActive: 20
      # é…ç½®èŽ·å–è¿žæŽ¥ç­‰å¾…è¶…æ—¶çš„æ—¶é—´
      maxWait: 60000
      # é…ç½®è¿žæŽ¥è¶…æ—¶æ—¶é—´
      connectTimeout: 30000
      # é…ç½®ç½‘络超时时间
      socketTimeout: 60000
      # é…ç½®é—´éš”多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 60000
      # é…ç½®ä¸€ä¸ªè¿žæŽ¥åœ¨æ± ä¸­æœ€å°ç”Ÿå­˜çš„æ—¶é—´ï¼Œå•位是毫秒
      minEvictableIdleTimeMillis: 300000
      # é…ç½®ä¸€ä¸ªè¿žæŽ¥åœ¨æ± ä¸­æœ€å¤§ç”Ÿå­˜çš„æ—¶é—´ï¼Œå•位是毫秒
      maxEvictableIdleTimeMillis: 900000
      # é…ç½®æ£€æµ‹è¿žæŽ¥æ˜¯å¦æœ‰æ•ˆ
      validationQuery: SELECT 1 FROM DUAL
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      webStatFilter:
        enabled: true
      statViewServlet:
        enabled: true
        # è®¾ç½®ç™½åå•,不填则允许所有访问
        allow:
        url-pattern: /druid/*
        # æŽ§åˆ¶å°ç®¡ç†ç”¨æˆ·åå’Œå¯†ç 
        login-username: ruoyi
        login-password: 123456
      filter:
        stat:
          enabled: true
          # æ…¢SQL记录
          log-slow-sql: true
          slow-sql-millis: 1000
          merge-sql: true
        wall:
          config:
            multi-statement-allow: true
  # èµ„源信息
  messages:
    # å›½é™…化资源文件路径
    basename: i18n/messages
  # æ–‡ä»¶ä¸Šä¼ 
  servlet:
    multipart:
      # å•个文件大小
      max-file-size: 1GB
      # è®¾ç½®æ€»ä¸Šä¼ çš„æ–‡ä»¶å¤§å°
      max-request-size: 2GB
  # æœåŠ¡æ¨¡å—
  devtools:
    restart:
      # çƒ­éƒ¨ç½²å¼€å…³
      enabled: false
  # redis é…ç½®
  redis:
    # åœ°å€
    host: 127.0.0.1
#    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6379
    # æ•°æ®åº“索引
    database: 0
    # å¯†ç 
    password: zttZTT123!
#    password: 123456
    # è¿žæŽ¥è¶…æ—¶æ—¶é—´
    timeout: 10s
    lettuce:
      pool:
        # è¿žæŽ¥æ± ä¸­çš„æœ€å°ç©ºé—²è¿žæŽ¥
        min-idle: 0
        # è¿žæŽ¥æ± ä¸­çš„æœ€å¤§ç©ºé—²è¿žæŽ¥
        max-idle: 8
        # è¿žæŽ¥æ± çš„æœ€å¤§æ•°æ®åº“连接数
        max-active: 8
        # #连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1ms
# token配置
token:
  # ä»¤ç‰Œè‡ªå®šä¹‰æ ‡è¯†
  header: Authorization
  # ä»¤ç‰Œå¯†é’¥
  secret: abcdefghijklmnopqrstuvwxyz
  # ä»¤ç‰Œæœ‰æ•ˆæœŸï¼ˆé»˜è®¤30分钟)
  expireTime: 450
# MyBatis Plus配置
mybatis-plus:
  # æœç´¢æŒ‡å®šåŒ…别名   æ ¹æ®è‡ªå·±çš„项目来
  typeAliasesPackage: com.ruoyi.**.pojo
  # é…ç½®mapper的扫描,找到所有的mapper.xml映射文件
  mapperLocations: classpath*:mapper/**/*Mapper.xml
  # åŠ è½½å…¨å±€çš„é…ç½®æ–‡ä»¶
  configLocation: classpath:mybatis/mybatis-config.xml
  global-config:
    enable-sql-runner: true
    db-config:
      id-type: auto
# PageHelper分页插件
pagehelper:
  helperDialect: mysql
  supportMethodsArguments: true
  params: count=countSql
# Swagger配置
swagger:
  # æ˜¯å¦å¼€å¯swagger
  enabled: false
  # è¯·æ±‚前缀
  pathMapping: /dev-api
# é˜²æ­¢XSS攻击
xss:
  # è¿‡æ»¤å¼€å…³
  enabled: true
  # æŽ’除链接(多个用逗号分隔)
  excludes: /system/notice
  # åŒ¹é…é“¾æŽ¥
  urlPatterns: /system/*,/monitor/*,/tool/*
# ä»£ç ç”Ÿæˆ
gen:
  # ä½œè€…
  author: ruoyi
  # é»˜è®¤ç”ŸæˆåŒ…路径 system éœ€æ”¹æˆè‡ªå·±çš„æ¨¡å—名称 å¦‚ system monitor tool
  packageName: com.ruoyi.project.system
  # è‡ªåŠ¨åŽ»é™¤è¡¨å‰ç¼€ï¼Œé»˜è®¤æ˜¯true
  autoRemovePre: false
  # è¡¨å‰ç¼€ï¼ˆç”Ÿæˆç±»åä¸ä¼šåŒ…含表前缀,多个用逗号分隔)
  tablePrefix: sys_
  # æ˜¯å¦å…è®¸ç”Ÿæˆæ–‡ä»¶è¦†ç›–到本地(自定义路径),默认不允许
  allowOverwrite: false
file:
  temp-dir: /center-lims/mis/file/temp/uploads
  upload-dir: /center-lims/mis/file/prod/uploads
src/main/resources/application-yxglxt.yml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,222 @@
# èН坼-营销管理系统项目相关配置
inspur:
  appId: 1205972006802030592
  appSecret: BgpqMDYwMTIwMjYxNzQzMTc5MjkKou
ruoyi:
  # åç§°
  name: RuoYi
  # ç‰ˆæœ¬
  version: 3.8.9
  # ç‰ˆæƒå¹´ä»½
  copyrightYear: 2025
  # æ–‡ä»¶è·¯å¾„ ç¤ºä¾‹ï¼ˆ Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath)
  profile: /center-lims/mis/file
  # èŽ·å–ip地址开关
  addressEnabled: false
  # éªŒè¯ç ç±»åž‹ math æ•°å­—计算 char å­—符验证
  captchaType: math
# å¼€å‘环境配置
server:
  # æœåŠ¡å™¨çš„HTTP端口,默认为8080
  port: 7003
  servlet:
    # åº”用的访问路径
    context-path: /
  tomcat:
    # tomcat的URI编码
    uri-encoding: UTF-8
    # è¿žæŽ¥æ•°æ»¡åŽçš„æŽ’队数,默认为100
    accept-count: 1000
    threads:
      # tomcat最大线程数,默认为200
      max: 800
      # Tomcat启动初始化的线程数,默认值10
      min-spare: 100
# æ—¥å¿—配置
logging:
  level:
    com.ruoyi: warn
    org.springframework: warn
minio:
  endpoint: http://114.132.189.42/
  port: 7019
  secure: false
  accessKey: admin
  secretKey: 12345678
  preview-expiry: 24 # é¢„览地址默认24小时
  default-bucket: uploadPath
# ç”¨æˆ·é…ç½®
user:
  password:
    # å¯†ç æœ€å¤§é”™è¯¯æ¬¡æ•°
    maxRetryCount: 5
    # å¯†ç é”å®šæ—¶é—´ï¼ˆé»˜è®¤10分钟)
    lockTime: 10
# Spring配置
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://172.17.0.1:3306/mis-ruoyi?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: zttZTT123!
      # ä»Žåº“数据源
      slave:
        # ä»Žæ•°æ®æºå¼€å…³/默认关闭
        enabled: false
        url:
        username:
        password:
      # åˆå§‹è¿žæŽ¥æ•°
      initialSize: 5
      # æœ€å°è¿žæŽ¥æ± æ•°é‡
      minIdle: 10
      # æœ€å¤§è¿žæŽ¥æ± æ•°é‡
      maxActive: 20
      # é…ç½®èŽ·å–è¿žæŽ¥ç­‰å¾…è¶…æ—¶çš„æ—¶é—´
      maxWait: 60000
      # é…ç½®è¿žæŽ¥è¶…æ—¶æ—¶é—´
      connectTimeout: 30000
      # é…ç½®ç½‘络超时时间
      socketTimeout: 60000
      # é…ç½®é—´éš”多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      timeBetweenEvictionRunsMillis: 60000
      # é…ç½®ä¸€ä¸ªè¿žæŽ¥åœ¨æ± ä¸­æœ€å°ç”Ÿå­˜çš„æ—¶é—´ï¼Œå•位是毫秒
      minEvictableIdleTimeMillis: 300000
      # é…ç½®ä¸€ä¸ªè¿žæŽ¥åœ¨æ± ä¸­æœ€å¤§ç”Ÿå­˜çš„æ—¶é—´ï¼Œå•位是毫秒
      maxEvictableIdleTimeMillis: 900000
      # é…ç½®æ£€æµ‹è¿žæŽ¥æ˜¯å¦æœ‰æ•ˆ
      validationQuery: SELECT 1 FROM DUAL
      testWhileIdle: true
      testOnBorrow: false
      testOnReturn: false
      webStatFilter:
        enabled: true
      statViewServlet:
        enabled: true
        # è®¾ç½®ç™½åå•,不填则允许所有访问
        allow:
        url-pattern: /druid/*
        # æŽ§åˆ¶å°ç®¡ç†ç”¨æˆ·åå’Œå¯†ç 
        login-username: ruoyi
        login-password: 123456
      filter:
        stat:
          enabled: true
          # æ…¢SQL记录
          log-slow-sql: true
          slow-sql-millis: 1000
          merge-sql: true
        wall:
          config:
            multi-statement-allow: true
  # èµ„源信息
  messages:
    # å›½é™…化资源文件路径
    basename: i18n/messages
  # æ–‡ä»¶ä¸Šä¼ 
  servlet:
    multipart:
      # å•个文件大小
      max-file-size: 1GB
      # è®¾ç½®æ€»ä¸Šä¼ çš„æ–‡ä»¶å¤§å°
      max-request-size: 2GB
  # æœåŠ¡æ¨¡å—
  devtools:
    restart:
      # çƒ­éƒ¨ç½²å¼€å…³
      enabled: false
  # redis é…ç½®
  redis:
    # åœ°å€
#    host: 127.0.0.1
    host: 172.17.0.1
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6379
    # æ•°æ®åº“索引
    database: 0
    # å¯†ç 
    password: zttZTT123!
#    password: 123456
    # è¿žæŽ¥è¶…æ—¶æ—¶é—´
    timeout: 10s
    lettuce:
      pool:
        # è¿žæŽ¥æ± ä¸­çš„æœ€å°ç©ºé—²è¿žæŽ¥
        min-idle: 0
        # è¿žæŽ¥æ± ä¸­çš„æœ€å¤§ç©ºé—²è¿žæŽ¥
        max-idle: 8
        # è¿žæŽ¥æ± çš„æœ€å¤§æ•°æ®åº“连接数
        max-active: 8
        # #连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1ms
# token配置
token:
  # ä»¤ç‰Œè‡ªå®šä¹‰æ ‡è¯†
  header: Authorization
  # ä»¤ç‰Œå¯†é’¥
  secret: abcdefghijklmnopqrstuvwxyz
  # ä»¤ç‰Œæœ‰æ•ˆæœŸï¼ˆé»˜è®¤30分钟)
  expireTime: 450
# MyBatis Plus配置
mybatis-plus:
  # æœç´¢æŒ‡å®šåŒ…别名   æ ¹æ®è‡ªå·±çš„项目来
  typeAliasesPackage: com.ruoyi.**.pojo
  # é…ç½®mapper的扫描,找到所有的mapper.xml映射文件
  mapperLocations: classpath*:mapper/**/*Mapper.xml
  # åŠ è½½å…¨å±€çš„é…ç½®æ–‡ä»¶
  configLocation: classpath:mybatis/mybatis-config.xml
  global-config:
    enable-sql-runner: true
    db-config:
      id-type: auto
# PageHelper分页插件
pagehelper:
  helperDialect: mysql
  supportMethodsArguments: true
  params: count=countSql
# Swagger配置
swagger:
  # æ˜¯å¦å¼€å¯swagger
  enabled: false
  # è¯·æ±‚前缀
  pathMapping: /dev-api
# é˜²æ­¢XSS攻击
xss:
  # è¿‡æ»¤å¼€å…³
  enabled: true
  # æŽ’除链接(多个用逗号分隔)
  excludes: /system/notice
  # åŒ¹é…é“¾æŽ¥
  urlPatterns: /system/*,/monitor/*,/tool/*
# ä»£ç ç”Ÿæˆ
gen:
  # ä½œè€…
  author: ruoyi
  # é»˜è®¤ç”ŸæˆåŒ…路径 system éœ€æ”¹æˆè‡ªå·±çš„æ¨¡å—名称 å¦‚ system monitor tool
  packageName: com.ruoyi.project.system
  # è‡ªåŠ¨åŽ»é™¤è¡¨å‰ç¼€ï¼Œé»˜è®¤æ˜¯true
  autoRemovePre: false
  # è¡¨å‰ç¼€ï¼ˆç”Ÿæˆç±»åä¸ä¼šåŒ…含表前缀,多个用逗号分隔)
  tablePrefix: sys_
  # æ˜¯å¦å…è®¸ç”Ÿæˆæ–‡ä»¶è¦†ç›–到本地(自定义路径),默认不允许
  allowOverwrite: false
file:
  temp-dir: /center-lims/mis/file/temp/uploads
  upload-dir: /center-lims/mis/file/prod/uploads
src/main/resources/application.yml
@@ -1,4 +1,13 @@
# Spring配置
spring:
  profiles:
    active: tide
    active: yxglxt
#10.136.58.65    è´¢åŠ¡ç®¡ç†ç³»ç»Ÿ    cwglxt
#10.136.58.66    è®¾å¤‡ç®¡ç†ç³»ç»Ÿ    sbglxt
#10.136.58.67    ç”Ÿäº§ç®¡æŽ§ç³»ç»Ÿ    scgkxt
#10.136.58.68    ååŒåŠžå…¬ç³»ç»Ÿ    xtbgxt
#10.136.58.69    é‡‡è´­ç®¡ç†ç³»ç»Ÿ    cgglxt
#10.136.58.70    ä»“储物流系统    ccwlxt
#10.136.58.71    è¥é”€ç®¡ç†ç³»ç»Ÿ    yxglxt
#10.136.58.72    äººåŠ›èµ„æºç³»ç»Ÿ    rlzyxt
#10.136.58.73    çŽ¯ä¿é—¨ç¦ç³»ç»Ÿ    hbmjxt
src/main/resources/mapper/procurementrecord/CustomStorageMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,50 @@
<?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.procurementrecord.mapper.CustomStorageMapper">
    <select id="listPageCopyByCustom" resultType="com.ruoyi.procurementrecord.pojo.CustomStorage">
        select t1.*,
                sum(t1.tax_inclusive_total_price) as totalPrice,
                sum(t1.inbound_num) as inboundNum,
                sum(t1.inbound_num) as inboundNum0,
                SUM(t1.inbound_num) - COALESCE(SUM(t2.inbound_num), 0) AS availableStock
               from custom_storage t1
               left join procurement_record_out t2 on t1.id = t2.procurement_record_storage_id and t2.type = 3
        <where>
            t2.type = 3
            <if test="req.productCategory != null and req.productCategory != ''">
                and t1.product_category like  concat('%',#{req.productCategory},'%')
            </if>
            <if test="req.supplierName !=null and req.supplierName != ''">
                and t1.supplier_name like concat('%',#{req.supplierName},'%')
            </if>
            <if test="req.timeStr != null and req.timeStr != ''">
                and t1.inbound_date like concat('%',#{req.timeStr},'%')
            </if>
        </where>
        group by t1.product_category, t1.specification_model, t1.tax_inclusive_unit_price
        order by t1.inbound_date desc
    </select>
    <select id="listPageByCustom" resultType="com.ruoyi.procurementrecord.pojo.CustomStorage">
        select t1.*,
        sum(t1.inbound_num) as inboundNum,
        sum(t1.inbound_num) as inboundNum0,
        sum(t1.tax_inclusive_total_price) as taxInclusiveTotalPrice,
        (t1.inbound_num - COALESCE(SUM(t2.inbound_num), 0)) AS availableStock
        from custom_storage t1
        left join procurement_record_out t2 on t1.id = t2.procurement_record_storage_id
        <where>
            <if test="req.productCategory != null and req.productCategory != ''">
                and t1.product_category like  concat('%',#{req.productCategory},'%')
            </if>
            <if test="req.supplierName !=null and req.supplierName != ''">
                and t1.supplier_name like concat('%',#{req.supplierName},'%')
            </if>
            <if test="req.timeStr != null and req.timeStr != ''">
                and t1.inbound_date like concat('%',#{req.timeStr},'%')
            </if>
        </where>
        group by t1.id
        order by t1.inbound_date desc
    </select>
</mapper>
src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
@@ -20,7 +20,7 @@
            t2.tax_exclusive_total_price,
            t3.inbound_num as quantityStock
        from  purchase_ledger t1
        left join sales_ledger_product t2 on t1.id = t2.sales_ledger_id
        left join sales_ledger_product t2 on t1.id = t2.sales_ledger_id and t2.type = 2
        left join procurement_record_storage t3 on t2.id = t3.sales_ledger_product_id
        where t1.purchase_contract_number = #{req.purchaseContractNumber}
        <if test="req.id != null and req.id != ''">
@@ -42,25 +42,37 @@
        t2.tax_inclusive_unit_price,
        (t1.inbound_num * t2.tax_inclusive_unit_price) as taxInclusiveTotalPrice,
        (t1.inbound_num * t2.tax_inclusive_unit_price - t1.inbound_num * t2.tax_inclusive_unit_price * t2.tax_rate / 100) as taxExclusiveTotalPrice,
        t1.unit_price,
        t1.total_price,
        t1.inbound_batches,
        t1.inbound_num,
        t1.inbound_num as inboundNum0,
        t1.create_time,
        t1.update_time,
        t1.create_by,
        t2.warn_num
        t2.warn_num,
        (t1.inbound_num - COALESCE(SUM(t4.inbound_num), 0)) / count(1) AS availableStock
        from  procurement_record_storage t1
                  left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
                  left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id and t2.type = 2
                  left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
        left join procurement_record_out t4 on t1.id = t4.procurement_record_storage_id and t4.type = 1
        <where>
            1 = 1
            t1.type = 1
            <if test="req.supplierName != null and req.supplierName != ''">
                and t3.supplier_name like  concat('%',#{req.supplierName},'%')
            </if>
            <if test="req.productCategory != null and req.productCategory != ''">
                and t2.product_category like  concat('%',#{req.productCategory},'%')
            </if>
            <if test="req.timeStr != null and req.timeStr != ''">
                and t1.create_time like  concat('%',#{req.timeStr},'%')
            </if>
        </where>
        group by t1.id
        <if test="req.flag != null and req.flag">
            having availableStock > 0
        </if>
        order by t1.create_time desc
    </select>
    <select id="list" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDto">
        select
@@ -84,6 +96,32 @@
        from  procurement_record_storage t1
                  left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
                  left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
                where t1.type = 1
    </select>
    <select id="listOne" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDto">
        select
            t3.customer_contract_no,
            t3.sales_contract_no,
            t3.customer_name,
            t2.product_category,
            t1.id,
            t2.specification_model,
            t2.unit,
            t2.quantity,
            t2.quantity as quantity0,
            t2.tax_rate,
            t2.tax_inclusive_unit_price,
            t2.tax_inclusive_total_price,
            t2.tax_exclusive_total_price,
            t1.inbound_batches,
            t1.inbound_num,
            t1.create_time,
            t1.create_time as time,
            t1.create_by
        from  procurement_record_storage t1
            left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
            left join sales_ledger t3 on t3.id = t2.sales_ledger_id
        where t1.type = 2
    </select>
    <select id="listPageCopy" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDtoCopy">
        select
@@ -101,20 +139,26 @@
        t2.tax_inclusive_total_price,
        t2.tax_exclusive_total_price,
        t1.inbound_batches,
        sum(t1.inbound_num) as inboundNum,
        sum(t1.inbound_num) as inboundNum0,
        t1.inbound_num as totalInboundNum,
        t1.unit_price as unitPrice,
        sum(t1.total_price) as totalPrice,
        sum(t1.inbound_num) / COALESCE(count(1), 1) as inboundNum,
        sum(t1.inbound_num) / COALESCE(count(1), 1) as inboundNum0,
        t1.create_time,
        t1.update_time,
        t1.create_by,
        t2.warn_num
        t2.warn_num,
        (SUM(t1.inbound_num) - COALESCE(SUM(t4.inbound_num), 0)) / COALESCE(count(1), 1) AS availableStock
        from  procurement_record_storage t1
        left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
        left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id and t2.type = 2
        left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
        left join procurement_record_out t4 on t1.id = t4.procurement_record_storage_id and t4.type = 1
        <where>
            1 = 1
            t1.type = 1 and t4.type = 1
            <if test="req.supplierName != null and req.supplierName != ''">
                and t3.supplier_name like  concat('%',#{req.supplierName},'%')
            </if>
            <if test="req.productCategory != null and req.productCategory != ''">
                and t2.product_category like  concat('%',#{req.productCategory},'%')
            </if>
            <if test="req.timeStr != null and req.timeStr != ''">
                and t1.create_time like  concat('%',#{req.timeStr},'%')
@@ -135,7 +179,9 @@
                and t1.create_time &lt;= #{req.endDate}
            </if>
        </where>
        group by t3.supplier_name,t2.product_category,t2.specification_model
        group by t2.product_category,t2.specification_model,t1.unit_price
        having availableStock > 0
        order by t1.create_time desc
    </select>
    <select id="listCopy" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDtoCopy">
        select
@@ -160,7 +206,146 @@
            t1.update_time as uTime,
            t1.create_by
        from  procurement_record_storage t1
                  left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
                  left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id and t2.type = 2
                  left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
        where t1.type = 1
        group by t3.supplier_name,t2.product_category,t2.specification_model
    </select>
    <select id="listCopyOne" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDtoCopy">
        select
            t3.customer_contract_no,
            t3.sales_contract_no,
            t3.customer_name,
            t2.product_category,
            t1.id,
            t1.sales_ledger_product_id,
            t1.create_user,
            t2.specification_model,
            t2.unit,
            t2.tax_rate,
            t2.tax_inclusive_unit_price,
            t2.tax_inclusive_total_price,
            t2.tax_exclusive_total_price,
            t1.inbound_batches,
            t1.inbound_num,
            t1.inbound_num as inboundNum0,
            t1.create_time,
            t1.update_time,
            t1.create_time as cTime,
            t1.update_time as uTime,
            t1.create_by
        from  procurement_record_storage t1
                  left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id and t2.type = 1
                  left join sales_ledger t3 on t3.id = t2.sales_ledger_id
        where t1.type = 2
        group by t3.customer_name,t2.product_category,t2.specification_model
    </select>
    <select id="listPageByProduction" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDto">
        select
        t3.customer_contract_no,
        t3.sales_contract_no,
        t3.customer_name,
        t2.product_category,
        t1.id,
        t1.sales_ledger_product_id,
        t1.create_user,
        t2.specification_model,
        t2.unit,
        t2.tax_rate,
        t2.tax_inclusive_unit_price,
        (t1.inbound_num * t2.tax_inclusive_unit_price) as taxInclusiveTotalPrice,
        (t1.inbound_num * t2.tax_inclusive_unit_price - t1.inbound_num * t2.tax_inclusive_unit_price * t2.tax_rate / 100) as taxExclusiveTotalPrice,
        t1.unit_price,
        t1.total_price,
        t1.inbound_batches,
        t1.inbound_num,
        t1.inbound_num as inboundNum0,
        t1.create_time,
        t1.update_time,
        t1.create_by,
        t2.warn_num,
        (t1.inbound_num - COALESCE(SUM(t4.inbound_num), 0)) / count(1) AS availableStock
        from  procurement_record_storage t1
        left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id and t2.type = 1
        left join sales_ledger t3 on t3.id = t2.sales_ledger_id
        left join procurement_record_out t4 on t4.procurement_record_storage_id = t1.id and t1.type = 2
        <where>
            t1.type = 2
            <if test="req.customerName != null and req.customerName != ''">
                and t3.customer_name like  concat('%',#{req.customerName},'%')
            </if>
            <if test="req.productCategory != null and req.productCategory != ''">
                and t2.product_category like  concat('%',#{req.productCategory},'%')
            </if>
            <if test="req.timeStr != null and req.timeStr != ''">
                and t1.create_time like  concat('%',#{req.timeStr},'%')
            </if>
        </where>
        group by t1.id
        <if test="req.flag != null and req.flag">
            having availableStock > 0
        </if>
        order by t1.create_time desc
    </select>
    <select id="listPageCopyByProduction" resultType="com.ruoyi.procurementrecord.dto.ProcurementPageDtoCopy">
        select
        t3.customer_contract_no,
        t3.sales_contract_no,
        t3.customer_name,
        t2.product_category,
        t1.id,
        t1.sales_ledger_product_id,
        t1.create_user,
        t2.specification_model,
        t2.unit,
        t2.min_stock,
        t2.tax_rate,
        t2.tax_inclusive_unit_price,
        t2.tax_inclusive_total_price,
        t2.tax_exclusive_total_price,
        t1.inbound_batches,
        sum(t1.total_price) as totalPrice,
        t1.unit_price,
        sum(t1.inbound_num) as inboundNum,
        sum(t1.inbound_num) as inboundNum0,
        t1.create_time,
        t1.update_time,
        t1.create_by,
        t2.warn_num,
        SUM(t1.inbound_num) - COALESCE(SUM(t4.inbound_num), 0) / COALESCE(count(1), 1) AS availableStock
        from  procurement_record_storage t1
        left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id and t2.type = 1
        left join sales_ledger t3 on t3.id = t2.sales_ledger_id
        left join procurement_record_out t4 on t1.id = t4.procurement_record_storage_id and t4.type = 2
        <where>
            t4.type = 2 and t1.type = 2
            <if test="req.customerName != null and req.customerName != ''">
                and t3.customer_name like  concat('%',#{req.customerName},'%')
            </if>
            <if test="req.productCategory != null and req.productCategory != ''">
                and t2.product_category like  concat('%',#{req.productCategory},'%')
            </if>
            <if test="req.timeStr != null and req.timeStr != ''">
                and t1.create_time like  concat('%',#{req.timeStr},'%')
            </if>
            <if test="req.reportDate != null">
                and t1.create_time >= #{req.reportDate} and t1.create_time &lt; DATE_ADD(#{req.reportDate}, INTERVAL 1 DAY)
            </if>
            <if test="req.startMonth != null">
                and t1.create_time >= #{req.startMonth}
            </if>
            <if test="req.endMonth != null">
                and t1.create_time &lt;= #{req.endMonth}
            </if>
            <if test="req.startDate != null">
                and t1.create_time >= #{req.startDate}
            </if>
            <if test="req.endDate != null">
                and t1.create_time &lt;= #{req.endDate}
            </if>
        </where>
        group by t2.product_category,t2.specification_model,t1.unit_price
        HAVING availableStock > 0
        order by t1.create_time desc
    </select>
</mapper>
src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml
@@ -17,19 +17,27 @@
        t1.inbound_num,
        t1.create_time,
        t1.create_by,
        t2.warn_num
        t2.warn_num,
        t4.unit_price,
        t4.unit_price *  t1.inbound_num as totalPrice,
        t3.purchase_contract_number
        from  procurement_record_out t1
        left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
        left join procurement_record_storage t4 on t4.id = t1.procurement_record_storage_id
        left join sales_ledger_product t2 on t2.id = t4.sales_ledger_product_id and t2.type = 2
        left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
        <where>
            1 = 1
            and t1.type = 1
            <if test="req.supplierName != null and req.supplierName != ''">
                and t3.supplier_name like  concat('%',#{req.supplierName},'%')
            </if>
            <if test="req.productCategory != null and req.productCategory != ''">
                and t2.product_category like  concat('%',#{req.productCategory},'%')
            </if>
            <if test="req.timeStr != null and req.timeStr != ''">
                and t1.create_time like  concat('%',#{req.timeStr},'%')
            </if>
        </where>
        order by t1.create_time desc
    </select>
    <select id="list" resultType="com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto">
        select
@@ -49,5 +57,117 @@
        from  procurement_record_out t1
                  left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
                  left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
            where t1.type = 1
    </select>
    <select id="listOne" resultType="com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto">
        select
            t3.customer_contract_no,
            t3.sales_contract_no,
            t3.customer_name,
            t2.product_category,
            t1.id,
            t2.specification_model,
            t2.unit,
            t2.tax_rate,
            t2.tax_inclusive_unit_price,
            t2.tax_inclusive_total_price,
            t2.tax_exclusive_total_price,
            t1.inbound_num,
            t1.create_time,
            t1.create_time as time,
            t1.create_by
        from  procurement_record_out t1
            left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id
            left join sales_ledger t3 on t3.id = t2.sales_ledger_id
        where t1.type = 2
    </select>
    <select id="listTwo" resultType="com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto">
        select
            t1.supplier_name,
            t1.product_category,
            t1.id,
            t1.specification_model,
            t1.unit,
            t1.tax_rate,
            t1.tax_inclusive_unit_price,
            t1.tax_inclusive_total_price,
            t1.tax_exclusive_total_price,
            t1.inbound_num,
            t1.create_time,
            t1.create_time as time,
            t1.create_by
        from  procurement_record_out t1
        where t1.type = 3
    </select>
    <select id="listPageByProduct" resultType="com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto">
        select
        t3.customer_contract_no,
        t3.sales_contract_no,
        t3.customer_name,
        t2.product_category,
        t1.id,
        t1.code,
        t2.specification_model,
        t2.unit,
        t2.tax_rate,
        t2.tax_inclusive_unit_price,
        t2.tax_inclusive_total_price,
        t2.tax_exclusive_total_price,
        t1.inbound_num,
        t1.create_time,
        t1.create_by,
        t4.unit_price,
        t4.unit_price *  t1.inbound_num as totalPrice
        from  procurement_record_out t1
        left join procurement_record_storage t4 on t4.id = t1.procurement_record_storage_id
        left join sales_ledger_product t2 on t2.id = t4.sales_ledger_product_id and t2.type = 1
        left join sales_ledger t3 on t3.id = t2.sales_ledger_id
        <where>
            and t1.type = 2
            <if test="req.customerName != null and req.customerName != ''">
                and t3.customer_name like  concat('%',#{req.customerName},'%')
            </if>
            <if test="req.productCategory != null and req.productCategory != ''">
                and t2.product_category like  concat('%',#{req.productCategory},'%')
            </if>
            <if test="req.timeStr != null and req.timeStr != ''">
                and t1.create_time like  concat('%',#{req.timeStr},'%')
            </if>
        </where>
        order by t1.create_time desc
    </select>
    <select id="listPageByCustom" resultType="com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto">
        select
        t2.supplier_name,
        t2.product_category,
        t1.id,
        t2.specification_model,
        t2.unit,
        t2.tax_rate,
        t2.tax_inclusive_unit_price,
        t2.tax_inclusive_unit_price * t1.inbound_num as totalPrice,
        t2.tax_exclusive_total_price,
        t1.inbound_num,
        t1.create_time,
        t1.create_by,
        t2.item_type,
        t2.code
        from  procurement_record_out t1
        left join custom_storage t2 on t2.id = t1.procurement_record_storage_id
        <where>
            t1.type = 3
            <if test="req.supplierName != null and req.supplierName != ''">
                and t2.supplier_name like  concat('%',#{req.supplierName},'%')
            </if>
            <if test="req.productCategory != null and req.productCategory != ''">
                and t2.product_category like  concat('%',#{req.productCategory},'%')
            </if>
            <if test="req.timeStr != null and req.timeStr != ''">
                and t1.create_time like  concat('%',#{req.timeStr},'%')
            </if>
        </where>
        order by t1.create_time desc
    </select>
</mapper>
src/main/resources/mapper/production/ProductionOrderMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,5 @@
<?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.production.mapper.ProductionOrderMapper">
</mapper>
src/main/resources/mapper/production/SalesLedgerProductionAccountingMapper.xml
@@ -12,33 +12,18 @@
        t4.finished_num,
        t4.work_hours,
        t4.process,
        T1.sales_contract_no,
        T1.customer_contract_no,
        T1.project_name,
        T1.customer_name,
        t3.product_category,
        t3.specification_model,
        t3.unit
        FROM
        sales_ledger_production_accounting t4
        LEFT JOIN sales_ledger T1 ON T1.id = t4.sales_ledger_id
        left join sales_ledger_product t3 on t4.sales_ledger_product_id = t3.id
        LEFT JOIN production_order t3 on t3.id = t4.sales_ledger_product_id
        <where>
            t3.type = 1
            <if test="salesLedgerDto.schedulingUserName != null and salesLedgerDto.schedulingUserName != '' ">
                AND  t4.scheduling_user_name LIKE CONCAT('%',#{salesLedgerDto.schedulingUserName},'%')
            </if>
            <if test="salesLedgerDto.customerName != null and salesLedgerDto.customerName != '' ">
                AND  T1.customer_name LIKE CONCAT('%',#{salesLedgerDto.customerName},'%')
            </if>
            <if test="salesLedgerDto.customerContractNo != null and salesLedgerDto.customerContractNo !='' ">
                AND  T1.customer_contract_no LIKE CONCAT('%',#{salesLedgerDto.customerContractNo},'%')
            </if>
            <if test="salesLedgerDto.salesContractNo != null and salesLedgerDto.salesContractNo != '' ">
                AND  T1.sales_contract_no LIKE CONCAT('%',#{salesLedgerDto.salesContractNo},'%')
            </if>
            <if test="salesLedgerDto.projectName != null and salesLedgerDto.projectName != '' ">
                AND T1.project_name LIKE CONCAT('%',#{salesLedgerDto.projectName},'%')
            <if test="salesLedgerDto.productCategory != null and salesLedgerDto.productCategory != '' ">
                AND  t3.product_category LIKE CONCAT('%',#{salesLedgerDto.productCategory},'%')
            </if>
            <if test="salesLedgerDto.entryDateStart != null and salesLedgerDto.entryDateStart != '' ">
                AND t4.scheduling_date &gt;= DATE_FORMAT(#{salesLedgerDto.entryDateStart},'%Y-%m-%d')
src/main/resources/mapper/production/SalesLedgerSchedulingMapper.xml
@@ -66,7 +66,6 @@
    <select id="listPageProcess" resultType="com.ruoyi.production.dto.SalesLedgerSchedulingProcessDto">
        SELECT
        t3.id as salesLedgerProductId,
        T1.id as salesLedgerId,
        T2.id,
        T2.status,
        T2.scheduling_user_id,
@@ -74,33 +73,22 @@
        T2.scheduling_date,
        ifNull(T2.scheduling_num,0) AS schedulingNum,
        ifNull(T2.finished_num,0) AS successNum,
        T1.sales_contract_no,
        T1.customer_contract_no,
        T1.project_name,
        T1.customer_name,
        t3.product_category,
        t3.specification_model,
        t3.unit
        t3.unit,
        t3.order_no
        FROM
        sales_ledger_scheduling T2
        LEFT JOIN sales_ledger T1 ON T1.id = T2.sales_ledger_id
        left join sales_ledger_product t3 on T2.sales_ledger_product_id = t3.id
        LEFT JOIN production_order t3 on t3.id = T2.sales_ledger_product_id
        <where>
            t3.type = 1
            <if test="salesLedgerDto.status != null and salesLedgerDto.status != '' ">
                AND  T2.status = #{salesLedgerDto.status}
            </if>
            <if test="salesLedgerDto.customerName != null and salesLedgerDto.customerName != '' ">
                AND  T1.customer_name LIKE CONCAT('%',#{salesLedgerDto.customerName},'%')
            <if test="salesLedgerDto.orderNo != null and salesLedgerDto.orderNo != '' ">
                AND  T1.order_no LIKE CONCAT('%',#{salesLedgerDto.orderNo},'%')
            </if>
            <if test="salesLedgerDto.customerContractNo != null and salesLedgerDto.customerContractNo !='' ">
                AND  T1.customer_contract_no LIKE CONCAT('%',#{salesLedgerDto.customerContractNo},'%')
            </if>
            <if test="salesLedgerDto.salesContractNo != null and salesLedgerDto.salesContractNo != '' ">
                AND  T1.sales_contract_no LIKE CONCAT('%',#{salesLedgerDto.salesContractNo},'%')
            </if>
            <if test="salesLedgerDto.projectName != null and salesLedgerDto.projectName != '' ">
                AND T1.project_name LIKE CONCAT('%',#{salesLedgerDto.projectName},'%')
            <if test="salesLedgerDto.productCategory != null and salesLedgerDto.productCategory !='' ">
                AND  t3.productCategory LIKE CONCAT('%',#{salesLedgerDto.productCategory},'%')
            </if>
            <if test="salesLedgerDto.entryDateStart != null and salesLedgerDto.entryDateStart != '' ">
                AND T2.scheduling_date &gt;= DATE_FORMAT(#{salesLedgerDto.entryDateStart},'%Y-%m-%d')
src/main/resources/mapper/production/SalesLedgerWorkMapper.xml
@@ -13,33 +13,26 @@
        t4.finished_num,
        t4.work_hours,
        t4.process,
        T1.sales_contract_no,
        T1.customer_contract_no,
        T1.project_name,
        T1.customer_name,
        t4.type,
        t4.receive,
        t4.loss,
        t4.remark,
        t3.product_category,
        t3.specification_model,
        t3.unit
        t3.unit,
        t3.order_no
        FROM
        sales_ledger_work t4
        LEFT JOIN sales_ledger T1 ON T1.id = t4.sales_ledger_id
        left join sales_ledger_product t3 on t4.sales_ledger_product_id = t3.id
        LEFT JOIN production_order t3 on t3.id = t4.sales_ledger_product_id
        <where>
            t3.type = 1
            <if test="salesLedgerDto.status != null and salesLedgerDto.status != '' ">
                AND  t4.status = #{salesLedgerDto.status}
            </if>
            <if test="salesLedgerDto.customerName != null and salesLedgerDto.customerName != '' ">
                AND  T1.customer_name LIKE CONCAT('%',#{salesLedgerDto.customerName},'%')
            <if test="salesLedgerDto.orderNo != null and salesLedgerDto.orderNo != '' ">
                AND  t3.order_no LIKE CONCAT('%',#{salesLedgerDto.orderNo},'%')
            </if>
            <if test="salesLedgerDto.customerContractNo != null and salesLedgerDto.customerContractNo !='' ">
                AND  T1.customer_contract_no LIKE CONCAT('%',#{salesLedgerDto.customerContractNo},'%')
            </if>
            <if test="salesLedgerDto.salesContractNo != null and salesLedgerDto.salesContractNo != '' ">
                AND  T1.sales_contract_no LIKE CONCAT('%',#{salesLedgerDto.salesContractNo},'%')
            </if>
            <if test="salesLedgerDto.projectName != null and salesLedgerDto.projectName != '' ">
                AND T1.project_name LIKE CONCAT('%',#{salesLedgerDto.projectName},'%')
            <if test="salesLedgerDto.productCategory != null and salesLedgerDto.productCategory !='' ">
                AND  t3.productCategory LIKE CONCAT('%',#{salesLedgerDto.productCategory},'%')
            </if>
            <if test="salesLedgerDto.entryDateStart != null and salesLedgerDto.entryDateStart != '' ">
                AND t4.scheduling_date &gt;= DATE_FORMAT(#{salesLedgerDto.entryDateStart},'%Y-%m-%d')
src/main/resources/mapper/purchase/ProductRecordMapper.xml
@@ -7,9 +7,7 @@
    <select id="productRecordPage" resultType="com.ruoyi.purchase.dto.ProductRecordDto">
        SELECT
        sl.sales_contract_no,
        sl.customer_contract_no,
        sl.customer_name,
        pl.sales_contract_no,
        pm.model AS product_model,
        pl.purchase_contract_number,
        pl.supplier_name,
@@ -23,12 +21,11 @@
        ROUND(pr.tickets_amount-pr.tickets_amount/(1+pr.tax_rate/100),2 )as invoice_amount
        FROM product_record pr
        left join purchase_ledger pl on pl.id = pr.purchase_ledger_id
        left join sales_ledger sl on sl.id = pl.sales_ledger_id
        left join ticket_registration tr on tr.id = pr.ticket_registration_id
        left join product_model pm on pm.id = pr.product_model_id
        WHERE type = 2
        <if test="c.salesContractNo != null and c.salesContractNo != ''">
            and sl.sales_contract_no = #{c.salesContractNo}
            and pl.sales_contract_no = #{c.salesContractNo}
        </if>
        <if test="c.supplierName != null and c.supplierName != ''">
            and pl.supplier_name = #{c.supplierName}
@@ -42,6 +39,9 @@
        <if test="c.purchaseContractNumber != null and c.purchaseContractNumber != ''">
            and tr.purchase_contract_number like concat('%',#{c.purchaseContractNumber},'%')
        </if>
        <if test="c.userId != null and c.userId != '' ">
            AND  pl.recorder_id = #{c.userId}
        </if>
    </select>
    <select id="getProductRecordById" resultType="com.ruoyi.purchase.dto.ProductRecordDto">
        SELECT
src/main/resources/mapper/purchase/PurchaseLedgerMapper.xml
@@ -44,6 +44,9 @@
            <if test="c.entryDateEnd != null and c.entryDateEnd != '' ">
                AND  pl.entry_date &lt;= DATE_FORMAT(#{c.entryDateEnd},'%Y-%m-%d')
            </if>
            <if test="c.recorderId != null and c.recorderId != '' ">
                AND  pl.recorder_id = #{c.recorderId}
            </if>
        </where>
        group by pl.id, pl.purchase_contract_number, pl.sales_contract_no, pl.supplier_name,
        pl.project_name,pl.entry_date,
src/main/resources/mapper/system/SysDeptMapper.xml
@@ -99,6 +99,7 @@
             <if test="phone != null and phone != ''">phone,</if>
             <if test="email != null and email != ''">email,</if>
            <if test="deptNick != null and deptNick != ''">dept_nick,</if>
            <if test="tenantId != null and tenantId != ''">tenant_id,</if>
             <if test="status != null">status,</if>
             <if test="createBy != null and createBy != ''">create_by,</if>
             create_time
@@ -112,6 +113,7 @@
             <if test="phone != null and phone != ''">#{phone},</if>
             <if test="email != null and email != ''">#{email},</if>
            <if test="deptNick != null and deptNick != '' ">#{deptNick},</if>
            <if test="tenantId != null and tenantId != '' ">#{tenantId},</if>
             <if test="status != null">#{status},</if>
             <if test="createBy != null and createBy != ''">#{createBy},</if>
             sysdate()
@@ -130,6 +132,7 @@
             <if test="email != null">email = #{email},</if>
            <if test="deptNick != null and deptNick != '' ">dept_nick = #{deptNick},</if>
             <if test="status != null and status != ''">status = #{status},</if>
             <if test="tenantId != null and tenantId != ''">tenant_id = #{tenantId},</if>
             <if test="updateBy != null and updateBy != ''">update_by = #{updateBy},</if>
             update_time = sysdate()
         </set>
@@ -178,5 +181,10 @@
        FROM DepartmentHierarchy
        WHERE parent_id = 100;
    </select>
    <select id="selectDeptByDeptName" resultType="com.ruoyi.project.system.domain.SysDept">
        <include refid="selectDeptVo"/>
        WHERE d.dept_name = #{deptName}
        LIMIT 1
    </select>
</mapper> 
src/main/resources/mapper/system/SysPostMapper.xml
@@ -19,7 +19,7 @@
    
    <sql id="selectPostVo">
        select post_id, post_code, post_name, post_sort, status, create_by, create_time, remark 
        from sys_post
        from sys_post p
    </sql>
    
    <select id="selectPostList" parameterType="com.ruoyi.project.system.domain.SysPost" resultMap="SysPostResult">
@@ -34,6 +34,8 @@
            <if test="postName != null and postName != ''">
                AND post_name like concat('%', #{postName}, '%')
            </if>
            <!-- æ•°æ®èŒƒå›´è¿‡æ»¤ -->
            ${params.dataScope}
        </where>
    </select>
    
@@ -71,6 +73,12 @@
        <include refid="selectPostVo"/>
         where post_code=#{postCode} limit 1
    </select>
    <select id="selectPostByTenantId" resultType="com.ruoyi.project.system.domain.SysPost">
        <include refid="selectPostVo"/>
        <where>
            AND p.tenant_id = #{tenantId}
        </where>
    </select>
    
    <update id="updatePost" parameterType="com.ruoyi.project.system.domain.SysPost">
         update sys_post
@@ -95,6 +103,7 @@
             <if test="status != null and status != ''">status,</if>
             <if test="remark != null and remark != ''">remark,</if>
             <if test="createBy != null and createBy != ''">create_by,</if>
             <if test="tenantId != null and tenantId != ''">tenant_id,</if>
             create_time
         )values(
             <if test="postId != null and postId != 0">#{postId},</if>
@@ -104,6 +113,7 @@
             <if test="status != null and status != ''">#{status},</if>
             <if test="remark != null and remark != ''">#{remark},</if>
             <if test="createBy != null and createBy != ''">#{createBy},</if>
             <if test="tenantId != null and tenantId != ''">#{tenantId},</if>
             sysdate()
         )
    </insert>
src/main/resources/mapper/system/SysRoleMapper.xml
@@ -27,6 +27,7 @@
        from sys_role r
            left join sys_user_role ur on ur.role_id = r.role_id
            left join sys_user u on u.user_id = ur.user_id
            left join sys_user_dept d on u.user_id = d.user_id
    </sql>
    
    <select id="selectRoleList" parameterType="com.ruoyi.project.system.domain.SysRole" resultMap="SysRoleResult">
@@ -103,6 +104,7 @@
             <if test="deptCheckStrictly != null">dept_check_strictly,</if>
             <if test="status != null and status != ''">status,</if>
             <if test="remark != null and remark != ''">remark,</if>
             <if test="tenantId != null and tenantId != ''">tenant_id,</if>
             <if test="createBy != null and createBy != ''">create_by,</if>
             create_time
         )values(
@@ -115,6 +117,7 @@
             <if test="deptCheckStrictly != null">#{deptCheckStrictly},</if>
             <if test="status != null and status != ''">#{status},</if>
             <if test="remark != null and remark != ''">#{remark},</if>
             <if test="tenantId != null and tenantId != ''">#{tenantId},</if>
             <if test="createBy != null and createBy != ''">#{createBy},</if>
             sysdate()
         )
src/main/resources/mapper/system/SysUserMapper.xml
@@ -57,7 +57,7 @@
    
    <select id="selectUserList" parameterType="com.ruoyi.project.system.domain.SysUser" resultMap="SysUserResult">
        select u.user_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark,T2.dept_names from sys_user u
        left join
        inner join
        (    SELECT T1.user_id,GROUP_CONCAT(T2.dept_name SEPARATOR ', ') AS dept_names
            FROM
                sys_user_dept T1
src/main/resources/mapper/vehicleInformationCollectionReview/VehicleInformationCollectionReviewMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
<?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.vehicleInformationCollectionReview.mapper.VehicleInformationCollectionReviewMapper">
    <resultMap id="BaseResultMap" type="com.ruoyi.vehicleInformationCollectionReview.pojo.VehicleInformationCollectionReview">
            <id property="id" column="id" jdbcType="BIGINT"/>
            <result property="plateNo" column="plate_no" jdbcType="VARCHAR"/>
            <result property="plateColor" column="plate_color" jdbcType="VARCHAR"/>
            <result property="carType" column="car_type" jdbcType="VARCHAR"/>
            <result property="carVin" column="car_vin" jdbcType="VARCHAR"/>
            <result property="carModel" column="car_model" jdbcType="VARCHAR"/>
            <result property="engineModel" column="engine_model" jdbcType="VARCHAR"/>
            <result property="engineProductFactory" column="engine_product_factory" jdbcType="VARCHAR"/>
            <result property="engineNo" column="engine_no" jdbcType="VARCHAR"/>
            <result property="emissionStandard" column="emission_standard" jdbcType="VARCHAR"/>
            <result property="registeDate" column="registe_date" jdbcType="TIMESTAMP"/>
            <result property="natureOfUse" column="nature_of_use" jdbcType="VARCHAR"/>
            <result property="fuelType" column="fuel_type" jdbcType="VARCHAR"/>
            <result property="reviewStatus" column="review_status" jdbcType="VARCHAR"/>
            <result property="tenantId" column="tenant_id" jdbcType="INTEGER"/>
            <result property="createUser" column="create_user" jdbcType="VARCHAR"/>
            <result property="createTime" column="create_time" jdbcType="TIMESTAMP"/>
            <result property="updateUser" column="update_user" jdbcType="VARCHAR"/>
            <result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/>
    </resultMap>
    <sql id="Base_Column_List">
        id,plate_no,plate_color,
        car_type,car_vin,car_model,
        engine_model,engine_product_factory,engine_no,
        emission_standard,registe_date,nature_of_use,
        fuel_type,review_status,tenant_id,
        create_user,create_time,update_user,
        update_time
    </sql>
</mapper>
src/main/resources/mybatis/mybatis-config.xml
@@ -12,8 +12,8 @@
        <!-- é…ç½®é»˜è®¤çš„æ‰§è¡Œå™¨.SIMPLE就是普通执行器;REUSE执行器会重用预处理语句(prepared statements);BATCH执行器将重用语句并执行批量更新 -->
        <setting name="defaultExecutorType"      value="SIMPLE" />
        <!-- æŒ‡å®š MyBatis æ‰€ç”¨æ—¥å¿—的具体实现 -->
        <setting name="logImpl"                  value="SLF4J"  />
<!--        <setting name="logImpl"                  value="org.apache.ibatis.logging.stdout.StdOutImpl"  />-->
<!--        <setting name="logImpl"                  value="SLF4J"  />-->
        <setting name="logImpl"                  value="org.apache.ibatis.logging.stdout.StdOutImpl"  />
        <!-- ä½¿ç”¨é©¼å³°å‘½åæ³•转换字段 -->
        <!-- <setting name="mapUnderscoreToCamelCase" value="true"/> -->
    </settings>