zouyu
2026-01-16 f605b84620bf35bb02a2ee5ef2086c164b520e67
浪潮对接单点登录:MES制造执行系统功能迁移
已添加9个文件
已重命名1个文件
已修改41个文件
已删除45个文件
11332 ■■■■ 文件已修改
pom.xml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/framework/aspectj/DataScopeAspect.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/framework/aspectj/lang/annotation/DataScope.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionOrderController.java 105 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/SalesLedgerProductionAccountingController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/SalesLedgerSchedulingController.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/DaiDto.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProcessSchedulingDto.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductionDispatchAddDto.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/SalesLedgerProductDto.java 54 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/SalesLedgerSchedulingProcessDto.java 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductionOrderMapper.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/SalesLedgerSchedulingMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductionOrder.java 139 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/SalesLedgerScheduling.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/SalesLedgerWork.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductionOrderService.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/SalesLedgerSchedulingService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java 190 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/SalesLedgerSchedulingServiceImpl.java 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/SalesLedgerWorkServiceImpl.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/controller/SysDeptController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/controller/SysPostController.java 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/controller/SysRoleController.java 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/controller/SysUserController.java 60 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/domain/SysDept.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/domain/SysPost.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/domain/SysRole.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/mapper/SysDeptMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/mapper/SysPostMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/service/ISysDeptService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/service/ISysPostService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/project/system/service/impl/SysDeptServiceImpl.java 17 ●●●● 补丁 | 查看 | 原始文档 | 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 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/tide/controller/TideController.java 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/tide/pojo/TidePojo.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/tide/utils/TideUtils.java 191 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-aynm.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-bdsm.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-bhmy.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-cjny.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-cmny.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-demo.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-dev.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-dhdc.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-druid.yml 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-dzys.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-hbkj.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-hbxm.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-hckx.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-hcmy.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-hhkj.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-hsmy.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-hsxny.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-hxgy.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-hxsj.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-hysn.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-jjxm.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-jlsn.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-jmsl.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-jsmy.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-jsyny.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-jyhj.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-khl.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-mkzs.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-mqsp.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-mxsc.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-phmk.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-prod.yml 220 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-qlmc.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-rzny.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-test.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-test1.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-tide.yml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-tjxm.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-trsw.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-tymk.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-wdsy.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-xyhb.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-zjyj.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-zqhx.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-zyrq.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-zyrqCopy.yml 219 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionOrderMapper.xml 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/SalesLedgerProductionAccountingMapper.xml 23 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/SalesLedgerSchedulingMapper.xml 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/SalesLedgerWorkMapper.xml 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/system/SysDeptMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/system/SysPostMapper.xml 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/system/SysRoleMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/system/SysUserMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mybatis/mybatis-config.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -52,7 +52,11 @@
            <artifactId>knife4j-spring-boot-starter</artifactId>
            <version>3.0.3</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.16</version>
        </dependency>
        <!-- SpringBoot æ ¸å¿ƒåŒ… -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
@@ -129,6 +133,12 @@
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>${mybatis-plus.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>com.github.jsqlparser</groupId>
                    <artifactId>jsqlparser</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--mybatis-plus代码生成器-->
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
                {
@@ -177,4 +180,4 @@
            baseEntity.getParams().put(DATA_SCOPE, "");
        }
    }
}
}
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/production/controller/ProductionOrderController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,105 @@
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.time.LocalDate;
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);
    }
    /**
     * æŠ¥è¡¨åˆ†æž
     * @param startDate
     * @param endDate
     * @return
     */
    @GetMapping("/reportAnalysis")
    @ApiOperation("生产管理-报表分析")
    @Log(title = "报表分析", businessType = BusinessType.OTHER)
    public AjaxResult reportAnalysis(String startDate,String endDate){
        return AjaxResult.success(productionOrderService.reportAnalysis(startDate, endDate));
    }
}
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)
@@ -119,4 +108,4 @@
    }
}
}
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
@@ -14,6 +13,26 @@
@Data
@ApiModel
public class ProcessSchedulingDto {
    /**
     * å£å‘³åˆ†ç±»
     */
    private String type;
    /**
     * å¤‡æ³¨
     */
    private String remark;
    /**
     * æŸè€—
     */
    private String loss;
    /**
     * é¢†ç”¨
     */
    private String receive;
    private Long id;
@@ -49,4 +68,4 @@
    private String schedulingDate;
}
}
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;
    /**
@@ -38,4 +38,4 @@
    @ApiModelProperty(value = "排产日期")
    private String schedulingDate;
}
}
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;
    /**
@@ -69,4 +65,4 @@
    private String unit;
}
}
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;
    /**
@@ -132,4 +106,4 @@
    private Long tenantId;
}
}
src/main/java/com/ruoyi/production/mapper/ProductionOrderMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.production.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.production.pojo.ProductionOrder;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
/**
 * @author :yys
 * @date : 2025/11/26 14:18
 */
public interface ProductionOrderMapper extends BaseMapper<ProductionOrder> {
    Double selectFinishProduced(@Param("startTime") LocalDateTime startTime,@Param("endTime") LocalDateTime endTime);
    Double selectTotalWorkhours(@Param("startTime") LocalDateTime startTime,@Param("endTime") LocalDateTime endTime);
    Map<String,Object> selectProductData(@Param("startTime")LocalDateTime startTime, @Param("endTime")LocalDateTime endTime);
    List<Map<String,Object>> selectWorkhoursReport(@Param("startTime")LocalDateTime startTime, @Param("endTime")LocalDateTime endTime);
}
src/main/java/com/ruoyi/production/mapper/SalesLedgerSchedulingMapper.java
@@ -8,6 +8,7 @@
import com.ruoyi.production.pojo.SalesLedgerScheduling;
import org.apache.ibatis.annotations.Param;
import java.time.LocalDateTime;
import java.util.List;
/**
@@ -37,4 +38,6 @@
     * @return
     */
    IPage<SalesLedgerSchedulingProcessDto> listPageProcess(Page page,@Param("salesLedgerDto") SalesLedgerSchedulingProcessDto salesLedgerSchedulingDto);
    Double selectTobeProduced(@Param("startTime") LocalDateTime startTime,@Param("endTime") LocalDateTime endTime);
}
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;
@@ -92,4 +92,4 @@
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
}
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;
    /**
     * æŽ’产日期
     */
@@ -107,4 +127,4 @@
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
}
src/main/java/com/ruoyi/production/service/ProductionOrderService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
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;
import java.time.LocalDate;
import java.util.Map;
/**
 * @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);
    Map<String,Object> reportAnalysis(String startDate, String endDate);
}
src/main/java/com/ruoyi/production/service/SalesLedgerSchedulingService.java
@@ -30,5 +30,4 @@
    int processScheduling(List<ProcessSchedulingDto> processSchedulingDto);
    void exportOne(HttpServletResponse response);
}
src/main/java/com/ruoyi/production/service/impl/ProductionOrderServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,190 @@
package com.ruoyi.production.service.impl;
import cn.hutool.core.util.NumberUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.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.dto.SalesLedgerWorkDto;
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.apache.commons.lang3.ObjectUtils;
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.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
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, "生产派工");
    }
    @Override
    public Map<String, Object> reportAnalysis(String startDate, String endDate) {
        /*
        * production_order                    æ–°å¢žè®¢å•表
        * sales_ledger_scheduling             ç”Ÿäº§æ´¾å·¥è¡¨
        * sales_ledger_work                   å·¥åºæŽ’产
        * sales_ledger_production_accounting  ç”Ÿäº§æŠ¥å·¥
        * */
        Map<String, Object> map = new HashMap<>();
        //汇总信息
        Map<String, Object> totalMap = new HashMap<>();
        LocalDateTime startTime = null;
        LocalDateTime endTime = null;
        if(ObjectUtils.anyNotNull(startDate,endDate)){
            startTime = LocalDateTime.of(LocalDate.parse(startDate), LocalTime.MIN);
            endTime = LocalDateTime.of(LocalDate.parse(endDate), LocalTime.MAX);
        }
        LambdaQueryWrapper<ProductionOrder> betweenWrapper = Wrappers.<ProductionOrder>lambdaQuery().between(ObjectUtils.anyNotNull(startTime, endTime), ProductionOrder::getCreateTime, startTime, endTime);
        totalMap.put("totalOrderNum",productionOrderMapper.selectCount(betweenWrapper));
        totalMap.put("tobeProduced", salesLedgerSchedulingMapper.selectTobeProduced(startTime,endTime));
        totalMap.put("finishProduced",productionOrderMapper.selectFinishProduced(startTime,endTime));
        totalMap.put("totalWorkhours",productionOrderMapper.selectTotalWorkhours(startTime,endTime));
        map.put("totalData",totalMap);
        //生产报工统计
        map.put("productData",productionOrderMapper.selectProductData(startTime,endTime));
        //生产核算统计
        map.put("workHours",productionOrderMapper.selectWorkhoursReport(startTime,endTime));
        //生产报工详细
        SalesLedgerWorkDto salesLedgerWorkDto = new SalesLedgerWorkDto();
        salesLedgerWorkDto.setEntryDateStart(startDate);
        salesLedgerWorkDto.setEntryDateEnd(endDate);
        map.put("productDetails",salesLedgerWorkMapper.listPage(new Page<>(-1,-1), salesLedgerWorkDto).getRecords());
        return map;
    }
}
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;
@@ -121,4 +119,4 @@
            return productionReportDto;
        }).collect(Collectors.toList());
    }
}
}
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;
@@ -76,11 +78,12 @@
    @PostMapping
    public AjaxResult add(@Validated @RequestBody SysDept dept)
    {
        if (!deptService.checkDeptNameUnique(dept))
        {
            return error("新增部门'" + dept.getDeptName() + "'失败,部门名称已存在");
        }
//        if (!deptService.checkDeptNameUnique(dept))
//        {
//            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;
@@ -77,15 +79,16 @@
    @PostMapping
    public AjaxResult add(@Validated @RequestBody SysPost post)
    {
        if (!postService.checkPostNameUnique(post))
        {
            return error("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在");
        }
        else if (!postService.checkPostCodeUnique(post))
        {
            return error("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在");
        }
//        if (!postService.checkPostNameUnique(post))
//        {
//            return error("新增岗位'" + post.getPostName() + "'失败,岗位名称已存在");
//        }
//        else if (!postService.checkPostCodeUnique(post))
//        {
//            return error("新增岗位'" + post.getPostName() + "'失败,岗位编码已存在");
//        }
        post.setCreateBy(getUsername());
        post.setTenantId(SecurityUtils.getLoginUser().getTenantId());
        return toAjax(postService.insertPost(post));
    }
@@ -97,14 +100,14 @@
    @PutMapping
    public AjaxResult edit(@Validated @RequestBody SysPost post)
    {
        if (!postService.checkPostNameUnique(post))
        {
            return error("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在");
        }
        else if (!postService.checkPostCodeUnique(post))
        {
            return error("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在");
        }
//        if (!postService.checkPostNameUnique(post))
//        {
//            return error("修改岗位'" + post.getPostName() + "'失败,岗位名称已存在");
//        }
//        else if (!postService.checkPostCodeUnique(post))
//        {
//            return error("修改岗位'" + post.getPostName() + "'失败,岗位编码已存在");
//        }
        post.setUpdateBy(getUsername());
        return toAjax(postService.updatePost(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));
    }
@@ -115,15 +118,15 @@
    public AjaxResult edit(@Validated @RequestBody SysRole role)
    {
        roleService.checkRoleAllowed(role);
        roleService.checkRoleDataScope(role.getRoleId());
        if (!roleService.checkRoleNameUnique(role))
        {
            return error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在");
        }
        else if (!roleService.checkRoleKeyUnique(role))
        {
            return error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在");
        }
//        roleService.checkRoleDataScope(role.getRoleId());
//        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);
@@ -130,20 +131,21 @@
    @PostMapping
    public AjaxResult add(@Validated @RequestBody SysUser user)
    {
        roleService.checkRoleDataScope(user.getRoleIds());
        if (!userService.checkUserNameUnique(user))
        {
            return error("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
        }
        else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
        {
            return error("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
        }
        else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
        {
            return error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
        }
//        roleService.checkRoleDataScope(user.getRoleIds());
//        if (!userService.checkUserNameUnique(user))
//        {
//            return error("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
//        }
//        else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
//        {
//            return error("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
//        }
//        else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
//        {
//            return error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
//        }
        user.setCreateBy(getUsername());
        user.setTenantId(SecurityUtils.getLoginUser().getTenantId());
        user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
        return toAjax(userService.insertUser(user));
    }
@@ -156,21 +158,21 @@
    @PutMapping
    public AjaxResult edit(@Validated @RequestBody SysUser user)
    {
        userService.checkUserAllowed(user);
        userService.checkUserDataScope(user.getUserId());
        roleService.checkRoleDataScope(user.getRoleIds());
        if (!userService.checkUserNameUnique(user))
        {
            return error("修改用户'" + user.getUserName() + "'失败,登录账号已存在");
        }
        else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
        {
            return error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
        }
        else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
        {
            return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
        }
//        userService.checkUserAllowed(user);
//        userService.checkUserDataScope(user.getUserId());
//        roleService.checkRoleDataScope(user.getRoleIds());
//        if (!userService.checkUserNameUnique(user))
//        {
//            return error("修改用户'" + user.getUserName() + "'失败,登录账号已存在");
//        }
//        else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user))
//        {
//            return error("修改用户'" + user.getUserName() + "'失败,手机号码已存在");
//        }
//        else if (StringUtils.isNotEmpty(user.getEmail()) && !userService.checkEmailUnique(user))
//        {
//            return error("修改用户'" + user.getUserName() + "'失败,邮箱账号已存在");
//        }
        user.setUpdateBy(getUsername());
        userService.bindUserDept(user);
        return toAjax(userService.updateUser(user));
src/main/java/com/ruoyi/project/system/domain/SysDept.java
@@ -54,7 +54,20 @@
    /** éƒ¨é—¨ç¼–号 */
    private String deptNick;
    /**
     * ç§Ÿæˆ·id
     */
    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,19 @@
    @Excel(name = "状态", readConverterExp = "0=正常,1=停用")
    private String status;
    /**
     * ç§Ÿæˆ·id
     */
    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
@@ -94,6 +94,19 @@
        return roleId != null && 1L == roleId;
    }
    /**
     * ç§Ÿæˆ·id
     */
    private Long tenantId;
    public Long getTenantId() {
        return tenantId;
    }
    public void setTenantId(Long tenantId) {
        this.tenantId = tenantId;
    }
    @NotBlank(message = "角色名称不能为空")
    @Size(min = 0, max = 30, message = "角色名称长度不能超过30个字符")
    public String getRoleName()
src/main/java/com/ruoyi/project/system/mapper/SysDeptMapper.java
@@ -1,6 +1,8 @@
package com.ruoyi.project.system.mapper;
import java.util.List;
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import org.apache.ibatis.annotations.Param;
import com.ruoyi.project.system.domain.SysDept;
@@ -83,6 +85,7 @@
     * @param dept éƒ¨é—¨ä¿¡æ¯
     * @return ç»“æžœ
     */
    @InterceptorIgnore(tenantLine = "true")
    public int insertDept(SysDept dept);
    /**
@@ -91,6 +94,7 @@
     * @param dept éƒ¨é—¨ä¿¡æ¯
     * @return ç»“æžœ
     */
    @InterceptorIgnore(tenantLine = "true")
    public int updateDept(SysDept dept);
    /**
@@ -98,6 +102,7 @@
     * 
     * @param deptIds éƒ¨é—¨ID组
     */
    @InterceptorIgnore(tenantLine = "true")
    public void updateDeptStatusNormal(Long[] deptIds);
    /**
@@ -106,6 +111,7 @@
     * @param depts å­å…ƒç´ 
     * @return ç»“æžœ
     */
    @InterceptorIgnore(tenantLine = "true")
    public int updateDeptChildren(@Param("depts") List<SysDept> depts);
    /**
@@ -114,6 +120,7 @@
     * @param deptId éƒ¨é—¨ID
     * @return ç»“æžœ
     */
    @InterceptorIgnore(tenantLine = "true")
    public int deleteDeptById(Long deptId);
    /**
@@ -122,4 +129,6 @@
     * @return
     */
    Long maxLevelDeptId(Long deptId);
    SysDept selectDeptByDeptName(@Param("deptName") String deptName);
}
src/main/java/com/ruoyi/project/system/mapper/SysPostMapper.java
@@ -1,7 +1,10 @@
package com.ruoyi.project.system.mapper;
import java.util.List;
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import com.ruoyi.project.system.domain.SysPost;
import org.apache.ibatis.annotations.Param;
/**
 * å²—位信息 æ•°æ®å±‚
@@ -55,6 +58,7 @@
     * @param postId å²—位ID
     * @return ç»“æžœ
     */
    @InterceptorIgnore(tenantLine = "true")
    public int deletePostById(Long postId);
    /**
@@ -63,6 +67,7 @@
     * @param postIds éœ€è¦åˆ é™¤çš„岗位ID
     * @return ç»“æžœ
     */
    @InterceptorIgnore(tenantLine = "true")
    public int deletePostByIds(Long[] postIds);
    /**
@@ -71,6 +76,7 @@
     * @param post å²—位信息
     * @return ç»“æžœ
     */
    @InterceptorIgnore(tenantLine = "true")
    public int updatePost(SysPost post);
    /**
@@ -79,6 +85,7 @@
     * @param post å²—位信息
     * @return ç»“æžœ
     */
    @InterceptorIgnore(tenantLine = "true")
    public int insertPost(SysPost post);
    /**
@@ -96,4 +103,6 @@
     * @return ç»“æžœ
     */
    public SysPost checkPostCodeUnique(String postCode);
    List<SysPost> selectPostByTenantId(@Param("tenantId") Long tenantId);
}
src/main/java/com/ruoyi/project/system/mapper/SysUserMapper.java
@@ -3,6 +3,7 @@
import java.util.ArrayList;
import java.util.List;
import com.baomidou.mybatisplus.annotation.InterceptorIgnore;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
@@ -70,6 +71,7 @@
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç»“æžœ
     */
    @InterceptorIgnore(tenantLine = "true")
    public int insertUser(SysUser user);
    /**
@@ -78,6 +80,7 @@
     * @param user ç”¨æˆ·ä¿¡æ¯
     * @return ç»“æžœ
     */
    @InterceptorIgnore(tenantLine = "true")
    public int updateUser(SysUser user);
    /**
@@ -87,6 +90,7 @@
     * @param avatar å¤´åƒåœ°å€
     * @return ç»“æžœ
     */
    @InterceptorIgnore(tenantLine = "true")
    public int updateUserAvatar(@Param("userName") String userName, @Param("avatar") String avatar);
    /**
@@ -96,6 +100,7 @@
     * @param password å¯†ç 
     * @return ç»“æžœ
     */
    @InterceptorIgnore(tenantLine = "true")
    public int resetUserPwd(@Param("userName") String userName, @Param("password") String password);
    /**
@@ -104,6 +109,7 @@
     * @param userId ç”¨æˆ·ID
     * @return ç»“æžœ
     */
    @InterceptorIgnore(tenantLine = "true")
    public int deleteUserById(Long userId);
    /**
@@ -112,6 +118,7 @@
     * @param userIds éœ€è¦åˆ é™¤çš„用户ID
     * @return ç»“æžœ
     */
    @InterceptorIgnore(tenantLine = "true")
    public int deleteUserByIds(Long[] userIds);
    /**
src/main/java/com/ruoyi/project/system/service/ISysDeptService.java
@@ -4,6 +4,9 @@
import com.ruoyi.framework.web.domain.TreeSelect;
import com.ruoyi.project.system.domain.SysDept;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size;
/**
 * éƒ¨é—¨ç®¡ç† æœåС层
 * 
@@ -128,4 +131,11 @@
     * @return
     */
    Long maxLevelDeptId(Long deptId);
    /**
     * æ ¹æ®éƒ¨é—¨åç§°æŸ¥è¯¢éƒ¨é—¨ä¿¡æ¯
     *
     * @param deptName éƒ¨é—¨åç§°
     * @return éƒ¨é—¨ä¿¡æ¯é›†åˆ
     */
    public SysDept selectDeptByDeptName(String deptName);
}
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
@@ -4,6 +4,8 @@
import java.util.Iterator;
import java.util.List;
import java.util.stream.Collectors;
import cn.hutool.core.util.ObjectUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.common.constant.UserConstants;
@@ -42,7 +44,7 @@
     * @return éƒ¨é—¨ä¿¡æ¯é›†åˆ
     */
    @Override
    @DataScope(deptAlias = "d")
    @DataScope(tenantIdFelid = "d")
    public List<SysDept> selectDeptList(SysDept dept)
    {
        return deptMapper.selectDeptList(dept);
@@ -213,11 +215,15 @@
    {
        SysDept info = deptMapper.selectDeptById(dept.getParentId());
        // å¦‚果父节点不为正常状态,则不允许新增子节点
        if (!UserConstants.DEPT_NORMAL.equals(info.getStatus()))
        if (ObjectUtil.isNotNull(info) && !UserConstants.DEPT_NORMAL.equals(info.getStatus()))
        {
            throw new ServiceException("部门停用,不允许新增");
        }
        dept.setAncestors(info.getAncestors() + "," + dept.getParentId());
        if(ObjectUtil.isNotNull(info) && 0L!=dept.getParentId()){
            dept.setAncestors(info.getAncestors() + "," + dept.getParentId());
        }else{
            dept.setAncestors("0");
        }
        return deptMapper.insertDept(dept);
    }
@@ -261,6 +267,11 @@
        deptMapper.updateDeptStatusNormal(deptIds);
    }
    @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);
@@ -554,6 +554,7 @@
     * @return
     */
    @Override
//    @DataScope(tenantIdFelid = "u")
    public List<SysUser> userListNoPage(SysUser user) {
        return userMapper.selectUserList(user);
    }
src/main/java/com/ruoyi/tide/controller/TideController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,126 @@
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;
import com.ruoyi.common.utils.SecurityUtils;
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;
@RequestMapping("/tide")
@RestController
@Api(tags = "对接浪潮系统")
@Anonymous
@Slf4j
public class TideController {
    @Autowired
    private SysLoginService loginService;
    @Autowired
    private ISysUserService userService;
    @Autowired
    private ISysDeptService deptService;
    @ApiOperation(value = "登录")
    @PostMapping("/tideLogin")
    public AjaxResult login(@RequestBody TidePojo tidePojo) {
        String token = TideUtils.getToken(tidePojo.getCode());
        JSONObject userInfo = TideUtils.getUserInfo(token);
        JSONObject tenant = JSONObject.parseObject(userInfo.get("tenant").toString());
        AjaxResult ajax = AjaxResult.success();
        // ç”Ÿæˆä»¤ç‰Œ
        String generateToken = loginService.login(tenant.get("tenantAccount").toString(), tenant.get("tenantPassword").toString(), null,
                IdWorker.get32UUID());
        ajax.put(Constants.TOKEN, generateToken);
        return ajax;
    }
    @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(ObjectUtils.isEmpty(user)){
            //1.先新增用户对应的公司
            SysDept dept = new SysDept();
            dept.setParentId(0L);//父公司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);
            user.setUserName(tidePojo.getPltAccountLogin());
            user.setNickName(tidePojo.getEnterpriseName());
            user.setStatus("0");
            user.setDelFlag("0");
            user.setPostIds(new Long[]{1L});
            user.setRoleId(1L);
            user.setRoleIds(new Long[]{2L});//默认普通角色
            user.setDeptIds(new Long[]{dept.getDeptId()});//绑定公司
            user.setTenantId(dept.getDeptId());
            userService.insertUser(user);
        }
        Map<String, Object> map = new HashMap<>();
        map.put("account", tidePojo.getPltAccountLogin());
        map.put("token", defaultPwd);
        map.put("tenantId", user.getUserId());
        return TideUtils.getResult(20000, "成功", map);
    }
    @PostMapping("/cancellation")
    public JSONObject cancellation (@RequestBody TidePojo tidePojo) {
        log.info("执行了注销信息:" + tidePojo);
        if(Objects.nonNull(tidePojo)){
            SysUser sysUser = userService.selectUserByUserName(tidePojo.getPltAccountLogin());
            if(Objects.nonNull(sysUser)){
                userService.deleteUserById(sysUser.getUserId());
            }
        }
        return TideUtils.getResult(20000, "成功", null);
    }
    public static void main(String[] args) {
        String password = SecurityUtils.encryptPassword("c($Rb_@!n%U7");
        System.out.println(password);
    }
}
src/main/java/com/ruoyi/tide/pojo/TidePojo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
package com.ruoyi.tide.pojo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class TidePojo {
    @ApiModelProperty("企业名称")
    private String enterpriseName;
    @ApiModelProperty("平台用户")
    private String pltUserCn;
    @ApiModelProperty("平台账号")
    private String pltAccountLogin;
    @ApiModelProperty("订购时长")
    private Integer purchaseDuration;
    @ApiModelProperty("订单时长单位")
    private String purchaseUnit;
    @ApiModelProperty("appKey")
    private String appKey;
    @ApiModelProperty("appSecret")
    private String appSecret;
    @ApiModelProperty("code")
    private String code;
}
src/main/java/com/ruoyi/tide/utils/TideUtils.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,191 @@
package com.ruoyi.tide.utils;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.crypto.digest.HMac;
import cn.hutool.crypto.digest.HmacAlgorithm;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.util.HashMap;
@Data
@Component
@Slf4j
public class TideUtils {
    public static String APP_ID;
    public static String APP_SECRET;
    @Value("${inspur.appId}")
    private String appId;
    @Value("${inspur.appSecret}")
    private String appSecret;
    @Value("${inspur.appId}")
    public void setAppId(String appId) {
        TideUtils.APP_ID = appId;
    }
    @Value("${inspur.appSecret}")
    public void setAppSecret(String appSecret) {
        TideUtils.APP_SECRET = appSecret;
    }
    // å†…网地址
    private final static String ip = "http://10.136.0.8:8083";
    // MD5加密并转换为16进制
    public static String md5Encryption(String input) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] digest = md.digest(input.getBytes());
            StringBuilder sb = new StringBuilder();
            for (byte b : digest) {
                sb.append(String.format("%02x", b & 0xff));
            }
            return sb.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
            return null;
        }
    }
    // get请求
    public static HashMap<String, String> getGetHeader(String parameter) {
        // æ—¶é—´æˆ³
        String xTime = String.valueOf(DateUtil.current());
        // èŽ·å–éšæœº16位字符串
        String xRandom = RandomUtil.randomString(16);
        String xSignSplicingTogether;
        // æœ‰å‚æ•°
        if (ObjectUtils.isNotEmpty(parameter)) {
            // åŠ å¯†å¾—å‡ºx-body
            String xBody = md5Encryption(parameter);
            // ä¸ºx-sign加密做拼接
            xSignSplicingTogether = "x-body=" + xBody + "&x-random=" + xRandom + "&x-time=" + xTime;
        // æ— å‚æ•°
        } else {
            xSignSplicingTogether = "x-random=" + xRandom + "&x-time=" + xTime;
        }
        // é…ç½®åŠ å¯†æ–¹å¼ä¸Žå¯†é’¥
        HMac hMac = new HMac(HmacAlgorithm.HmacSHA256, APP_SECRET.getBytes());
        // å¾—出x-sign
        String xSign = hMac.digestHex(xSignSplicingTogether);
        HashMap<String, String> result = new HashMap<>();
        result.put("x-time", xTime);
        result.put("x-random", xRandom);
        result.put("x-sign", xSign);
        result.put("appKey", APP_ID);
        return result;
    }
    // post请求
    public static HashMap<String, String> getPostHeader(String parameter) {
        // æ—¶é—´æˆ³
        String xTime = String.valueOf(DateUtil.current());
        // èŽ·å–éšæœº16位字符串
        String xRandom = RandomUtil.randomString(16);
        String xSignSplicingTogether;
        // æœ‰å‚æ•°
        if (ObjectUtils.isNotEmpty(parameter)) {
            // åŠ å¯†å¾—å‡ºx-body
            String xBody = md5Encryption(parameter);
            // ä¸ºx-sign加密做拼接
            xSignSplicingTogether = "x-body=" + xBody + "&x-random=" + xRandom + "&x-time=" + xTime;
            // æ— å‚æ•°
        } else {
            xSignSplicingTogether = "x-random=" + xRandom + "&x-time=" + xTime;
        }
        // x-sign åР坆
        HMac hMac = new HMac(HmacAlgorithm.HmacSHA256, APP_SECRET.getBytes());
        String xSign = hMac.digestHex(xSignSplicingTogether);
        HashMap<String, String> result = new HashMap<>();
        result.put("x-time", xTime);
        result.put("x-random", xRandom);
        result.put("x-sign", xSign);
        result.put("appKey", APP_ID);
        return result;
    }
    /**
     * äº”分钟一次的心跳
     */
    @Scheduled(cron = "0 0/5 * * * ?")
    public static void heartbeat(){
        HashMap<String, String> header = getGetHeader(null);
        String url = ip + "/cpn/api/extra/v1/application/heartbeat";
        String body = HttpRequest.get(url).headerMap(header, false).execute().body();
        System.out.println(body + "应用心跳执行成功!");
    }
    // èŽ·å–token
    public static String getToken(String code) {
        String url = ip + "/cpn/extral/applicationCode/appAuthCheck";
        JSONObject json = new JSONObject();
        json.put("code", code);
        json.put("appID", APP_ID);
        json.put("appSecret", APP_SECRET);
        HashMap<String, String> header = getPostHeader(json.toString());
        String body = HttpRequest.post(url)
                .headerMap(header, false)
                .body(json.toString())
                .execute().body();
        JSONObject jsonObject = JSONObject.parseObject(body);
        return jsonObject.get("data").toString();
    }
    // èŽ·å–ç”¨æˆ·ä¿¡æ¯
    public static JSONObject getUserInfo(String token) {
        String url = ip + "/cpn/api/extral/applicationCode/getUserInfoByToken";
        JSONObject json = new JSONObject();
        json.put("appID", APP_ID);
        HashMap<String, String> header = getPostHeader(json.toString());
        header.put("Authorization", token);
        String body = HttpRequest.post(url)
                .headerMap(header, false)
                .body(json.toString())
                .execute().body();
        JSONObject jsonObject = JSONObject.parseObject(body);
        return JSONObject.parseObject(jsonObject.get("data").toString());
    }
    public static JSONObject getResult(Integer code, String msg, Object data) {
        JSONObject json = new JSONObject();
        json.put("code", code);
        json.put("msg", msg);
        json.put("data", data);
        String xRandom = RandomUtil.randomString(16);
        json.put("traceId", xRandom);
        return json;
    }
    public static String getRandomString(int length) {
        SecureRandom random = new SecureRandom();
        String uppercaseLetters = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        String lowercaseLetters = "abcdefghijklmnopqrstuvwxyz";
        String numbers = "0123456789";
        String specialCharacters = "!@$%^&*()_+-=.";
        String characterSet = uppercaseLetters + lowercaseLetters + numbers + specialCharacters;
        StringBuilder passwordBuilder = new StringBuilder();
        for (int i = 0; i < length; i++) {
            int randomIndex = random.nextInt(characterSet.length());
            char randomChar = characterSet.charAt(randomIndex);
            passwordBuilder.append(randomChar);
        }
        return passwordBuilder.toString();
    }
}
src/main/resources/application-aynm.yml
ÎļþÒÑɾ³ý
src/main/resources/application-bdsm.yml
ÎļþÒÑɾ³ý
src/main/resources/application-bhmy.yml
ÎļþÒÑɾ³ý
src/main/resources/application-cjny.yml
ÎļþÒÑɾ³ý
src/main/resources/application-cmny.yml
ÎļþÒÑɾ³ý
src/main/resources/application-demo.yml
ÎļþÒÑɾ³ý
src/main/resources/application-dev.yml
ÎļþÒÑɾ³ý
src/main/resources/application-dhdc.yml
ÎļþÒÑɾ³ý
src/main/resources/application-druid.yml
ÎļþÒÑɾ³ý
src/main/resources/application-dzys.yml
ÎļþÒÑɾ³ý
src/main/resources/application-hbkj.yml
ÎļþÒÑɾ³ý
src/main/resources/application-hbxm.yml
ÎļþÒÑɾ³ý
src/main/resources/application-hckx.yml
ÎļþÒÑɾ³ý
src/main/resources/application-hcmy.yml
ÎļþÒÑɾ³ý
src/main/resources/application-hhkj.yml
ÎļþÒÑɾ³ý
src/main/resources/application-hsmy.yml
ÎļþÒÑɾ³ý
src/main/resources/application-hsxny.yml
ÎļþÒÑɾ³ý
src/main/resources/application-hxgy.yml
ÎļþÒÑɾ³ý
src/main/resources/application-hxsj.yml
ÎļþÒÑɾ³ý
src/main/resources/application-hysn.yml
ÎļþÒÑɾ³ý
src/main/resources/application-jjxm.yml
ÎļþÒÑɾ³ý
src/main/resources/application-jlsn.yml
ÎļþÒÑɾ³ý
src/main/resources/application-jmsl.yml
ÎļþÒÑɾ³ý
src/main/resources/application-jsmy.yml
ÎļþÒÑɾ³ý
src/main/resources/application-jsyny.yml
ÎļþÒÑɾ³ý
src/main/resources/application-jyhj.yml
ÎļþÒÑɾ³ý
src/main/resources/application-khl.yml
ÎļþÒÑɾ³ý
src/main/resources/application-mkzs.yml
ÎļþÒÑɾ³ý
src/main/resources/application-mqsp.yml
ÎļþÒÑɾ³ý
src/main/resources/application-mxsc.yml
ÎļþÒÑɾ³ý
src/main/resources/application-phmk.yml
ÎļþÒÑɾ³ý
src/main/resources/application-prod.yml
ÎļþÒÑɾ³ý
src/main/resources/application-qlmc.yml
ÎļþÒÑɾ³ý
src/main/resources/application-rzny.yml
ÎļþÒÑɾ³ý
src/main/resources/application-test.yml
ÎļþÒÑɾ³ý
src/main/resources/application-test1.yml
ÎļþÒÑɾ³ý
src/main/resources/application-tide.yml
ÎļþÃû´Ó src/main/resources/application-nydl.yml ÐÞ¸Ä
@@ -1,3 +1,7 @@
# èН坼-MES制造执行系统项目相关配置
inspur:
  appId: 19472937-3039-4bf1-8334-13dc20e076e5
  appSecret: b57bbad60724f810e7bb7e1e7b8791b63eba50e50faef6fa819ade822fac9e4a
# é¡¹ç›®ç›¸å…³é…ç½®
ruoyi:
  # åç§°
@@ -17,7 +21,7 @@
# å¼€å‘环境配置
server:
  # æœåŠ¡å™¨çš„HTTP端口,默认为8080
  port: 9104
  port: 8009
  servlet:
    # åº”用的访问路径
    context-path: /
@@ -62,9 +66,9 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://192.168.0.182:3306/product-inventory-management-nydl?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://10.136.12.71:3306/mes-ruoyi?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: HpencZdyK7WrtQvBUKnr
        password: zttZTT123!
      # ä»Žåº“数据源
      slave:
        # ä»Žæ•°æ®æºå¼€å…³/默认关闭
@@ -135,14 +139,14 @@
  redis:
    # åœ°å€
#    host: 127.0.0.1
    host: 192.168.0.182
    host: 10.136.12.71
    # ç«¯å£ï¼Œé»˜è®¤ä¸º6379
    port: 6379
    # æ•°æ®åº“索引
    database: 0
    database: 14
    # å¯†ç 
#    password: root2022!
    password:
    password: zttZTT123!
    # è¿žæŽ¥è¶…æ—¶æ—¶é—´
    timeout: 10s
src/main/resources/application-tjxm.yml
ÎļþÒÑɾ³ý
src/main/resources/application-trsw.yml
ÎļþÒÑɾ³ý
src/main/resources/application-tymk.yml
ÎļþÒÑɾ³ý
src/main/resources/application-wdsy.yml
ÎļþÒÑɾ³ý
src/main/resources/application-xyhb.yml
ÎļþÒÑɾ³ý
src/main/resources/application-zjyj.yml
ÎļþÒÑɾ³ý
src/main/resources/application-zqhx.yml
ÎļþÒÑɾ³ý
src/main/resources/application-zyrq.yml
ÎļþÒÑɾ³ý
src/main/resources/application-zyrqCopy.yml
ÎļþÒÑɾ³ý
src/main/resources/application.yml
@@ -1,4 +1,4 @@
# Spring配置
spring:
  profiles:
    active: demo
    active: tide
src/main/resources/mapper/production/ProductionOrderMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,52 @@
<?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">
    <select id="selectFinishProduced" resultType="java.lang.Double">
        SELECT
            IFNULL(SUM( finished_num ),0) finished_num
        FROM
            sales_ledger_production_accounting
        <where>
            <if test="startTime !=null and endTime!=null">
                AND create_time BETWEEN #{startTime} AND #{endTime}
            </if>
        </where>
    </select>
    <select id="selectTotalWorkhours" resultType="java.lang.Double">
        SELECT
        IFNULL(SUM( work_hours ),0) finished_num
        FROM
        sales_ledger_production_accounting
        <where>
            <if test="startTime !=null and endTime!=null">
                AND create_time BETWEEN #{startTime} AND #{endTime}
            </if>
        </where>
    </select>
    <select id="selectProductData" resultType="java.util.Map">
        select
            SUM(CASE WHEN `status`=1 THEN scheduling_num ELSE 0 END) AS tobeProduced,
            SUM(CASE WHEN `status`=2 THEN (scheduling_num-finished_num) ELSE 0 END) AS inProduced,
            SUM(CASE WHEN `status`=3 THEN finished_num ELSE 0 END) AS finishProduced
        from sales_ledger_work
        <where>
            <if test="startTime !=null and endTime!=null">
                AND create_time BETWEEN #{startTime} AND #{endTime}
            </if>
        </where>
    </select>
    <select id="selectWorkhoursReport" resultType="java.util.Map">
        select
        SUM(work_hours) AS workHours,
        process
        from sales_ledger_production_accounting
        <where>
            <if test="startTime !=null and endTime!=null">
                AND create_time BETWEEN #{startTime} AND #{endTime}
            </if>
        </where>
        GROUP BY process
    </select>
</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')
@@ -50,4 +35,4 @@
        group by t4.id
        order by t4.update_time desc
    </select>
</mapper>
</mapper>
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')
@@ -111,4 +99,15 @@
        </where>
        order by T2.status asc
    </select>
    <select id="selectTobeProduced" resultType="java.lang.Double">
        SELECT
            IFNULL(SUM(scheduling_num - finished_num),0) AS calc_num
        FROM
            sales_ledger_scheduling
        WHERE `status` = 1
        <if test="startTime !=null and endTime!=null">
            AND create_time BETWEEN #{startTime} AND #{endTime}
        </if>
    </select>
</mapper>
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')
@@ -50,4 +43,4 @@
        </where>
        order by t4.update_time desc
    </select>
</mapper>
</mapper>
src/main/resources/mapper/system/SysDeptMapper.xml
@@ -100,6 +100,7 @@
             <if test="email != null and email != ''">email,</if>
            <if test="deptNick != null and deptNick != ''">dept_nick,</if>
             <if test="status != null">status,</if>
            <if test="tenantId != null and tenantId != ''">tenant_id,</if>
             <if test="createBy != null and createBy != ''">create_by,</if>
             create_time
         )values(
@@ -113,6 +114,7 @@
             <if test="email != null and email != ''">#{email},</if>
            <if test="deptNick != null and deptNick != '' ">#{deptNick},</if>
             <if test="status != null">#{status},</if>
            <if test="tenantId != null and tenantId != '' ">#{tenantId},</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,8 +73,14 @@
        <include refid="selectPostVo"/>
         where post_code=#{postCode} limit 1
    </select>
    <update id="updatePost" parameterType="com.ruoyi.project.system.domain.SysPost">
    <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
         <set>
             <if test="postCode != null and postCode != ''">post_code = #{postCode},</if>
@@ -94,6 +102,7 @@
             <if test="postSort != null">post_sort,</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(
@@ -103,6 +112,7 @@
             <if test="postSort != null">#{postSort},</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/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/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>