feat(production): 添加生产订单和工艺路线相关功能。添加工序的工资定额字段
已添加14个文件
已修改5个文件
582 ■■■■■ 文件已修改
doc/create_table_process_route_item.sql 60 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductOrderController.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductProcessRouteItemController.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductOrderDto.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductProcessRouteItemDto.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductOrderMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/mapper/ProductProcessRouteItemMapper.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductOrder.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductProcess.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/pojo/ProductProcessRouteItem.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductOrderService.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/ProductProcessRouteItemService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java 79 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/quality/pojo/QualityInspect.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductOrderMapper.xml 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductProcessRouteItemMapper.xml 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
doc/create_table_process_route_item.sql
@@ -2,11 +2,57 @@
drop table if exists process_route_item;
create table process_route_item
(
    id          bigint auto_increment primary key,
    route_id    bigint   not null default 0 comment '工艺路线id',
    product_model_id  bigint   not null default 0 comment '产品id',
    process_id bigint   not null default 0 comment '工序id',
    tenant_id   bigint   not null comment '租户id',
    create_time datetime null comment '录入时间',
    update_time datetime null comment '更新时间'
    id               bigint auto_increment primary key,
    route_id         bigint   not null default 0 comment '工艺路线id',
    product_model_id bigint   not null default 0 comment '产品id',
    process_id       bigint   not null default 0 comment '工序id',
    tenant_id        bigint   not null comment '租户id',
    create_time      datetime null comment '录入时间',
    update_time      datetime null comment '更新时间'
);
# ç”Ÿäº§å·¥è‰ºè·¯çº¿é¡¹ç›®
drop table if exists product_process_route_item;
create table product_process_route_item
(
    id               bigint auto_increment primary key,
    route_id         bigint   not null default 0 comment '工艺路线id',
    product_model_id bigint   not null default 0 comment '销售台账产品id',
    process_id       bigint   not null default 0 comment '工序id',
    tenant_id        bigint   not null comment '租户id',
    create_time      datetime null comment '录入时间',
    update_time      datetime null comment '更新时间'
);
# ç”Ÿäº§è®¢å•
drop table if exists product_order;
create table product_order
(
    id               bigint auto_increment primary key,
    sales_ledger_id  bigint   not null default 0 comment '销售台账id',
    product_model_id bigint   not null default 0 comment '销售台账产品id',
    route_id         bigint   not null default 0 comment '工艺路线id',
    nps_no          varchar(255) not null default '' comment '生产订单号',
    status            int not null default 0 comment '状态 0 å¾…确认 1 å·²ç¡®è®¤',
    tenant_id        bigint   not null comment '租户id',
    create_time      datetime null comment '录入时间',
    update_time      datetime null comment '更新时间'
);
alter table quality_inspect
    add purchase_ledger_id int null comment '采购订单id';
# ç”Ÿäº§å·¥å•
drop table if exists product_work_order;
create table product_work_order
(
    id               bigint auto_increment primary key,
    product_process_route_item_id bigint   not null default 0 comment '工艺路线项目id',
    create_time      datetime null comment '录入时间',
    update_time      datetime null comment '更新时间',
    work_order_no    varchar(255) not null default '' comment '工单编号',
    status           int not null default 0 comment '状态  1 å¾…确认  2 å¾…生产 3生产中 4已生产 ',
    tenant_id        bigint   not null comment '租户id'
);
alter table product_process
    add salary_quota numeric(16,3) null comment '工资定额';
src/main/java/com/ruoyi/production/controller/ProductOrderController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.ruoyi.production.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.dto.ProductOrderDto;
import com.ruoyi.production.pojo.ProductOrder;
import com.ruoyi.production.service.ProductOrderService;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("productOrder")
@RestController
public class ProductOrderController {
    @Autowired
    private ProductOrderService productOrderService;
    @ApiOperation("分页查询")
    @GetMapping("page")
    public R page(ProductOrderDto productOrder, Page page) {
        return R.ok(productOrderService.pageProductOrder(page, productOrder));
    }
}
src/main/java/com/ruoyi/production/controller/ProductProcessRouteItemController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
package com.ruoyi.production.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.dto.ProcessRouteItemDto;
import com.ruoyi.production.dto.ProductProcessRouteItemDto;
import com.ruoyi.production.pojo.ProcessRouteItem;
import com.ruoyi.production.pojo.ProductProcessRouteItem;
import com.ruoyi.production.service.ProductProcessRouteItemService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RequestMapping("productProcessRoute")
@RestController
@Api(tags = "生产工艺路线")
public class ProductProcessRouteItemController {
    @Autowired
    private ProductProcessRouteItemService productProcessRouteItemService;
    @GetMapping("list")
    @ApiOperation("根据Id查询工艺项目")
    public R list(Long orderId) {
        return R.ok(productProcessRouteItemService.listItem(orderId));
    }
    @PostMapping ()
    @ApiOperation("新增修改")
    public R addOrUpdate(@RequestBody ProductProcessRouteItemDto processRouteItemDto) {
        productProcessRouteItemService.remove(new QueryWrapper<ProductProcessRouteItem>().lambda().eq(ProductProcessRouteItem::getRouteId, processRouteItemDto.getRouteId()));
        return R.ok(productProcessRouteItemService.saveBatch(processRouteItemDto.getProcessRouteItem()));
    }
}
src/main/java/com/ruoyi/production/dto/ProductOrderDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.production.dto;
import com.ruoyi.production.pojo.ProductOrder;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class ProductOrderDto extends ProductOrder {
    @ApiModelProperty(value = "销售合同号")
    private String salesContractNo;
    @ApiModelProperty(value = "项目名")
    private String projectName;
    @ApiModelProperty(value = "客户名")
    private String customerName;
    @ApiModelProperty(value = "产品名称")
    private String productCategory;
    @ApiModelProperty(value = "规格")
    private String specificationModel;
}
src/main/java/com/ruoyi/production/dto/ProductProcessRouteItemDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.production.dto;
import com.ruoyi.production.pojo.ProcessRouteItem;
import com.ruoyi.production.pojo.ProductProcessRouteItem;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
public class ProductProcessRouteItemDto extends ProductProcessRouteItem {
    @ApiModelProperty(value = "工序名称")
    private String processName;
    @ApiModelProperty(value = "产品名称")
    private String productCategory;
    @ApiModelProperty(value = "单位")
    private String unit;
    private Long productId;
    private List<ProductProcessRouteItem> processRouteItem;
    private String specificationModel;
}
src/main/java/com/ruoyi/production/mapper/ProductOrderMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.production.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.production.dto.ProductOrderDto;
import com.ruoyi.production.pojo.ProductOrder;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface ProductOrderMapper extends BaseMapper<ProductOrder> {
    IPage<ProductOrderDto> pageProductOrder(Page page, @Param("c") ProductOrderDto productOrder);
}
src/main/java/com/ruoyi/production/mapper/ProductProcessRouteItemMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.production.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.production.dto.ProductProcessRouteItemDto;
import com.ruoyi.production.pojo.ProductProcessRouteItem;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface ProductProcessRouteItemMapper extends BaseMapper<ProductProcessRouteItem> {
    List<ProductProcessRouteItemDto> listItem(@Param("orderId") Long orderId);
}
src/main/java/com/ruoyi/production/pojo/ProductOrder.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,61 @@
package com.ruoyi.production.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
@Data
@TableName("product_order")
public class ProductOrder  implements Serializable {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * é”€å”®å°è´¦id
     */
    @ApiModelProperty(value = "销售台账id")
    private Long salesLedgerId;
    /**
     * é”€å”®å°è´¦äº§å“id
     */
    @ApiModelProperty(value = "销售台账产品id")
    private Long productModelId;
    /**
     * å·¥è‰ºè·¯çº¿id
     */
    @ApiModelProperty(value = "工艺路线id")
    private Long routeId;
    /**
     * ç”Ÿäº§è®¢å•号
     */
    @ApiModelProperty(value = "生产订单号")
    private String npsNo;
    /**
     * ç§Ÿæˆ·id
     */
    @ApiModelProperty(value = "租户id")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    //创建时间
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    //修改时间
    @ApiModelProperty(value = "修改时间")
    @TableField(fill = FieldFill.UPDATE)
    private LocalDateTime updateTime;
}
src/main/java/com/ruoyi/production/pojo/ProductProcess.java
@@ -30,6 +30,12 @@
     */
    private String remark;
    /**
     * å·¥èµ„定额
     */
    private BigDecimal salaryQuota;
    /**
     * åˆ›å»ºæ—¶é—´
     */
src/main/java/com/ruoyi/production/pojo/ProductProcessRouteItem.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,35 @@
package com.ruoyi.production.pojo;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@TableName("product_process_route_item")
public class ProductProcessRouteItem {
    @TableId(type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "工艺路线id")
    private Long routeId;
    @ApiModelProperty(value = "工序id")
    private Long processId;
    @ApiModelProperty(value ="产品id")
    private Long productModelId;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
    @TableField(fill = FieldFill.INSERT)
    @ApiModelProperty(value = "创建时间")
    private LocalDateTime createTime;
    @ApiModelProperty(value = "更新时间")
    @TableField(fill = FieldFill.UPDATE)
    private LocalDateTime updateTime;
}
src/main/java/com/ruoyi/production/service/ProductOrderService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,13 @@
package com.ruoyi.production.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.production.dto.ProductOrderDto;
import com.ruoyi.production.pojo.ProductOrder;
public interface ProductOrderService extends IService<ProductOrder> {
    IPage<ProductOrderDto> pageProductOrder(Page page, ProductOrderDto productOrder);
}
src/main/java/com/ruoyi/production/service/ProductProcessRouteItemService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.ruoyi.production.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.production.dto.ProductProcessRouteItemDto;
import com.ruoyi.production.pojo.ProductProcessRouteItem;
import java.util.List;
public interface ProductProcessRouteItemService extends IService<ProductProcessRouteItem> {
    List<ProductProcessRouteItemDto> listItem(Long orderId);
}
src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.production.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.production.dto.ProductOrderDto;
import com.ruoyi.production.mapper.ProductOrderMapper;
import com.ruoyi.production.pojo.ProductOrder;
import com.ruoyi.production.service.ProductOrderService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class ProductOrderServiceImpl extends ServiceImpl<ProductOrderMapper, ProductOrder> implements ProductOrderService {
    @Autowired
    private ProductOrderMapper productOrderMapper;
    @Override
    public IPage<ProductOrderDto> pageProductOrder(Page page, ProductOrderDto productOrder) {
        return productOrderMapper.pageProductOrder(page, productOrder);
    }
}
src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.production.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.production.dto.ProductProcessRouteItemDto;
import com.ruoyi.production.mapper.ProductProcessRouteItemMapper;
import com.ruoyi.production.pojo.ProductProcessRouteItem;
import com.ruoyi.production.service.ProductProcessRouteItemService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collections;
import java.util.List;
@Service
public class ProductProcessRouteItemServiceImpl extends ServiceImpl<ProductProcessRouteItemMapper, ProductProcessRouteItem> implements ProductProcessRouteItemService {
    @Autowired
    private ProductProcessRouteItemMapper productProcessRouteItemMapper;
    @Override
    public List<ProductProcessRouteItemDto> listItem(Long orderId) {
        return productProcessRouteItemMapper.listItem(orderId);
    }
}
src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -36,6 +36,12 @@
import com.ruoyi.purchase.pojo.PurchaseLedger;
import com.ruoyi.purchase.pojo.TicketRegistration;
import com.ruoyi.purchase.service.IPurchaseLedgerService;
import com.ruoyi.quality.mapper.QualityInspectMapper;
import com.ruoyi.quality.mapper.QualityInspectParamMapper;
import com.ruoyi.quality.mapper.QualityTestStandardMapper;
import com.ruoyi.quality.pojo.QualityInspect;
import com.ruoyi.quality.pojo.QualityInspectParam;
import com.ruoyi.quality.pojo.QualityTestStandard;
import com.ruoyi.sales.mapper.*;
import com.ruoyi.sales.pojo.CommonFile;
import com.ruoyi.sales.pojo.InvoiceRegistrationProduct;
@@ -101,6 +107,9 @@
    private final InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
    private final StringRedisTemplate redisTemplate;
    private final QualityInspectMapper qualityInspectMapper;
    private final QualityTestStandardMapper qualityTestStandardMapper;
    private final QualityInspectParamMapper qualityInspectParamMapper;
    @Value("${file.upload-dir}")
    private String uploadDir;
@@ -128,7 +137,7 @@
        PurchaseLedger purchaseLedger = new PurchaseLedger();
        BeanUtils.copyProperties(purchaseLedgerDto, purchaseLedger);
        LoginUser loginUser = SecurityUtils.getLoginUser();
        if(ObjectUtils.isNotEmpty(loginUser) && null != loginUser.getTenantId()) {
        if (ObjectUtils.isNotEmpty(loginUser) && null != loginUser.getTenantId()) {
            purchaseLedger.setTenantId(loginUser.getTenantId());
        }
        purchaseLedger.setSalesContractNo(ObjectUtils.isNotEmpty(salesLedger) ? salesLedger.getSalesContractNo() : "");
@@ -161,15 +170,15 @@
            List<AccountExpense> accountExpenseDBs = accountExpenseService.getByInvoiceNumberList(purchaseLedger.getPurchaseContractNumber());
            if (!CollectionUtils.isEmpty(accountExpenseDBs)) {
                accountExpenseDBs.forEach(accountExpenseDB -> {
                   accountExpenseDB.setExpenseDate(purchaseLedgerDB.getEntryDate());
                   accountExpenseDB.setExpenseType("0");
                   accountExpenseDB.setSupplierName(purchaseLedgerDB.getSupplierName());
                   accountExpenseDB.setExpenseMoney(purchaseLedgerDB.getContractAmount());
                   accountExpenseDB.setExpenseDescribed("采购合同:" + purchaseLedgerDB.getPurchaseContractNumber());
                   accountExpenseDB.setExpenseMethod("0");
                   accountExpenseDB.setInvoiceNumber(purchaseLedgerDB.getPurchaseContractNumber());
                   accountExpenseService.updateById(accountExpenseDB);
               });
                    accountExpenseDB.setExpenseDate(purchaseLedgerDB.getEntryDate());
                    accountExpenseDB.setExpenseType("0");
                    accountExpenseDB.setSupplierName(purchaseLedgerDB.getSupplierName());
                    accountExpenseDB.setExpenseMoney(purchaseLedgerDB.getContractAmount());
                    accountExpenseDB.setExpenseDescribed("采购合同:" + purchaseLedgerDB.getPurchaseContractNumber());
                    accountExpenseDB.setExpenseMethod("0");
                    accountExpenseDB.setInvoiceNumber(purchaseLedgerDB.getPurchaseContractNumber());
                    accountExpenseService.updateById(accountExpenseDB);
                });
            }
        }
@@ -178,6 +187,31 @@
        List<SalesLedgerProduct> productList = purchaseLedgerDto.getProductData();
        if (productList != null && !productList.isEmpty()) {
            handleSalesLedgerProducts(purchaseLedger.getId(), productList, purchaseLedgerDto.getType());
        }
        //新增原材料检验
        for (SalesLedgerProduct saleProduct : productList) {
            QualityInspect qualityInspect = new QualityInspect();
            qualityInspect.setInspectType(0);
            qualityInspect.setSupplier(purchaseLedger.getSupplierName());
            qualityInspect.setPurchaseLedgerId(purchaseLedger.getId());
            qualityInspect.setProductId(saleProduct.getProductId());
            qualityInspect.setProductName(saleProduct.getProductCategory());
            qualityInspect.setModel(saleProduct.getSpecificationModel());
            qualityInspect.setUnit(saleProduct.getUnit());
            qualityInspect.setQuantity(saleProduct.getQuantity());
            qualityInspectMapper.insert(qualityInspect);
            QualityTestStandard qualityTestStandard = new QualityTestStandard();
            qualityTestStandard.setProductId(saleProduct.getProductId());
            List<QualityTestStandard> qualityTestStandards = qualityTestStandardMapper.qualityTestStandardList(qualityTestStandard);
            for (QualityTestStandard qualityTestStandardDB : qualityTestStandards) {
                QualityInspectParam qualityInspectParam = new QualityInspectParam();
                qualityInspectParam.setInspectId(qualityInspect.getId());
                qualityInspectParam.setParameterItem(qualityTestStandardDB.getParameterItem());
                qualityInspectParam.setUnit(qualityTestStandardDB.getUnit());
                qualityInspectParam.setStandardValue(qualityTestStandardDB.getStandardValue());
                qualityInspectParam.setControlValue(qualityTestStandardDB.getControlValue());
                qualityInspectParamMapper.insert(qualityInspectParam);
            }
        }
        // 5. è¿ç§»ä¸´æ—¶æ–‡ä»¶åˆ°æ­£å¼ç›®å½•
@@ -349,7 +383,7 @@
    @Override
    public int deletePurchaseLedgerByIds(Long[] ids) {
        if (ids == null || ids.length == 0) {
           throw new BaseException("请选中至少一条数据");
            throw new BaseException("请选中至少一条数据");
        }
        // æ‰¹é‡åˆ é™¤å…³è”的采购台账产品
        LambdaQueryWrapper<SalesLedgerProduct> queryWrapper = new LambdaQueryWrapper<>();
@@ -358,16 +392,29 @@
        salesLedgerProductMapper.delete(queryWrapper);
        // æ‰¹é‡åˆ é™¤å…³è”的采购台账的来票登记
        LambdaQueryWrapper<TicketRegistration> ticketRegistrationLambdaQueryWrapper = new LambdaQueryWrapper<>();
        ticketRegistrationLambdaQueryWrapper.in(TicketRegistration::getPurchaseLedgerId,ids);
        ticketRegistrationLambdaQueryWrapper.in(TicketRegistration::getPurchaseLedgerId, ids);
        ticketRegistrationMapper.delete(ticketRegistrationLambdaQueryWrapper);
        // æ‰¹é‡åˆ é™¤å…³è”的采购台账的来票登记记录
        LambdaQueryWrapper<ProductRecord> productRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        productRecordLambdaQueryWrapper.in(ProductRecord::getPurchaseLedgerId,ids);
        productRecordLambdaQueryWrapper.in(ProductRecord::getPurchaseLedgerId, ids);
        productRecordMapper.delete(productRecordLambdaQueryWrapper);
        // æ‰¹é‡åˆ é™¤ä»˜æ¬¾ç™»è®°
        LambdaQueryWrapper<PaymentRegistration> paymentRegistrationLambdaQueryWrapper = new LambdaQueryWrapper<>();
        paymentRegistrationLambdaQueryWrapper.in(PaymentRegistration::getPurchaseLedgerId,ids);
        paymentRegistrationLambdaQueryWrapper.in(PaymentRegistration::getPurchaseLedgerId, ids);
        paymentRegistrationMapper.delete(paymentRegistrationLambdaQueryWrapper);
        //批量删除检验标准
        LambdaQueryWrapper<QualityInspect> materialInspectLambdaQueryWrapper = new LambdaQueryWrapper<>();
        materialInspectLambdaQueryWrapper.in(QualityInspect::getPurchaseLedgerId, ids);
        List<QualityInspect> qualityInspects = qualityInspectMapper.selectList(materialInspectLambdaQueryWrapper);
        List<Long> inspectIds = qualityInspects.stream()
                .map(QualityInspect::getId)
                .collect(Collectors.toList());
        LambdaQueryWrapper<QualityInspectParam> qualityStandardLambdaQueryWrapper = new LambdaQueryWrapper<>();
        qualityStandardLambdaQueryWrapper.in(QualityInspectParam::getInspectId, inspectIds);
        qualityInspectParamMapper.delete(qualityStandardLambdaQueryWrapper);
        //批量删除原材料检验数据
        qualityInspectMapper.delete(materialInspectLambdaQueryWrapper);
        // æ‰¹é‡åˆ é™¤é‡‡è´­å°è´¦
        return purchaseLedgerMapper.deleteBatchIds(Arrays.asList(ids));
    }
@@ -494,8 +541,8 @@
    @Override
    public List<InvoiceRegistrationProduct> getProductBySalesNo(Long id) {
        List<InvoiceRegistrationProduct> invoiceRegistrationProducts = invoiceRegistrationProductMapper.selectList(new LambdaQueryWrapper<InvoiceRegistrationProduct>()
                        .select(InvoiceRegistrationProduct::getId, InvoiceRegistrationProduct::getProductCategory, InvoiceRegistrationProduct::getSpecificationModel,
                                InvoiceRegistrationProduct::getUnit, InvoiceRegistrationProduct::getQuantity)
                .select(InvoiceRegistrationProduct::getId, InvoiceRegistrationProduct::getProductCategory, InvoiceRegistrationProduct::getSpecificationModel,
                        InvoiceRegistrationProduct::getUnit, InvoiceRegistrationProduct::getQuantity)
                .eq(InvoiceRegistrationProduct::getSalesLedgerId, id));
        if (invoiceRegistrationProducts.isEmpty()) {
            return new ArrayList<>();
src/main/java/com/ruoyi/quality/pojo/QualityInspect.java
@@ -138,5 +138,7 @@
     */
    private Integer inspectState;
    private Long purchaseLedgerId;
}
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -4,6 +4,14 @@
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.production.mapper.ProcessRouteItemMapper;
import com.ruoyi.production.mapper.ProcessRouteMapper;
import com.ruoyi.production.mapper.ProductOrderMapper;
import com.ruoyi.production.mapper.ProductProcessRouteItemMapper;
import com.ruoyi.production.pojo.ProcessRoute;
import com.ruoyi.production.pojo.ProcessRouteItem;
import com.ruoyi.production.pojo.ProductOrder;
import com.ruoyi.production.pojo.ProductProcessRouteItem;
import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
import com.ruoyi.purchase.pojo.PurchaseLedger;
import com.ruoyi.sales.dto.InvoiceRegistrationProductDto;
@@ -42,8 +50,14 @@
    private PurchaseLedgerMapper purchaseLedgerMapper;
    private ProductOrderMapper productOrderMapper;
    private ProcessRouteItemMapper processRouteItemMapper;
    private ProductProcessRouteItemMapper productProcessRouteItemMapper;
    @Autowired
    private InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
    @Autowired
    private ProcessRouteMapper processRouteMapper;
    @Override
    public SalesLedgerProduct selectSalesLedgerProductById(Long id) {
@@ -56,18 +70,18 @@
        queryWrapper.eq(SalesLedgerProduct::getSalesLedgerId, salesLedgerProduct.getSalesLedgerId())
                .eq(SalesLedgerProduct::getType, salesLedgerProduct.getType());
        List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(queryWrapper);
        if(!CollectionUtils.isEmpty(salesLedgerProducts)){
        if (!CollectionUtils.isEmpty(salesLedgerProducts)) {
            InvoiceRegistrationProductDto invoiceRegistrationProductDto = new InvoiceRegistrationProductDto();
            invoiceRegistrationProductDto.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId().intValue());
            List<InvoiceRegistrationProductDto> invoiceRegistrationProductDtoList = invoiceRegistrationProductMapper.invoiceRegistrationProductList(invoiceRegistrationProductDto);
            // ç»Ÿè®¡å¼€ç¥¨ç™»è®°äº§å“çš„已开票数/已开票金额
            if(!CollectionUtils.isEmpty(invoiceRegistrationProductDtoList)){
            if (!CollectionUtils.isEmpty(invoiceRegistrationProductDtoList)) {
                for (SalesLedgerProduct ledgerProduct : salesLedgerProducts) {
                    BigDecimal invoiceNum = BigDecimal.ZERO;
                    BigDecimal invoiceAmount = BigDecimal.ZERO;
                    for (InvoiceRegistrationProductDto registrationProductDto : invoiceRegistrationProductDtoList) {
                        if(ledgerProduct.getId().intValue() == registrationProductDto.getSalesLedgerProductId()){
                            invoiceNum =  invoiceNum.add(registrationProductDto.getInvoiceNum());
                        if (ledgerProduct.getId().intValue() == registrationProductDto.getSalesLedgerProductId()) {
                            invoiceNum = invoiceNum.add(registrationProductDto.getInvoiceNum());
                            invoiceAmount = invoiceAmount.add(registrationProductDto.getInvoiceAmount());
                        }
                    }
@@ -101,6 +115,14 @@
        // 2. æ‰§è¡Œåˆ é™¤æ“ä½œ
        int result = salesLedgerProductMapper.deleteBatchIds(Arrays.asList(ids));
        //删除对应的生产订单
        for (Long id : ids) {
            ProductOrder productOrder = productOrderMapper.selectOne(new LambdaQueryWrapper<ProductOrder>().eq(ProductOrder::getProductModelId, id));
            if (productOrder != null) {
                productProcessRouteItemMapper.delete(new LambdaQueryWrapper<ProductProcessRouteItem>().eq(ProductProcessRouteItem::getRouteId, productOrder.getId()));
                productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>().eq(ProductOrder::getProductModelId, id));
            }
        }
        // 3. å¯¹æ¯ä¸ªä¸»è¡¨ID进行金额更新
        for (Long salesLedgerId : mainIds) {
@@ -130,6 +152,27 @@
        Long salesLedgerId = salesLedgerProduct.getSalesLedgerId();
        if (salesLedgerProduct.getId() == null) {
            result = salesLedgerProductMapper.insert(salesLedgerProduct);
            ProductOrder productOrder = new ProductOrder();
            productOrder.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId());
            productOrder.setProductModelId(salesLedgerProduct.getId());
            productOrder.setNpsNo("SC" + String.format("%08d", salesLedgerProduct.getId()));
            productOrderMapper.insert(productOrder);
            ProcessRoute processRoute = processRouteMapper.selectOne(new QueryWrapper<ProcessRoute>().lambda().eq(ProcessRoute::getProductModelId, salesLedgerProduct.getProductModelId()));
            if (processRoute != null) {
                List<ProcessRouteItem> processRouteItems = processRouteItemMapper.selectList(new QueryWrapper<ProcessRouteItem>().lambda().eq(ProcessRouteItem::getRouteId, processRoute.getId()));
                for (ProcessRouteItem processRouteItem : processRouteItems) {
                    ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem();
                    productProcessRouteItem.setProductModelId(productOrder.getProductModelId());
                    productProcessRouteItem.setProcessId(processRouteItem.getProcessId());
                    productProcessRouteItem.setRouteId(productOrder.getId());
                    productProcessRouteItemMapper.insert(productProcessRouteItem);
                }
                productOrder.setRouteId(processRoute.getId());
                productOrderMapper.updateById(productOrder);
            }
        } else {
            salesLedgerProduct.setFutureTickets(salesLedgerProduct.getQuantity());
            result = salesLedgerProductMapper.updateById(salesLedgerProduct);
src/main/resources/mapper/production/ProductOrderMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,45 @@
<?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.ProductOrderMapper">
    <resultMap id="basicMap" type="com.ruoyi.production.pojo.ProductOrder">
        <id property="id" column="id"/>
        <result property="productModelId" column="product_model_id"/>
        <result property="tenantId" column="tenant_id"/>
        <result property="salesLedgerId" column="sales_ledger_id"/>
        <result property="routeId" column="route_id"/>
        <result property="npsNo" column="nps_no"/>
        <result property="createTime" column="create_time"/>
        <result property="updateTime" column="update_time"/>
    </resultMap>
    <select id="pageProductOrder" resultType="com.ruoyi.production.dto.ProductOrderDto">
        select po.*,sl.sales_contract_no,sl.project_name,sl.customer_name,slp.product_category,slp.specification_model
        from product_order po
        left join sales_ledger sl on po.sales_ledger_id = sl.id
        left join sales_ledger_product slp on po.product_model_id = slp.id
        left join process_route pr on po.route_id = pr.id
        <where>
            <if test="c.npsNo != null and c.npsNo != ''">
                and po.nps_no = #{c.npsNo}
            </if>
            <if test="c.salesContractNo != null and c.salesContractNo != ''">
                and sl.sales_contract_no = #{c.salesContractNo}
            </if>
            <if test="c.projectName != null and c.projectName != ''">
                and sl.project_name = #{c.projectName}
            </if>
            <if test="c.customerName != null and c.customerName != ''">
                and sl.customer_name = #{c.customerName}
            </if>
            <if test="c.productCategory != null and c.productCategory != ''">
                and slp.product_category = #{c.productCategory}
            </if>
            <if test="c.specificationModel != null and c.specificationModel != ''">
                and slp.specification_model = #{c.specificationModel}
            </if>
        </where>
    </select>
</mapper>
src/main/resources/mapper/production/ProductProcessRouteItemMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
<?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.ProductProcessRouteItemMapper">
    <resultMap id="basicMap" type="com.ruoyi.production.pojo.ProductProcessRouteItem">
        <id property="id" column="id"/>
        <result property="productModelId" column="product_model_id"/>
        <result property="tenantId" column="tenant_id"/>
        <result property="createTime" column="create_time"/>
        <result property="updateTime" column="update_time"/>
    </resultMap>
    <select id="listItem" resultType="com.ruoyi.production.dto.ProductProcessRouteItemDto">
        select ppri.*,
               pp.name as process_name,
               slp.specification_model,
               slp.unit,
               slp.product_category
        from product_process_route_item ppri
                 left join sales_ledger_product slp on ppri.product_model_id = slp.id
                 left join product_process pp on pp.id = ppri.process_id
        where ppri.route_id = #{orderId}
        order by ppri.id
    </select>
</mapper>