From ec26e9a878b9478b0851fe3a98d8cca564c05cc4 Mon Sep 17 00:00:00 2001
From: liding <756868258@qq.com>
Date: 星期一, 05 一月 2026 18:02:25 +0800
Subject: [PATCH] 产品工单关联对应增删改查
---
src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java | 15 ++
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java | 105 +++++++++++---
src/main/resources/mapper/production/ProductWorkOrderMapper.xml | 40 +++++
src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java | 27 +++
src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java | 60 ++++++-
src/main/java/com/ruoyi/production/controller/ProductWorkOrderController.java | 30 ++++
src/main/java/com/ruoyi/production/service/ProductWorkOrderService.java | 13 +
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java | 83 ++++++++++-
src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java | 29 ++++
9 files changed, 359 insertions(+), 43 deletions(-)
diff --git a/src/main/java/com/ruoyi/production/controller/ProductWorkOrderController.java b/src/main/java/com/ruoyi/production/controller/ProductWorkOrderController.java
new file mode 100644
index 0000000..339ab7d
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/controller/ProductWorkOrderController.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.ProductWorkOrderDto;
+import com.ruoyi.production.service.ProductWorkOrderService;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@RestController
+@AllArgsConstructor
+@RequestMapping("/productWorkOrder")
+public class ProductWorkOrderController {
+
+ private ProductWorkOrderService productWorkOrderservice;
+
+
+ /**
+ * 浜у搧宸ュ崟瀹炰綋绫诲垎椤垫煡璇�
+ */
+ @ApiOperation("浜у搧宸ュ崟瀹炰綋绫诲垎椤垫煡璇�")
+ @GetMapping("/page")
+ public R page(Page<ProductWorkOrderDto> page, ProductWorkOrderDto productWorkOrder) {
+ return R.ok(productWorkOrderservice.listPage(page, productWorkOrder));
+ }
+
+}
diff --git a/src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java b/src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java
new file mode 100644
index 0000000..f43789e
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java
@@ -0,0 +1,29 @@
+package com.ruoyi.production.dto;
+
+import com.ruoyi.production.pojo.ProductWorkOrder;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+public class ProductWorkOrderDto extends ProductWorkOrder {
+
+ //浜у搧鍚嶇О
+ @ApiModelProperty(value = "浜у搧鍚嶇О")
+ private String productName;
+
+ //瑙勬牸
+ @ApiModelProperty(value = "瑙勬牸")
+ private String model;
+
+ //宸ュ簭
+ @ApiModelProperty(value = "宸ュ簭")
+ private String processName;
+
+ //鍗曚綅
+ @ApiModelProperty(value = "鍗曚綅")
+ private String unit;
+
+
+}
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java
new file mode 100644
index 0000000..12a3963
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.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.ProductWorkOrderDto;
+import com.ruoyi.production.pojo.ProductWorkOrder;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+public interface ProductWorkOrderMapper extends BaseMapper<ProductWorkOrder> {
+
+ IPage<ProductWorkOrderDto> pageProductWorkOrder(Page<ProductWorkOrderDto> page, @Param("c") ProductWorkOrderDto productWorkOrder);
+}
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java b/src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java
index bffa732..a217b9b 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java
@@ -7,12 +7,19 @@
import java.io.Serializable;
import java.time.LocalDateTime;
+/**
+ * 浜у搧宸ュ崟瀹炰綋绫�
+ * 瀵瑰簲鏁版嵁搴撹〃锛歱roduct_work_order
+ */
@Data
@TableName("product_work_order")
public class ProductWorkOrder implements Serializable {
private static final long serialVersionUID = 1L;
+ /**
+ * 涓婚敭id
+ */
@TableId(value = "id", type = IdType.AUTO)
private Long id;
@@ -23,16 +30,30 @@
private Long productProcessRouteItemId;
/**
+ * 鍒涘缓鏃堕棿
+ */
+ @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+ @TableField(fill = FieldFill.INSERT)
+ private LocalDateTime createTime;
+
+ /**
+ * 淇敼鏃堕棿
+ */
+ @ApiModelProperty(value = "淇敼鏃堕棿")
+ @TableField(fill = FieldFill.UPDATE)
+ private LocalDateTime updateTime;
+
+ /**
* 宸ュ崟缂栧彿
*/
- @ApiModelProperty(value = "鐢熶骇璁㈠崟鍙�")
+ @ApiModelProperty(value = "宸ュ崟缂栧彿")
private String workOrderNo;
/**
- * 鐢熶骇鐘舵�� 1 寰呯‘璁� 2 寰呯敓浜� 3鐢熶骇涓� 4宸茬敓浜�
+ * 鐘舵�� 1 寰呯‘璁� 2 寰呯敓浜� 3鐢熶骇涓� 4宸茬敓浜�
*/
- @ApiModelProperty(value = "鐢熶骇鐘舵�� 1 寰呯‘璁� 2 寰呯敓浜� 3鐢熶骇涓� 4宸茬敓浜�")
- private String status;
+ @ApiModelProperty(value = "鐘舵�� 1 寰呯‘璁� 2 寰呯敓浜� 3鐢熶骇涓� 4宸茬敓浜�")
+ private Integer status;
/**
* 绉熸埛id
@@ -41,14 +62,27 @@
@TableField(fill = FieldFill.INSERT)
private Long tenantId;
- //鍒涘缓鏃堕棿
- @ApiModelProperty(value = "鍒涘缓鏃堕棿")
- @TableField(fill = FieldFill.INSERT)
- private LocalDateTime createTime;
+ /**
+ * 璁″垝寮�濮嬫椂闂�
+ */
+ @ApiModelProperty(value = "璁″垝寮�濮嬫椂闂�")
+ private LocalDateTime planStartTime;
- //淇敼鏃堕棿
- @ApiModelProperty(value = "淇敼鏃堕棿")
- @TableField(fill = FieldFill.UPDATE)
- private LocalDateTime updateTime;
+ /**
+ * 璁″垝缁撴潫鏃堕棿
+ */
+ @ApiModelProperty(value = "璁″垝缁撴潫鏃堕棿")
+ private LocalDateTime planEndTime;
-}
+ /**
+ * 瀹為檯寮�濮嬫椂闂�
+ */
+ @ApiModelProperty(value = "瀹為檯寮�濮嬫椂闂�")
+ private LocalDateTime actualStartTime;
+
+ /**
+ * 瀹為檯缁撴潫鏃堕棿
+ */
+ @ApiModelProperty(value = "瀹為檯缁撴潫鏃堕棿")
+ private LocalDateTime actualEndTime;
+}
\ No newline at end of file
diff --git a/src/main/java/com/ruoyi/production/service/ProductWorkOrderService.java b/src/main/java/com/ruoyi/production/service/ProductWorkOrderService.java
new file mode 100644
index 0000000..57c5b19
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/service/ProductWorkOrderService.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.ProductWorkOrderDto;
+import com.ruoyi.production.pojo.ProductWorkOrder;
+
+public interface ProductWorkOrderService extends IService<ProductWorkOrder>{
+
+ IPage<ProductWorkOrderDto> listPage(Page<ProductWorkOrderDto> page, ProductWorkOrderDto productWorkOrder);
+
+}
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
new file mode 100644
index 0000000..3d2d7e3
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
@@ -0,0 +1,27 @@
+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.ProductWorkOrderDto;
+import com.ruoyi.production.mapper.ProductWorkOrderMapper;
+import com.ruoyi.production.pojo.ProductWorkOrder;
+import com.ruoyi.production.service.ProductWorkOrderService;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+@Service
+@AllArgsConstructor
+@Transactional(rollbackFor = Exception.class)
+public class ProductWorkOrderServiceImpl extends ServiceImpl<ProductWorkOrderMapper, ProductWorkOrder> implements ProductWorkOrderService {
+
+ private ProductWorkOrderMapper productWorkOrdermapper;
+
+ @Override
+ public IPage<ProductWorkOrderDto> listPage(Page<ProductWorkOrderDto> page, ProductWorkOrderDto productWorkOrder) {
+ return productWorkOrdermapper.pageProductWorkOrder(page, productWorkOrder);
+ }
+
+}
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
index 3d51cb0..620b7a1 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -4,33 +4,30 @@
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.production.mapper.*;
+import com.ruoyi.production.pojo.*;
import com.ruoyi.purchase.mapper.PurchaseLedgerMapper;
import com.ruoyi.purchase.pojo.PurchaseLedger;
import com.ruoyi.sales.dto.InvoiceRegistrationProductDto;
import com.ruoyi.sales.mapper.InvoiceRegistrationProductMapper;
import com.ruoyi.sales.mapper.SalesLedgerMapper;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
-import com.ruoyi.sales.pojo.InvoiceRegistrationProduct;
import com.ruoyi.sales.pojo.SalesLedger;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import com.ruoyi.sales.service.ISalesLedgerProductService;
import lombok.AllArgsConstructor;
-import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.lang.reflect.Field;
import java.math.BigDecimal;
-import java.util.*;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
@@ -53,11 +50,14 @@
private ProductOrderMapper productOrderMapper;
private ProcessRouteItemMapper processRouteItemMapper;
+
private ProductProcessRouteItemMapper productProcessRouteItemMapper;
- @Autowired
+
private InvoiceRegistrationProductMapper invoiceRegistrationProductMapper;
- @Autowired
+
private ProcessRouteMapper processRouteMapper;
+
+ private ProductWorkOrderMapper productWorkOrderMapper;
@Override
public SalesLedgerProduct selectSalesLedgerProductById(Long id) {
@@ -104,10 +104,10 @@
// 1. 鍏堟煡璇㈣鍒犻櫎鐨勫瓙琛ㄨ褰曪紝鑾峰彇瀵瑰簲鐨� salesLedgerId
List<SalesLedgerProduct> deletedProducts = salesLedgerProductMapper.selectBatchIds(Arrays.asList(ids));
if (deletedProducts.isEmpty()) {
- return 0; // 娌℃湁鍙垹闄ょ殑鏁版嵁
+ return 0;
}
- // 鍙兘灞炰簬澶氫釜涓昏〃锛堜絾閫氬父涓�涓帴鍙e彧澶勭悊涓�涓富琛級
+ // 鍙兘灞炰簬澶氫釜涓昏〃
Set<Long> mainIds = deletedProducts.stream()
.map(SalesLedgerProduct::getSalesLedgerId)
.filter(Objects::nonNull)
@@ -116,12 +116,40 @@
// 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));
+ //鎵归噺鏌ヨproductOrder
+ List<ProductOrder> productOrders = productOrderMapper.selectList(
+ new LambdaQueryWrapper<ProductOrder>()
+ .in(ProductOrder::getProductModelId, ids)
+ );
+
+ if (!CollectionUtils.isEmpty(productOrders)) {
+ List<Long> orderIds = productOrders.stream()
+ .map(ProductOrder::getId)
+ .collect(Collectors.toList());
+
+ // 鎵归噺鏌ヨprocessRouteItems
+ List<ProductProcessRouteItem> allRouteItems = productProcessRouteItemMapper.selectList(
+ new LambdaQueryWrapper<ProductProcessRouteItem>()
+ .in(ProductProcessRouteItem::getRouteId, orderIds)
+ );
+
+ if (!CollectionUtils.isEmpty(allRouteItems)) {
+ List<Long> routeItemIds = allRouteItems.stream()
+ .map(ProductProcessRouteItem::getId)
+ .collect(Collectors.toList());
+
+ // 鎵归噺鍒犻櫎workOrder
+ productWorkOrderMapper.delete(new LambdaQueryWrapper<ProductWorkOrder>()
+ .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds));
}
+
+ // 鎵归噺鍒犻櫎processRouteItem
+ productProcessRouteItemMapper.delete(new LambdaQueryWrapper<ProductProcessRouteItem>()
+ .in(ProductProcessRouteItem::getRouteId, orderIds));
+
+ // 鎵归噺鍒犻櫎productOrder
+ productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>()
+ .in(ProductOrder::getProductModelId, ids));
}
// 3. 瀵规瘡涓富琛↖D杩涜閲戦鏇存柊
@@ -161,12 +189,45 @@
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()));
+ // 鐢熸垚褰撳墠鏃ユ湡鐨勫墠缂�锛氬勾鏈堟棩
+ String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
for (ProcessRouteItem processRouteItem : processRouteItems) {
ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem();
- productProcessRouteItem.setProductModelId(productOrder.getProductModelId());
+ productProcessRouteItem.setProductModelId(processRouteItem.getProductModelId());
productProcessRouteItem.setProcessId(processRouteItem.getProcessId());
productProcessRouteItem.setRouteId(productOrder.getId());
- productProcessRouteItemMapper.insert(productProcessRouteItem);
+ int insert = productProcessRouteItemMapper.insert(productProcessRouteItem);
+ if (insert > 0) {
+ // 鏌ヨ浠婃棩宸插瓨鍦ㄧ殑鏈�澶у伐鍗曞彿
+ QueryWrapper<ProductWorkOrder> queryWrapper = new QueryWrapper<>();
+ queryWrapper.likeRight("work_order_no", datePrefix)
+ .orderByDesc("work_order_no")
+ .last("LIMIT 1");
+
+ ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectOne(queryWrapper);
+
+ int sequenceNumber = 1; // 榛樿搴忓彿
+ if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) {
+ String lastNo = lastWorkOrder.getWorkOrderNo().toString();
+ if (lastNo.startsWith(datePrefix)) {
+ String seqStr = lastNo.substring(datePrefix.length());
+ try {
+ sequenceNumber = Integer.parseInt(seqStr) + 1;
+ } catch (NumberFormatException e) {
+ sequenceNumber = 1;
+ }
+ }
+ }
+ // 鐢熸垚瀹屾暣鐨勫伐鍗曞彿
+ String workOrderNoStr = String.format("%s%03d", datePrefix, sequenceNumber);
+ ProductWorkOrder productWorkOrder = new ProductWorkOrder();
+ productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
+ productWorkOrder.setWorkOrderNo(workOrderNoStr);
+ productWorkOrder.setStatus(1);
+
+ productWorkOrderMapper.insert(productWorkOrder);
+ }
+
}
productOrder.setRouteId(processRoute.getId());
productOrderMapper.updateById(productOrder);
diff --git a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
index 06d6437..6517eaa 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -9,7 +9,6 @@
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.account.pojo.AccountExpense;
import com.ruoyi.account.pojo.AccountIncome;
import com.ruoyi.account.service.AccountIncomeService;
import com.ruoyi.basic.mapper.CustomerMapper;
@@ -99,6 +98,8 @@
private final ProcessRouteItemMapper processRouteItemMapper;
private final ProductProcessRouteItemMapper productProcessRouteItemMapper;
+
+ private final ProductWorkOrderMapper productWorkOrderMapper;
@Autowired
private SysDeptMapper sysDeptMapper;
@@ -371,6 +372,42 @@
productWrapper.in(SalesLedgerProduct::getSalesLedgerId, idList);
salesLedgerProductMapper.delete(productWrapper);
+ //鎵归噺鏌ヨproductOrder
+ List<ProductOrder> productOrders = productOrderMapper.selectList(
+ new LambdaQueryWrapper<ProductOrder>()
+ .in(ProductOrder::getProductModelId, idList)
+ );
+
+ if (!org.springframework.util.CollectionUtils.isEmpty(productOrders)) {
+ List<Long> orderIds = productOrders.stream()
+ .map(ProductOrder::getId)
+ .collect(Collectors.toList());
+
+ // 鎵归噺鏌ヨprocessRouteItems
+ List<ProductProcessRouteItem> allRouteItems = productProcessRouteItemMapper.selectList(
+ new LambdaQueryWrapper<ProductProcessRouteItem>()
+ .in(ProductProcessRouteItem::getRouteId, orderIds)
+ );
+
+ if (!org.springframework.util.CollectionUtils.isEmpty(allRouteItems)) {
+ List<Long> routeItemIds = allRouteItems.stream()
+ .map(ProductProcessRouteItem::getId)
+ .collect(Collectors.toList());
+
+ // 鎵归噺鍒犻櫎workOrder
+ productWorkOrderMapper.delete(new LambdaQueryWrapper<ProductWorkOrder>()
+ .in(ProductWorkOrder::getProductProcessRouteItemId, routeItemIds));
+ }
+
+ // 鎵归噺鍒犻櫎processRouteItem
+ productProcessRouteItemMapper.delete(new LambdaQueryWrapper<ProductProcessRouteItem>()
+ .in(ProductProcessRouteItem::getRouteId, orderIds));
+
+ // 鎵归噺鍒犻櫎productOrder
+ productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>()
+ .in(ProductOrder::getProductModelId, idList));
+ }
+
LambdaQueryWrapper<InvoiceRegistrationProduct> wrapper = new LambdaQueryWrapper<>();
wrapper.in(InvoiceRegistrationProduct::getSalesLedgerId, idList);
List<InvoiceRegistrationProduct> invoiceRegistrationProducts = invoiceRegistrationProductMapper.selectList(wrapper);
@@ -596,12 +633,43 @@
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()));
+ // 鐢熸垚褰撳墠鏃ユ湡鐨勫墠缂�锛氬勾鏈堟棩
+ String datePrefix = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
for (ProcessRouteItem processRouteItem : processRouteItems) {
ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem();
- productProcessRouteItem.setProductModelId(productOrder.getProductModelId());
+ productProcessRouteItem.setProductModelId(processRouteItem.getProductModelId());
productProcessRouteItem.setProcessId(processRouteItem.getProcessId());
productProcessRouteItem.setRouteId(productOrder.getId());
- productProcessRouteItemMapper.insert(productProcessRouteItem);
+ int insert = productProcessRouteItemMapper.insert(productProcessRouteItem);
+ if (insert > 0) {
+ // 鏌ヨ浠婃棩宸插瓨鍦ㄧ殑鏈�澶у伐鍗曞彿
+ QueryWrapper<ProductWorkOrder> queryWrapper = new QueryWrapper<>();
+ queryWrapper.likeRight("work_order_no", datePrefix)
+ .orderByDesc("work_order_no")
+ .last("LIMIT 1");
+
+ ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectOne(queryWrapper);
+
+ int sequenceNumber = 1; // 榛樿搴忓彿
+ if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) {
+ String lastNo = lastWorkOrder.getWorkOrderNo().toString();
+ if (lastNo.startsWith(datePrefix)) {
+ String seqStr = lastNo.substring(datePrefix.length());
+ try {
+ sequenceNumber = Integer.parseInt(seqStr) + 1;
+ } catch (NumberFormatException e) {
+ sequenceNumber = 1;
+ }
+ }
+ }
+ // 鐢熸垚瀹屾暣鐨勫伐鍗曞彿
+ String workOrderNoStr = String.format("%s%03d", datePrefix, sequenceNumber);
+ ProductWorkOrder productWorkOrder = new ProductWorkOrder();
+ productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
+ productWorkOrder.setWorkOrderNo(workOrderNoStr);
+ productWorkOrder.setStatus(1);
+ productWorkOrderMapper.insert(productWorkOrder);
+ }
}
productOrder.setRouteId(processRoute.getId());
productOrderMapper.updateById(productOrder);
@@ -659,12 +727,12 @@
return datePart + String.format("%03d", nextSequence);
} finally {
- // 3. 閲婃斁閿侊紙浣跨敤Lua鑴氭湰淇濊瘉鍘熷瓙鎬э紝閬垮厤璇垹鍏朵粬绾跨▼鐨勯攣锛�
+ // 3. 閲婃斁閿�
String luaScript = "if redis.call('GET', KEYS[1]) == ARGV[1] then return redis.call('DEL', KEYS[1]) else return 0 end";
redisTemplate.execute(
new DefaultRedisScript<>(luaScript, Long.class),
Collections.singletonList(lockKey),
- lockValue // 鍙湁鎸佹湁鐩稿悓鍊肩殑绾跨▼鎵嶈兘鍒犻櫎閿�
+ lockValue
);
}
}
@@ -673,7 +741,7 @@
if (sequences.isEmpty()) {
return 1;
}
- // 鎺掑簭鍚庢煡鎵剧涓�涓己澶辩殑姝f暣鏁帮紙涓庡師閫昏緫涓�鑷达級
+ // 鎺掑簭鍚庢煡鎵剧涓�涓己澶辩殑姝f暣鏁�
sequences.sort(Integer::compareTo);
int next = 1;
for (int seq : sequences) {
@@ -703,14 +771,13 @@
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
- // 鏋勯�犱富琛ㄦ洿鏂板璞★紙鏀寔浠绘剰涓昏〃绫诲瀷锛�
+ // 鏋勯�犱富琛ㄦ洿鏂板璞�
try {
S entity = mainEntityClass.getDeclaredConstructor().newInstance();
Field idField = mainEntityClass.getDeclaredField("id");
idField.setAccessible(true);
idField.set(entity, mainId);
- // 璁剧疆 contractAmount 瀛楁锛屾敞鎰忚繖閲屽亣璁惧瓧娈靛悕涓� "contractAmount"
Field amountField = mainEntityClass.getDeclaredField("contractAmount");
amountField.setAccessible(true);
amountField.set(entity, totalAmount);
diff --git a/src/main/resources/mapper/production/ProductWorkOrderMapper.xml b/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
new file mode 100644
index 0000000..e1fdbd6
--- /dev/null
+++ b/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
@@ -0,0 +1,40 @@
+<?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.ProductWorkOrderMapper">
+
+ <resultMap id="BaseResultMap" type="com.ruoyi.production.pojo.ProductWorkOrder">
+ <result column="id" property="id"/>
+ <result column="product_process_route_item_id" property="productProcessRouteItemId"/>
+ <result column="create_time" property="createTime"/>
+ <result column="update_time" property="updateTime"/>
+ <result column="work_order_no" property="workOrderNo"/>
+ <result column="status" property="status"/>
+ <result column="tenant_id" property="tenantId"/>
+ <result column="actual_end_time" property="planStartTime"/>
+ <result column="plan_end_time" property="planEndTime"/>
+ <result column="actual_start_time" property="actualStartTime"/>
+ <result column="actualEndTime" property="actualEndTime"/>
+ </resultMap>
+
+ <select id="pageProductWorkOrder" resultType="com.ruoyi.production.dto.ProductWorkOrderDto">
+ SELECT
+ pwo.*,
+ pp.NAME as processName,
+ pm.model,
+ pm.unit,
+ p.product_name AS productName
+ FROM
+ `product_work_order` pwo
+ 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_model pm ON pm.id = ppri.product_model_id
+ LEFT JOIN product p ON p.id = pm.product_id
+ <where>
+ <if test="c.workOrderNo != null and c.workOrderNo != ''">
+ pwo.work_order_no like concat('%',#{c.workOrderNo},'%')
+ </if>
+ </where>
+ </select>
+</mapper>
--
Gitblit v1.9.3