修改销售台账和生产订单绑定逻辑,修复销售台账和生产订单页面展示数据bug
已添加6个文件
已修改16个文件
581 ■■■■■ 文件已修改
doc/sales_ledger_production_ref.sql 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductOrderController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductionProductMainController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/SalesLedgerProductionAccountingController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductOrderMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductOrderService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/SalesQuotationController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductionRefMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/SalesLedger.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/pojo/SalesLedgerProductionRef.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/SalesLedgerProductionRefService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductionRefServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductOrderMapper.xml 194 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductionProductMainMapper.xml 107 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/quality/QualityInspectMapper.xml 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/SalesLedgerProductionRefMapper.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/sales_ledger_production_ref.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,31 @@
/*
 Navicat Premium Data Transfer
 Source Server         : localhost
 Source Server Type    : MySQL
 Source Server Version : 80030 (8.0.30)
 Source Host           : localhost:3306
 Source Schema         : product-inventory-management-hsxny
 Target Server Type    : MySQL
 Target Server Version : 80030 (8.0.30)
 File Encoding         : 65001
 Date: 23/07/2026 14:42:04
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for sales_ledger_production_ref
-- ----------------------------
DROP TABLE IF EXISTS `sales_ledger_production_ref`;
CREATE TABLE `sales_ledger_production_ref`  (
  `id` bigint NOT NULL,
  `sales_ledger_id` int NOT NULL COMMENT '销售台账id',
  `product_order_id` int NOT NULL COMMENT '生产订单id',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
SET FOREIGN_KEY_CHECKS = 1;
src/main/java/com/ruoyi/production/controller/ProductOrderController.java
@@ -31,6 +31,12 @@
        return R.ok(productOrderService.pageProductOrder(page, productOrder));
    }
    @ApiOperation("根据产品信息id获取生产订单")
    @PostMapping("listByProductModelId")
    public R listByProductModelId(@RequestBody List<Long> productModelIds) {
        return R.ok(productOrderService.listByProductModelId(productModelIds));
    }
    @ApiOperation("绑定工艺路线")
    @PostMapping("/bindingRoute")
    public R bindingRoute(@RequestBody ProductOrder productOrder) {
src/main/java/com/ruoyi/production/controller/ProductionProductMainController.java
@@ -28,6 +28,7 @@
     * @return
     */
    @GetMapping("listPage")
    @ApiOperation("报工查询")
    public R page(Page<ProductionProductMainDto> page, ProductionProductMainDto productionProductMainDto) {
        return R.ok(productionProductMainService.listPageProductionProductMainDto(page, productionProductMainDto));
    }
src/main/java/com/ruoyi/production/controller/SalesLedgerProductionAccountingController.java
@@ -59,19 +59,19 @@
    }
//----------------------------------------------------------------------------------------------------------------------------------------------------
    @GetMapping("/page")
    @ApiModelProperty("查询工人生产工资信息")
    @ApiOperation("查询工人生产工资信息")
    public R pageProductionAccounting(SalesLedgerProductionAccountingDto salesLedgerProductionAccountingDto, Page page){
        return R.ok(salesLedgerProductionAccountingService.pageProductionAccounting(salesLedgerProductionAccountingDto, page));
    }
    @GetMapping("/listProductionDetails")
    @ApiModelProperty("查询工人生产工资信息")
    @ApiOperation("查询工人生产工资信息")
    public R listProductionDetails(SalesLedgerProductionAccountingDto salesLedgerProductionAccountingDto, Page page){
        return R.ok(salesLedgerProductionAccountingService.listProductionDetails(salesLedgerProductionAccountingDto,page));
    }
    @GetMapping("getByUserId")
    @ApiModelProperty("查询工人生产工资信息")
    @ApiOperation("查询工人生产工资信息")
    public R getByUserId(UserProductionAccountingDto userProductionAccountingDto){
        return R.ok(salesLedgerProductionAccountingService.getByUserId(userProductionAccountingDto));
    }
src/main/java/com/ruoyi/production/mapper/ProductOrderMapper.java
@@ -27,4 +27,8 @@
    Integer countCompleted(@Param("startDate") String startDate, @Param("endDate") String endDate);
    Integer countPending(@Param("startDate") String startDate, @Param("endDate") String endDate);
    List<ProductOrderDto> listByProductModelId(@Param("productModelIds") List<Long> productModelIds);
    List<ProductOrderDto> listByProductOrderId(@Param("productOrderIds") List<Long> productOrderIds);
}
src/main/java/com/ruoyi/production/service/ProductOrderService.java
@@ -25,4 +25,7 @@
    Boolean addProductOrder(ProductOrder productOrder);
    Boolean delete(Long[] id);
    List<ProductOrderDto> listByProductModelId(List<Long> productModelIds);
}
src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -23,6 +23,7 @@
import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
@@ -68,6 +69,14 @@
    @Override
    public IPage<ProductOrderDto> pageProductOrder(Page page, ProductOrderDto productOrder) {
        return productOrderMapper.pageProductOrder(page, productOrder);
    }
    @Override
    public List<ProductOrderDto> listByProductModelId(List<Long> productModelIds) {
        if (productModelIds == null || productModelIds.isEmpty()) {
            return Collections.emptyList();
        }
        return productOrderMapper.listByProductModelId(productModelIds);
    }
    @Override
@@ -170,6 +179,7 @@
        return true;
    }
    //获取当前生产订单号
    public String getMaxOrderNoByDate(String datePrefix) {
        QueryWrapper<ProductOrder> queryWrapper = new QueryWrapper<>();
src/main/java/com/ruoyi/sales/controller/SalesLedgerController.java
@@ -11,6 +11,7 @@
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.framework.web.page.TableDataInfo;
import com.ruoyi.production.dto.ProductOrderDto;
import com.ruoyi.sales.dto.InvoiceLedgerDto;
import com.ruoyi.sales.dto.SalesLedgerDto;
import com.ruoyi.sales.mapper.InvoiceLedgerMapper;
@@ -183,6 +184,7 @@
     * æ–°å¢žä¿®æ”¹é”€å”®å°è´¦
     */
    @Log(title = "销售台账", businessType = BusinessType.INSERT)
    @ApiOperation(value = "新增修改销售台账", notes = "新增修改销售台账")
    @PostMapping("/addOrUpdateSalesLedger")
    public AjaxResult add(@RequestBody SalesLedgerDto salesLedgerDto) {
        return toAjax(salesLedgerService.addOrUpdateSalesLedger(salesLedgerDto));
@@ -256,6 +258,7 @@
    /**
     * æŸ¥è¯¢é”€å”®å°è´¦åˆ—表
     */
    @ApiOperation(value = "查询销售台账列表", notes = "查询销售台账列表")
    @GetMapping("/listPage")
    public IPage<SalesLedger> listPage(Page page, SalesLedgerDto salesLedgerDto) {
        IPage<SalesLedger> iPage = salesLedgerService.selectSalesLedgerListPage(page, salesLedgerDto);
@@ -265,6 +268,12 @@
            return iPage;
        }
        for (SalesLedger record : iPage.getRecords()) {
            Long salesLedgerId = record.getId();
            List<ProductOrderDto> productionOrdersBySalesLedgerId = salesLedgerService.getProductionOrdersBySalesLedgerId(salesLedgerId);
            record.setProductionOrders(productionOrdersBySalesLedgerId);
        }
        //  èŽ·å–å½“å‰é¡µæ‰€æœ‰å°è´¦è®°å½•çš„ ID é›†åˆ
        List<Long> salesLedgerIds = iPage.getRecords().stream().map(SalesLedger::getId).collect(Collectors.toList());
src/main/java/com/ruoyi/sales/controller/SalesQuotationController.java
@@ -19,6 +19,7 @@
public class SalesQuotationController {
    @Autowired
    private SalesQuotationService salesQuotationService;
    @GetMapping("/list")
    public AjaxResult getList(Page page, SalesQuotationDto salesQuotationDto) {
        return AjaxResult.success(salesQuotationService.listPage(page, salesQuotationDto));
@@ -39,6 +40,7 @@
    public AjaxResult add(@RequestBody SalesQuotationDto salesQuotationDto) {
        return AjaxResult.success(salesQuotationService.add(salesQuotationDto));
    }
    @PostMapping("/update")
    public AjaxResult update(@RequestBody SalesQuotationDto salesQuotationDto) {
        return AjaxResult.success(salesQuotationService.edit(salesQuotationDto));
@@ -46,6 +48,7 @@
    /**
     * è¯¦æƒ…   æ ¹æ®å®¢æˆ·ç±»åž‹å’Œäº§å“è¿”回报价单价
     *
     * @param type   å®¢æˆ·ç±»åž‹
     * @param productName äº§å“åç§°
     * @param specification  è§„æ ¼
@@ -53,11 +56,12 @@
     */
    @ApiOperation("详情")
    @GetMapping("/detail")
    public AjaxResult detail(@RequestParam("type") String type,
    public AjaxResult detail(@RequestParam(value = "type", required = false) String type,
                             @RequestParam("productName")String productName,
                             @RequestParam("specification")String specification) {
        return AjaxResult.success(salesQuotationService.detail(type, productName, specification));
    }
    @DeleteMapping("/delete")
    public AjaxResult delete(@RequestBody Long id) {
        return AjaxResult.success(salesQuotationService.delete(id));
src/main/java/com/ruoyi/sales/dto/SalesLedgerDto.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.annotation.TableField;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.production.dto.ProductOrderDto;
import com.ruoyi.sales.pojo.CommonFile;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import io.swagger.annotations.ApiModelProperty;
@@ -62,4 +63,10 @@
    @ApiModelProperty(value = "审批人ids")
    private String approveUserIds;
    @ApiModelProperty(value = "生产订单ids")
    private List<Long> productionOrderIds;
    @ApiModelProperty(value = "已绑定审批订单列表")
    private List<ProductOrderDto> productionOrders;
}
src/main/java/com/ruoyi/sales/mapper/SalesLedgerProductionRefMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.sales.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.sales.pojo.SalesLedgerProductionRef;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface SalesLedgerProductionRefMapper extends BaseMapper<SalesLedgerProductionRef> {
    List<Long> getProductionOrderIdsBySalesLedgerId(@Param("salesLedgerId") Long salesLedgerId);
}
src/main/java/com/ruoyi/sales/pojo/SalesLedger.java
@@ -3,10 +3,12 @@
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date;
import java.util.List;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import com.ruoyi.production.dto.ProductOrderDto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
@@ -166,6 +168,10 @@
    @TableField(exist = false)
    private String approveUserIds;
    @ApiModelProperty(value = "已绑定审批订单列表")
    @TableField(exist = false)
    private List<ProductOrderDto> productionOrders;
}
src/main/java/com/ruoyi/sales/pojo/SalesLedgerProductionRef.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.ruoyi.sales.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
 * é”€å”®å°è´¦ç”Ÿäº§è®¢å•关联表
 */
@TableName(value = "sales_ledger_production_ref")
@Data
public class SalesLedgerProductionRef implements Serializable {
    private static final long serialVersionUID = 1L;
    @ApiModelProperty(name = "主键")
    @TableId(value = "id", type = IdType.ASSIGN_ID)
    private Long id;
    @ApiModelProperty(name = "销售台账ID")
    private Long salesLedgerId;
    @ApiModelProperty(name = "生产订单ID")
    private Long productOrderId;
}
src/main/java/com/ruoyi/sales/service/ISalesLedgerService.java
@@ -6,6 +6,7 @@
import com.ruoyi.aftersalesservice.pojo.AfterSalesService;
import com.ruoyi.common.enums.SaleEnum;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.production.dto.ProductOrderDto;
import com.ruoyi.sales.dto.AfterSalesLedgerDto;
import com.ruoyi.sales.dto.LossProductModelDto;
import com.ruoyi.sales.dto.MonthlyAmountDto;
@@ -57,4 +58,8 @@
    IPage<AfterSalesLedgerDto> listSalesLedger(AfterSalesLedgerDto salesLedgerDto, Page page);
    SalesLedgerDto getSalesByCode(SalesLedgerDto salesLedgerDto);
    List<ProductOrderDto> getProductionOrdersBySalesLedgerId(Long salesLedgerId);
    void getProductionOrders(List<SalesLedger> records);
}
src/main/java/com/ruoyi/sales/service/SalesLedgerProductionRefService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,7 @@
package com.ruoyi.sales.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.sales.pojo.SalesLedgerProductionRef;
public interface SalesLedgerProductionRefService extends IService<SalesLedgerProductionRef> {
}
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductionRefServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.ruoyi.sales.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.sales.mapper.SalesLedgerProductionRefMapper;
import com.ruoyi.sales.pojo.SalesLedgerProductionRef;
import com.ruoyi.sales.service.SalesLedgerProductionRefService;
import org.springframework.stereotype.Service;
@Service
public class SalesLedgerProductionRefServiceImpl extends ServiceImpl<SalesLedgerProductionRefMapper, SalesLedgerProductionRef> implements SalesLedgerProductionRefService {
}
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -31,6 +31,7 @@
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.other.mapper.TempFileMapper;
import com.ruoyi.other.pojo.TempFile;
import com.ruoyi.production.dto.ProductOrderDto;
import com.ruoyi.production.mapper.*;
import com.ruoyi.production.service.ProductionProductMainService;
import com.ruoyi.project.system.domain.SysDept;
@@ -44,6 +45,7 @@
import com.ruoyi.sales.mapper.*;
import com.ruoyi.sales.pojo.*;
import com.ruoyi.sales.service.ISalesLedgerService;
import com.ruoyi.sales.service.SalesLedgerProductionRefService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
@@ -166,6 +168,10 @@
    private SysUserMapper sysUserMapper;
    @Autowired
    private CustomerPrivatePoolMapper customerPrivatePoolMapper;
    @Autowired
    private SalesLedgerProductionRefService salesLedgerProductionRefService;
    @Autowired
    private SalesLedgerProductionRefMapper salesLedgerProductionRefMapper;
    @Override
    public List<SalesLedger> selectSalesLedgerList(SalesLedgerDto salesLedgerDto) {
@@ -212,7 +218,8 @@
        if (salesLedger == null) {
            throw new BaseException("台账不存在");
        }
        List<ProductOrderDto> productionOrdersBySalesLedgerId = getProductionOrdersBySalesLedgerId(salesLedger.getId());
        salesLedger.setProductionOrders(productionOrdersBySalesLedgerId);
        // 2. æŸ¥è¯¢å­è¡¨
        LambdaQueryWrapper<SalesLedgerProduct> productWrapper = new LambdaQueryWrapper<>();
        productWrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedger.getId());
@@ -551,6 +558,24 @@
        return resultDto;
    }
    @Override
    public List<ProductOrderDto> getProductionOrdersBySalesLedgerId(Long salesLedgerId) {
        List<Long> productOrderIds = salesLedgerProductionRefMapper.getProductionOrderIdsBySalesLedgerId(salesLedgerId);
        if (productOrderIds == null || productOrderIds.isEmpty()) {
            return Collections.emptyList();
        }
        return productOrderMapper.listByProductOrderId(productOrderIds);
    }
    @Override
    public void getProductionOrders(List<SalesLedger> records) {
        List<Long> ledgerIdList = records.stream()
                .map(SalesLedger::getId)
                .collect(Collectors.toList());
    }
    /**
     * ä¸‹åˆ’线命名转驼峰命名
     */
@@ -691,7 +716,10 @@
                );
            }
            // 5. è¿ç§»ä¸´æ—¶æ–‡ä»¶åˆ°æ­£å¼ç›®å½•
            //5. ç»‘定销售订单和生产订单
            bindSalesOrderAndProductionOrder(salesLedgerDto.getProductionOrderIds(), salesLedger.getId());
            // 6. è¿ç§»ä¸´æ—¶æ–‡ä»¶åˆ°æ­£å¼ç›®å½•
            if (salesLedgerDto.getTempFileIds() != null && !salesLedgerDto.getTempFileIds().isEmpty()) {
                migrateTempFilesToFormal(salesLedger.getId(), salesLedgerDto.getTempFileIds());
            }
@@ -701,6 +729,26 @@
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
    private void bindSalesOrderAndProductionOrder(List<Long> productionOrderIds, Long salesLedgerId) {
        // å…ˆåˆ é™¤è¯¥é”€å”®å°è´¦æ‰€æœ‰æ—§å…³è”
        LambdaQueryWrapper<SalesLedgerProductionRef> deleteWrapper = Wrappers.lambdaQuery();
        deleteWrapper.eq(SalesLedgerProductionRef::getSalesLedgerId, salesLedgerId);
        salesLedgerProductionRefMapper.delete(deleteWrapper);
        if (productionOrderIds == null || productionOrderIds.isEmpty()) {
            return;
        }
        List<SalesLedgerProductionRef> refList = productionOrderIds.stream()
                .map(productOrderId -> {
                    SalesLedgerProductionRef ref = new SalesLedgerProductionRef();
                    ref.setSalesLedgerId(salesLedgerId);
                    ref.setProductOrderId(productOrderId);
                    return ref;
                })
                .collect(Collectors.toList());
        salesLedgerProductionRefService.saveBatch(refList);
    }
    public void addApproveByPurchase(LoginUser loginUser, SalesLedger salesLedger) throws Exception {
@@ -817,7 +865,7 @@
                salesLedgerProduct.setPendingInvoiceTotal(salesLedgerProduct.getTaxInclusiveTotalPrice());
                salesLedgerProductMapper.insert(salesLedgerProduct);
                // æ·»åŠ ç”Ÿäº§æ•°æ®
                salesLedgerProductServiceImpl.addProductionData(salesLedgerProduct);
                //salesLedgerProductServiceImpl.addProductionData(salesLedgerProduct);
            }
        }
    }
src/main/resources/mapper/production/ProductOrderMapper.xml
@@ -13,40 +13,96 @@
        <result property="createTime" column="create_time"/>
        <result property="updateTime" column="update_time"/>
    </resultMap>
<!--    æ—§sql-->
    <!--    <select id="pageProductOrder" resultType="com.ruoyi.production.dto.ProductOrderDto">-->
    <!--        select po.*,-->
    <!--        sl.sales_contract_no,-->
    <!--        sl.customer_name,-->
    <!--        p.product_name as product_category,-->
    <!--        pm.model as specification_model,-->
    <!--        pm.unit,-->
    <!--        ppr.process_route_code,-->
    <!--        pb.bom_no,-->
    <!--        ROUND(po.complete_quantity / po.quantity * 100, 2) AS completionStatus,-->
    <!--        DATEDIFF(sl.delivery_date, CURDATE()) AS delivery_days_diff,-->
    <!--        sl.delivery_date,-->
    <!--        CASE-->
    <!--        WHEN shipping_status_counts.total_count = 0 THEN false-->
    <!--        WHEN shipping_status_counts.unshipped_count = 0 THEN true-->
    <!--        ELSE false-->
    <!--        END AS is_fh-->
    <!--        from product_order po-->
    <!--        left join sales_ledger sl on po.sales_ledger_id = sl.id-->
    <!--        LEFT JOIN (-->
    <!--        SELECT sales_ledger_id,-->
    <!--        COUNT(*) as total_count,-->
    <!--        SUM(CASE WHEN status != '已发货' THEN 1 ELSE 0 END) as unshipped_count-->
    <!--        FROM shipping_info-->
    <!--        GROUP BY sales_ledger_id-->
    <!--        ) shipping_status_counts ON sl.id = shipping_status_counts.sales_ledger_id-->
    <!--            left join product_model pm on po.product_model_id = pm.id-->
    <!--            left join product p on pm.product_id = p.id-->
    <!--        left join sales_ledger_product slp on po.sale_ledger_product_id = slp.id and slp.type = 1-->
    <!--        left join (-->
    <!--        select max(id) as id, product_order_id-->
    <!--        from product_process_route-->
    <!--        group by product_order_id-->
    <!--        ) ppr_latest on po.id = ppr_latest.product_order_id-->
    <!--        left join product_process_route ppr on ppr.id = ppr_latest.id-->
    <!--        left join product_bom pb on pb.id = ppr.bom_id-->
    <!--        <where>-->
    <!--            <if test="c.npsNo != null and c.npsNo != ''">-->
    <!--                and po.nps_no like concat('%',#{c.npsNo},'%')-->
    <!--            </if>-->
    <!--            <if test="c.salesContractNo != null and c.salesContractNo != ''">-->
    <!--                and sl.sales_contract_no like concat('%',#{c.salesContractNo},'%')-->
    <!--            </if>-->
    <!--            <if test="c.customerName != null and c.customerName != ''">-->
    <!--                and sl.customer_name like concat('%',#{c.customerName},'%')-->
    <!--            </if>-->
    <!--            <if test="c.productCategory != null and c.productCategory != ''">-->
    <!--                and slp.product_category like concat('%',#{c.productCategory},'%')-->
    <!--            </if>-->
    <!--            <if test="c.specificationModel != null and c.specificationModel != ''">-->
    <!--                and slp.specification_model like concat('%',#{c.specificationModel},'%')-->
    <!--            </if>-->
    <!--            <if test="c.startTime != null and c.endTime != null">-->
    <!--                and po.create_time between #{c.startTime} and #{c.endTime}-->
    <!--            </if>-->
    <!--        </where>-->
    <!--    </select>-->
<!--    æ–°sql ç”¨ä¸­é—´è¡¨sales_ledger_production_ref进行关联sales_ledger和product_order,查询出所有关联的sales_ledger_no和customer_name。交期,交期偏差,是否发货由于一个生产订单对应多个销售订单,导致无法正常显示,暂时省略-->
    <select id="pageProductOrder" resultType="com.ruoyi.production.dto.ProductOrderDto">
        select po.*,
        sl.sales_contract_no,
        sl.customer_name,
        GROUP_CONCAT(DISTINCT sl.sales_contract_no SEPARATOR ',') AS sales_contract_no,
        GROUP_CONCAT(DISTINCT sl.customer_name SEPARATOR ',') AS customer_name,
        p.product_name as product_category,
        pm.model as specification_model,
        pm.unit,
        ppr.process_route_code,
        pb.bom_no,
        ROUND(po.complete_quantity / po.quantity * 100, 2) AS completionStatus,
        DATEDIFF(sl.delivery_date, CURDATE()) AS delivery_days_diff,
        sl.delivery_date,
        CASE
        WHEN shipping_status_counts.total_count = 0 THEN false
        WHEN shipping_status_counts.unshipped_count = 0 THEN true
        ELSE false
        END AS is_fh
        ROUND(po.complete_quantity / po.quantity * 100, 2) AS completionStatus
        from product_order po
        left join sales_ledger sl on po.sales_ledger_id = sl.id
        left join sales_ledger_production_ref ref on po.id = ref.product_order_id
        left join sales_ledger sl on ref.sales_ledger_id = sl.id
        LEFT JOIN (
        SELECT sales_ledger_id,
        COUNT(*) as total_count,
        SUM(CASE WHEN status != '已发货' THEN 1 ELSE 0 END) as unshipped_count
        FROM shipping_info
        GROUP BY sales_ledger_id
        ) shipping_status_counts ON sl.id = shipping_status_counts.sales_ledger_id
        GROUP BY sales_ledger_id) shipping_status_counts
        ON sl.id = shipping_status_counts.sales_ledger_id
            left join product_model pm on po.product_model_id = pm.id
            left join product p on pm.product_id = p.id
        left join sales_ledger_product slp on po.sale_ledger_product_id = slp.id and slp.type = 1
        left join (
        select max(id) as id, product_order_id
        from product_process_route
        group by product_order_id
        ) ppr_latest on po.id = ppr_latest.product_order_id
        group by product_order_id) ppr_latest on po.id = ppr_latest.product_order_id
        left join product_process_route ppr on ppr.id = ppr_latest.id
        left join product_bom pb on pb.id = ppr.bom_id
        <where>
@@ -69,7 +125,10 @@
                and po.create_time between #{c.startTime} and #{c.endTime}
            </if>
        </where>
        GROUP BY po.id
    </select>
    <select id="listProcessRoute" resultType="com.ruoyi.production.pojo.ProcessRoute">
        select pr.*
        from process_route pr
@@ -87,8 +146,7 @@
               pp.name as  process_name,
               pm.product_id,
               pm.model
        from
            product_structure ps
        from product_structure ps
                left join product_model pm on ps.product_model_id = pm.id
                left join product p on pm.product_id = p.id
                left join product_process pp on ps.process_id = pp.id
@@ -100,19 +158,109 @@
    <select id="countCreated" resultType="java.lang.Integer">
        SELECT count(1) FROM product_order
        WHERE create_time &gt;= #{startDate} AND create_time &lt;= #{endDate}
        SELECT count(1)
        FROM product_order
        WHERE create_time &gt;= #{startDate}
          AND create_time &lt;= #{endDate}
    </select>
    <select id="countCompleted" resultType="java.lang.Integer">
        SELECT count(1) FROM product_order
        WHERE end_time &gt;= #{startDate} AND end_time &lt;= #{endDate}
        SELECT count(1)
        FROM product_order
        WHERE end_time &gt;= #{startDate}
          AND end_time &lt;= #{endDate}
          AND complete_quantity &gt;= quantity
    </select>
    <select id="countPending" resultType="java.lang.Integer">
        SELECT count(1) FROM product_order
        WHERE create_time &gt;= #{startDate} AND create_time &lt;= #{endDate}
        SELECT count(1)
        FROM product_order
        WHERE create_time &gt;= #{startDate}
          AND create_time &lt;= #{endDate}
          AND complete_quantity &lt; quantity
    </select>
    <select id="listByProductModelId" resultType="com.ruoyi.production.dto.ProductOrderDto">
        select po.*,
        sl.sales_contract_no,
        sl.customer_name,
        p.product_name as product_category,
        pm.model as specification_model,
        pm.unit,
        ppr.process_route_code,
        pb.bom_no,
        ROUND(po.complete_quantity / po.quantity * 100, 2) AS completionStatus,
        DATEDIFF(sl.delivery_date, CURDATE()) AS delivery_days_diff,
        sl.delivery_date,
        CASE
        WHEN shipping_status_counts.total_count = 0 THEN false
        WHEN shipping_status_counts.unshipped_count = 0 THEN true
        ELSE false
        END AS is_fh
        from product_order po
        left join sales_ledger sl on po.sales_ledger_id = sl.id
        LEFT JOIN (SELECT sales_ledger_id,
        COUNT(*) as total_count,
        SUM(CASE WHEN status != '已发货' THEN 1 ELSE 0 END) as unshipped_count
        FROM shipping_info
        GROUP BY sales_ledger_id) shipping_status_counts
        ON sl.id = shipping_status_counts.sales_ledger_id
        left join product_model pm on po.product_model_id = pm.id
        left join product p on pm.product_id = p.id
        left join sales_ledger_product slp on po.sale_ledger_product_id = slp.id and slp.type = 1
        left join (select max(id) as id, product_order_id
        from product_process_route
        group by product_order_id) ppr_latest on po.id = ppr_latest.product_order_id
        left join product_process_route ppr on ppr.id = ppr_latest.id
        left join product_bom pb on pb.id = ppr.bom_id
        <where>
            <if test="productModelIds != null and productModelIds.size() > 0">
                po.product_model_id IN
                <foreach collection="productModelIds" open="(" separator="," close=")" item="item">
                    #{item}
                </foreach>
            </if>
        </where>
    </select>
    <select id="listByProductOrderId" resultType="com.ruoyi.production.dto.ProductOrderDto">
        select po.*,
        sl.sales_contract_no,
        sl.customer_name,
        p.product_name as product_category,
        pm.model as specification_model,
        pm.unit,
        ppr.process_route_code,
        pb.bom_no,
        ROUND(po.complete_quantity / po.quantity * 100, 2) AS completionStatus,
        DATEDIFF(sl.delivery_date, CURDATE()) AS delivery_days_diff,
        sl.delivery_date,
        CASE
        WHEN shipping_status_counts.total_count = 0 THEN false
        WHEN shipping_status_counts.unshipped_count = 0 THEN true
        ELSE false
        END AS is_fh
        from product_order po
        left join sales_ledger sl on po.sales_ledger_id = sl.id
        LEFT JOIN (SELECT sales_ledger_id,
        COUNT(*) as total_count,
        SUM(CASE WHEN status != '已发货' THEN 1 ELSE 0 END) as unshipped_count
        FROM shipping_info
        GROUP BY sales_ledger_id) shipping_status_counts
        ON sl.id = shipping_status_counts.sales_ledger_id
        left join product_model pm on po.product_model_id = pm.id
        left join product p on pm.product_id = p.id
        left join sales_ledger_product slp on po.sale_ledger_product_id = slp.id and slp.type = 1
        left join (select max(id) as id, product_order_id
        from product_process_route
        group by product_order_id) ppr_latest on po.id = ppr_latest.product_order_id
        left join product_process_route ppr on ppr.id = ppr_latest.id
        left join product_bom pb on pb.id = ppr.bom_id
        <where>
            <if test="productOrderIds != null and productOrderIds.size() > 0">
                po.id IN
                <foreach collection="productOrderIds" open="(" separator="," close=")" item="item">
                    #{item}
                </foreach>
            </if>
        </where>
    </select>
</mapper>
src/main/resources/mapper/production/ProductionProductMainMapper.xml
@@ -12,6 +12,47 @@
        <result property="status" column="status"/>
    </resultMap>
<!--    <select id="listPageProductionProductMainDto" resultType="com.ruoyi.production.dto.ProductionProductMainDto">-->
<!--        select ppm.*,-->
<!--        pwo.work_order_no as workOrderNo,-->
<!--        pwo.status as workOrderStatus,-->
<!--        u.nick_name as nickName,-->
<!--        p.product_name as productName,-->
<!--        pp.name as process,-->
<!--        pm.model as productModelName,-->
<!--        ppo.quantity,-->
<!--        ppo.scrap_qty,-->
<!--        pm.unit,-->
<!--        sl.sales_contract_no salesContractNo-->
<!--        from-->
<!--        production_product_main ppm-->
<!--        left join product_work_order pwo on pwo.id = ppm.work_order_id-->
<!--        left join product_process_route_item ppri on ppri.id = pwo.product_process_route_item_id-->
<!--        left join product_process pp on pp.id = ppri.process_id-->
<!--        left join product_order po on po.id = pwo.product_order_id-->
<!--        left join production_product_output ppo on ppm.id = ppo.product_main_id-->
<!--        left join product_model pm on pm.id = ppo.product_model_id-->
<!--        left join product p on p.id = pm.product_id-->
<!--        left join sales_ledger sl on sl.id = po.sales_ledger_id-->
<!--        left join sys_user u on u.user_id = ppm.user_id-->
<!--        <where>-->
<!--            <if test="c.nickName != null and c.nickName != ''">-->
<!--                and u.nick_name like concat('%',#{c.nickName},'%')-->
<!--            </if>-->
<!--            <if test="c.workOrderNo != null and c.workOrderNo != ''">-->
<!--                and pwo.work_order_no like concat('%',#{c.workOrderNo},'%')-->
<!--            </if>-->
<!--            <if test="c.workOrderStatus != null and c.workOrderStatus != ''">-->
<!--                and pwo.status = #{c.workOrderStatus}-->
<!--            </if>-->
<!--            <if test="c.status != null and c.status != ''">-->
<!--                and ppm.status = #{c.status}-->
<!--            </if>-->
<!--        </where>-->
<!--        order by ppm.id-->
<!--    </select>-->
    <!--    æ–°sql ç”¨ä¸­é—´è¡¨sales_ledger_production_ref进行关联sales_ledger和product_order,查询出所有关联的sales_ledger_no-->
    <select id="listPageProductionProductMainDto" resultType="com.ruoyi.production.dto.ProductionProductMainDto">
        select ppm.*,
        pwo.work_order_no as workOrderNo,
@@ -23,7 +64,12 @@
        ppo.quantity,
        ppo.scrap_qty,
        pm.unit,
        sl.sales_contract_no salesContractNo
        (
        SELECT GROUP_CONCAT(DISTINCT sl.sales_contract_no SEPARATOR ',')
        FROM sales_ledger sl
        INNER JOIN sales_ledger_production_ref ref ON sl.id = ref.sales_ledger_id
        WHERE ref.product_order_id = po.id
        ) AS salesContractNo
        from
        production_product_main ppm
        left join product_work_order pwo on pwo.id = ppm.work_order_id
@@ -33,7 +79,6 @@
        left join production_product_output ppo on ppm.id = ppo.product_main_id
        left join product_model pm on pm.id = ppo.product_model_id
        left join product p on p.id = pm.product_id
        left join sales_ledger sl on sl.id = po.sales_ledger_id
        left join sys_user u on u.user_id = ppm.user_id
        <where>
            <if test="c.nickName != null and c.nickName != ''">
@@ -50,8 +95,8 @@
            </if>
        </where>
        order by ppm.id
    </select>
    <select id="getOrderByMainId" resultType="com.ruoyi.production.pojo.ProductOrder">
        select po.*
        from product_order po
@@ -59,12 +104,61 @@
                 left join production_product_main pm on work_order_id = pwo.id
        where pm.id = #{productMainId}
    </select>
<!--    <select id="listProductionDetails" resultType="com.ruoyi.production.dto.ProductionProductMainDto">-->
<!--        SELECT-->
<!--        slpa.scheduling_date,-->
<!--        slpa.scheduling_user_name,-->
<!--        sl.sales_contract_no,-->
<!--        sl.customer_name,-->
<!--        p.product_name,-->
<!--        pm.model as product_model_name,-->
<!--        pm.unit,-->
<!--        slpa.process,-->
<!--        slpa.finished_num as quantity,-->
<!--        slpa.work_hours,-->
<!--        slpa.work_hours * slpa.finished_num AS wages-->
<!--        FROM-->
<!--        production_product_main ppm-->
<!--        LEFT JOIN sales_ledger_production_accounting slpa ON slpa.product_main_id = ppm.id-->
<!--        LEFT JOIN production_product_output ppo ON ppm.id = ppo.product_main_id-->
<!--        LEFT JOIN product_work_order pwo ON pwo.id = ppm.work_order_id-->
<!--        LEFT JOIN product_order po ON po.id = pwo.product_order_id-->
<!--        LEFT JOIN process_route pr ON pr.id = po.route_id-->
<!--        LEFT JOIN product_model pm ON po.product_model_id = pm.id-->
<!--        LEFT JOIN product p ON p.id = pm.product_id-->
<!--        LEFT JOIN sales_ledger sl ON po.sales_ledger_id = sl.id-->
<!--        <where>-->
<!--            <if test="ew.schedulingUserName != null and ew.schedulingUserName !=''">-->
<!--                and slpa.scheduling_user_name = #{ew.schedulingUserName}-->
<!--            </if>-->
<!--            <if test="ew.entryDate != null " >-->
<!--                and slpa.scheduling_date >= #{ew.entryDate}-->
<!--                and slpa.scheduling_date &lt; DATE_ADD(#{ew.entryDate}, INTERVAL 1 DAY)-->
<!--            </if>-->
<!--            <if test="ew.entryDateStart != null and ew.entryDateEnd != null" >-->
<!--                and slpa.scheduling_date >= #{ew.entryDateStart}-->
<!--                and slpa.scheduling_date &lt; date_add(#{ew.entryDateEnd}, INTERVAL 1 DAY)-->
<!--            </if>-->
<!--        </where>-->
<!--                order by ppm.id desc-->
<!--    </select>-->
    <!--    æ–°sql ç”¨ä¸­é—´è¡¨sales_ledger_production_ref进行关联sales_ledger和product_order,查询出所有关联的sales_ledger_no和customer_name-->
    <select id="listProductionDetails" resultType="com.ruoyi.production.dto.ProductionProductMainDto">
        SELECT
        slpa.scheduling_date,
        slpa.scheduling_user_name,
        sl.sales_contract_no,
        sl.customer_name,
        (SELECT GROUP_CONCAT(DISTINCT sl_inner.sales_contract_no SEPARATOR ',')
        FROM sales_ledger sl_inner
        INNER JOIN sales_ledger_production_ref ref ON sl_inner.id = ref.sales_ledger_id
        WHERE ref.product_order_id = po.id) AS sales_contract_no,
        (SELECT GROUP_CONCAT(DISTINCT sl_inner.customer_name SEPARATOR ',')
        FROM sales_ledger sl_inner
        INNER JOIN sales_ledger_production_ref ref ON sl_inner.id = ref.sales_ledger_id
        WHERE ref.product_order_id = po.id) AS customer_name,
        p.product_name,
        pm.model as product_model_name,
        pm.unit,
@@ -81,7 +175,7 @@
        LEFT JOIN process_route pr ON pr.id = po.route_id
        LEFT JOIN product_model pm ON po.product_model_id = pm.id
        LEFT JOIN product p ON p.id = pm.product_id
        LEFT JOIN sales_ledger sl ON po.sales_ledger_id = sl.id
        <where>
            <if test="ew.schedulingUserName != null and ew.schedulingUserName !=''">
                and slpa.scheduling_user_name = #{ew.schedulingUserName}
@@ -97,6 +191,7 @@
        </where>
                order by ppm.id desc
    </select>
    <select id="listMain" resultType="java.lang.Long">
        SELECT ppm.id FROM production_product_main ppm
            left join product_work_order pwo on pwo.id = ppm.work_order_id
src/main/resources/mapper/quality/QualityInspectMapper.xml
@@ -1,6 +1,54 @@
<?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.quality.mapper.QualityInspectMapper">
<!--    <select id="qualityInspectListPage" resultType="com.ruoyi.quality.dto.QualityInspectDto">-->
<!--        SELECT-->
<!--        qi.*,-->
<!--        <choose>-->
<!--            <when test="qualityInspect.inspectType == 0">-->
<!--                pl.purchase_contract_number as purchase_contract_no-->
<!--            </when>-->
<!--            <otherwise>-->
<!--                pwo.work_order_no,-->
<!--                sl.sales_contract_no-->
<!--            </otherwise>-->
<!--        </choose>-->
<!--        FROM-->
<!--        quality_inspect qi-->
<!--        <choose>-->
<!--            <when test="qualityInspect.inspectType == 0 ">-->
<!--                LEFT JOIN purchase_ledger pl ON pl.id = qi.purchase_ledger_id-->
<!--            </when>-->
<!--            <otherwise>-->
<!--                LEFT JOIN production_product_main ppm ON qi.product_main_id = ppm.id-->
<!--                LEFT JOIN product_work_order pwo ON ppm.work_order_id = pwo.id-->
<!--                left join product_order po ON po.id = pwo.product_order_id-->
<!--                left join sales_ledger sl ON sl.id = po.sales_ledger_id-->
<!--            </otherwise>-->
<!--        </choose>-->
<!--        WHERE-->
<!--        inspect_type=#{qualityInspect.inspectType}-->
<!--        <if test="qualityInspect.supplier != null and qualityInspect.supplier != '' ">-->
<!--            AND qi.supplier like concat('%',#{qualityInspect.supplier},'%')-->
<!--        </if>-->
<!--        <if test="qualityInspect.customer != null and qualityInspect.customer != '' ">-->
<!--            AND qi.customer like concat('%',#{qualityInspect.customer},'%')-->
<!--        </if>-->
<!--        <if test="qualityInspect.process != null and qualityInspect.process != '' ">-->
<!--            AND qi.process like concat('%',#{qualityInspect.process},'%')-->
<!--        </if>-->
<!--        <if test="qualityInspect.productName != null and qualityInspect.productName != '' ">-->
<!--            AND qi.product_name like concat('%',#{qualityInspect.productName},'%')-->
<!--        </if>-->
<!--        <if test="qualityInspect.entryDateStart != null and qualityInspect.entryDateStart != '' ">-->
<!--            AND qi.check_time &gt;= DATE_FORMAT(#{qualityInspect.entryDateStart},'%Y-%m-%d')-->
<!--        </if>-->
<!--        <if test="qualityInspect.entryDateEnd != null and qualityInspect.entryDateEnd != '' ">-->
<!--            AND qi.check_time &lt;= DATE_FORMAT(#{qualityInspect.entryDateEnd},'%Y-%m-%d')-->
<!--        </if>-->
<!--        ORDER BY qi.check_time DESC-->
<!--    </select>-->
    <!--    æ–°sql ç”¨ä¸­é—´è¡¨sales_ledger_production_ref进行关联sales_ledger和product_order,查询出所有关联的sales_ledger_no-->
    <select id="qualityInspectListPage" resultType="com.ruoyi.quality.dto.QualityInspectDto">
        SELECT
        qi.*,
@@ -10,7 +58,10 @@
            </when>
            <otherwise>
                pwo.work_order_no,
                sl.sales_contract_no
                (SELECT GROUP_CONCAT(DISTINCT sl_inner.sales_contract_no SEPARATOR ',')
                FROM sales_ledger sl_inner
                INNER JOIN sales_ledger_production_ref ref ON sl_inner.id = ref.sales_ledger_id
                WHERE ref.product_order_id = po.id) AS sales_contract_no
            </otherwise>
        </choose>
        FROM
@@ -23,7 +74,6 @@
                LEFT JOIN production_product_main ppm ON qi.product_main_id = ppm.id
                LEFT JOIN product_work_order pwo ON ppm.work_order_id = pwo.id
                left join product_order po ON po.id = pwo.product_order_id
                left join sales_ledger sl ON sl.id = po.sales_ledger_id
            </otherwise>
        </choose>
        WHERE
src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml
@@ -16,14 +16,16 @@
        qu.deal_result,
        qu.deal_name,
        qu.deal_time,
        CASE
        WHEN qu.model = pm.id THEN pm.model
        WHEN qu.model REGEXP '^[0-9]+$' AND qu.model = pm.id THEN pm.model
        ELSE qu.model
        END AS model,
        CASE
        WHEN qu.model = pm.id THEN true
        WHEN qu.model REGEXP '^[0-9]+$' AND qu.model = pm.id THEN true
        ELSE false
        END AS method
        FROM quality_unqualified qu
        LEFT JOIN product_model pm ON qu.model = pm.id
        where
src/main/resources/mapper/sales/SalesLedgerProductionRefMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
<?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.sales.mapper.SalesLedgerProductionRefMapper">
    <select id="getProductionOrderIdsBySalesLedgerId" resultType="java.lang.Long">
        SELECT product_order_id
        FROM sales_ledger_production_ref
        WHERE sales_ledger_id = #{salesLedgerId}
    </select>
</mapper>