From 6ad5c2cdc193cf7bb02884961b7434cd7f607a0d Mon Sep 17 00:00:00 2001
From: 云 <2163098428@qq.com>
Date: 星期四, 16 四月 2026 10:48:09 +0800
Subject: [PATCH] feat(production): 扩展生产工艺路线支持多产品绑定及工单权限控制
---
src/main/resources/mapper/production/ProductWorkOrderMapper.xml | 16 +
src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java | 6
src/main/java/com/ruoyi/production/controller/ProcessRouteItemController.java | 40 ++
src/main/java/com/ruoyi/production/service/impl/ProductStructureServiceImpl.java | 3
src/main/java/com/ruoyi/production/pojo/ProcessRoute.java | 15
src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java | 11
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java | 159 ++++++---
src/main/java/com/ruoyi/production/controller/ProcessRouteController.java | 51 ++
src/main/resources/mapper/production/ProcessRouteMapper.xml | 58 +++
src/main/java/com/ruoyi/production/mapper/ProductOrderMapper.java | 9
src/main/resources/mapper/production/ProductOrderMapper.xml | 8
src/main/java/com/ruoyi/production/controller/ProductWorkOrderController.java | 33 -
src/main/resources/mapper/production/ProcessRouteItemMapper.xml | 87 ++++-
src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java | 12
doc/1767790800_add_report_user_ids_to_product_work_order.sql | 3
src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java | 118 +++----
src/main/java/com/ruoyi/production/pojo/ProductOrder.java | 46 +--
src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java | 2
doc/create_table_process_route_item.sql | 5
src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java | 44 ++
doc/create_table_process_route.sql | 3
doc/20260414-process-route-multi-product.sql | 18 +
src/main/java/com/ruoyi/production/service/ProductWorkOrderService.java | 2
src/main/java/com/ruoyi/production/pojo/ProductProcessRouteItem.java | 23 +
src/main/java/com/ruoyi/production/pojo/ProcessRouteItem.java | 24 +
src/main/java/com/ruoyi/production/controller/ProductBomController.java | 9
src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java | 73 ++++
27 files changed, 601 insertions(+), 277 deletions(-)
diff --git a/doc/1767790800_add_report_user_ids_to_product_work_order.sql b/doc/1767790800_add_report_user_ids_to_product_work_order.sql
new file mode 100644
index 0000000..8dff3a8
--- /dev/null
+++ b/doc/1767790800_add_report_user_ids_to_product_work_order.sql
@@ -0,0 +1,3 @@
+-- 缁欑敓浜у伐鍗曞鍔犳姤宸ヤ汉瀛楁锛岀敤浜庡伐鍗曠骇鏉冮檺鍒ゆ柇
+ALTER TABLE product_work_order
+ ADD COLUMN report_user_ids varchar(1024) NULL COMMENT '鎶ュ伐浜篿d锛屽閫夛紝閫楀彿鍒嗛殧';
diff --git a/doc/20260414-process-route-multi-product.sql b/doc/20260414-process-route-multi-product.sql
new file mode 100644
index 0000000..540b3d7
--- /dev/null
+++ b/doc/20260414-process-route-multi-product.sql
@@ -0,0 +1,18 @@
+锘�-- 宸ヨ壓璺嚎銆佸伐鑹鸿矾绾挎槑缁嗘敮鎸佺粦瀹氬涓骇鍝侊紙2026-04-14锛�
+ALTER TABLE process_route
+ ADD COLUMN product_model_ids VARCHAR(1024) NULL COMMENT '澶氫骇鍝乮d锛岄�楀彿鍒嗛殧' AFTER product_model_id;
+
+UPDATE process_route
+SET product_model_ids = CAST(product_model_id AS CHAR)
+WHERE (product_model_ids IS NULL OR product_model_ids = '')
+ AND product_model_id IS NOT NULL
+ AND product_model_id <> 0;
+
+ALTER TABLE process_route_item
+ ADD COLUMN product_model_ids VARCHAR(1024) NULL COMMENT '澶氫骇鍝乮d锛岄�楀彿鍒嗛殧' AFTER product_model_id;
+
+UPDATE process_route_item
+SET product_model_ids = CAST(product_model_id AS CHAR)
+WHERE (product_model_ids IS NULL OR product_model_ids = '')
+ AND product_model_id IS NOT NULL
+ AND product_model_id <> 0;
diff --git a/doc/create_table_process_route.sql b/doc/create_table_process_route.sql
index 4a453f8..c58dedb 100644
--- a/doc/create_table_process_route.sql
+++ b/doc/create_table_process_route.sql
@@ -3,7 +3,10 @@
create table process_route
(
id bigint auto_increment primary key,
+ bom_id bigint not null default 0 comment 'BOMid',
product_model_id bigint not null default 0 comment '浜у搧id',
+ process_route_code varchar(255) not null default '' comment '宸ヨ壓璺嚎缂栧彿',
+ product_model_ids varchar(1024) null comment '澶氫骇鍝乮d锛岄�楀彿鍒嗛殧',
description varchar(255) not null default '' comment '鎻忚堪',
tenant_id bigint not null comment '绉熸埛id',
create_time datetime null comment '褰曞叆鏃堕棿',
diff --git a/doc/create_table_process_route_item.sql b/doc/create_table_process_route_item.sql
index a1efff9..dae2614 100644
--- a/doc/create_table_process_route_item.sql
+++ b/doc/create_table_process_route_item.sql
@@ -5,7 +5,10 @@
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',
+ product_model_ids varchar(1024) null comment '澶氫骇鍝乮d锛岄�楀彿鍒嗛殧',
+ drag_sort bigint not null default 0 comment '鎷栨嫿鎺掑簭',
process_id bigint not null default 0 comment '宸ュ簭id',
+ is_quality tinyint not null default 0 comment '鏄惁璐ㄦ 0 涓嶆槸 1 鏄�',
tenant_id bigint not null comment '绉熸埛id',
create_time datetime null comment '褰曞叆鏃堕棿',
update_time datetime null comment '鏇存柊鏃堕棿'
@@ -59,4 +62,4 @@
);
alter table product_process
- add salary_quota numeric(16,3) null comment '宸ヨ祫瀹氶';
\ No newline at end of file
+ add salary_quota numeric(16,3) null comment '宸ヨ祫瀹氶';
diff --git a/src/main/java/com/ruoyi/production/controller/ProcessRouteController.java b/src/main/java/com/ruoyi/production/controller/ProcessRouteController.java
index 50ac4a8..c80542a 100644
--- a/src/main/java/com/ruoyi/production/controller/ProcessRouteController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProcessRouteController.java
@@ -1,47 +1,78 @@
package com.ruoyi.production.controller;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.dto.ProcessRouteDto;
import com.ruoyi.production.pojo.ProcessRoute;
-import com.ruoyi.production.pojo.ProcessRouteItem;
-import com.ruoyi.production.service.ProcessRouteItemService;
import com.ruoyi.production.service.ProcessRouteService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
@RestController
-@RequestMapping("processRoute")
+@RequestMapping("/processRoute")
@Api(tags = "宸ヨ壓璺嚎")
public class ProcessRouteController {
@Autowired
private ProcessRouteService processRouteService;
- @GetMapping("page")
+ @GetMapping("/page")
@ApiOperation("鍒嗛〉鏌ヨ")
- public R page(Page<ProcessRouteDto> page, ProcessRouteDto processRouteDto) {
+ public R page(Page<ProcessRouteDto> page, ProcessRouteDto processRouteDto) {
return R.ok(processRouteService.pageProcessRouteDto(page, processRouteDto));
}
@ApiOperation("鏂板宸ヨ壓璺嚎")
- @PostMapping ()
- public R add(@RequestBody ProcessRoute processRoute) {
+ @PostMapping
+ public R add(@RequestBody ProcessRoute processRoute) {
+ normalizeProductBinding(processRoute);
return R.ok(processRouteService.saveProcessRoute(processRoute));
}
+
@ApiOperation("淇敼宸ヨ壓璺嚎")
- @PutMapping ()
- public R update(@RequestBody ProcessRoute processRoute) {
+ @PutMapping
+ public R update(@RequestBody ProcessRoute processRoute) {
+ normalizeProductBinding(processRoute);
return R.ok(processRouteService.updateById(processRoute));
}
+
@ApiOperation("鍒犻櫎宸ヨ壓璺嚎")
@DeleteMapping("/{ids}")
public R delete(@PathVariable("ids") Long[] ids) {
return R.ok(processRouteService.batchDelete(Arrays.asList(ids)));
}
+
+ private void normalizeProductBinding(ProcessRoute processRoute) {
+ if (processRoute == null) {
+ return;
+ }
+ String ids = null;
+ List<Long> idList = processRoute.getProductModelIdList();
+ if (idList != null && !idList.isEmpty()) {
+ ids = idList.stream()
+ .filter(item -> item != null && item > 0)
+ .distinct()
+ .map(String::valueOf)
+ .collect(Collectors.joining(","));
+ } else if (StringUtils.hasText(processRoute.getProductModelIds())) {
+ ids = Arrays.stream(processRoute.getProductModelIds().split(","))
+ .map(String::trim)
+ .filter(StringUtils::hasText)
+ .distinct()
+ .collect(Collectors.joining(","));
+ } else if (processRoute.getProductModelId() != null) {
+ ids = String.valueOf(processRoute.getProductModelId());
+ }
+ processRoute.setProductModelIds(ids);
+ if (StringUtils.hasText(ids)) {
+ processRoute.setProductModelId(Long.valueOf(ids.split(",")[0]));
+ }
+ }
}
diff --git a/src/main/java/com/ruoyi/production/controller/ProcessRouteItemController.java b/src/main/java/com/ruoyi/production/controller/ProcessRouteItemController.java
index 451548d..b9040de 100644
--- a/src/main/java/com/ruoyi/production/controller/ProcessRouteItemController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProcessRouteItemController.java
@@ -1,29 +1,27 @@
package com.ruoyi.production.controller;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.production.dto.ProcessRouteItemDto;
-import com.ruoyi.production.pojo.ProcessRoute;
import com.ruoyi.production.pojo.ProcessRouteItem;
import com.ruoyi.production.service.ProcessRouteItemService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.List;
+import java.util.stream.Collectors;
@RestController
@RequestMapping("processRouteItem")
@Api(tags = "宸ヨ壓璺嚎鏄庣粏")
public class ProcessRouteItemController {
+
@Autowired
private ProcessRouteItemService processRouteItemService;
@@ -32,13 +30,14 @@
return R.ok(processRouteItemService.listProcessRouteItemDto(processRouteItemDto));
}
- @PostMapping ()
+ @PostMapping
@ApiOperation("鏂板淇敼")
public R addOrUpdate(@RequestBody ProcessRouteItem processRouteItem) {
+ normalizeProductBinding(processRouteItem);
return R.ok(processRouteItemService.saveOrUpdate(processRouteItem));
}
- @PostMapping ("/sort")
+ @PostMapping("/sort")
@ApiOperation("鎺掑簭")
public R sort(@RequestBody ProcessRouteItem processRouteItem) {
return R.ok(processRouteItemService.sort(processRouteItem));
@@ -50,4 +49,31 @@
public AjaxResult batchDelete(@PathVariable("id") Long id) {
return AjaxResult.success(processRouteItemService.batchDelete(id));
}
+
+ private void normalizeProductBinding(ProcessRouteItem processRouteItem) {
+ if (processRouteItem == null) {
+ return;
+ }
+ String ids = null;
+ List<Long> idList = processRouteItem.getProductModelIdList();
+ if (idList != null && !idList.isEmpty()) {
+ ids = idList.stream()
+ .filter(item -> item != null && item > 0)
+ .distinct()
+ .map(String::valueOf)
+ .collect(Collectors.joining(","));
+ } else if (StringUtils.hasText(processRouteItem.getProductModelIds())) {
+ ids = Arrays.stream(processRouteItem.getProductModelIds().split(","))
+ .map(String::trim)
+ .filter(StringUtils::hasText)
+ .distinct()
+ .collect(Collectors.joining(","));
+ } else if (processRouteItem.getProductModelId() != null) {
+ ids = String.valueOf(processRouteItem.getProductModelId());
+ }
+ processRouteItem.setProductModelIds(ids);
+ if (StringUtils.hasText(ids)) {
+ processRouteItem.setProductModelId(Long.valueOf(ids.split(",")[0]));
+ }
+ }
}
diff --git a/src/main/java/com/ruoyi/production/controller/ProductBomController.java b/src/main/java/com/ruoyi/production/controller/ProductBomController.java
index 0ad7d59..91a87ac 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductBomController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductBomController.java
@@ -101,6 +101,15 @@
return AjaxResult.success(productBoms);
}
+ @PostMapping("/getByModelList")
+ @Log(title = "BOM-鏍规嵁閫夋嫨鐨勮鏍煎瀷鍙穒ds鏌ヨ瀛樺湪鐨刡om", businessType = BusinessType.OTHER)
+ @ApiOperation("BOM-鏍规嵁閫夋嫨鐨勮鏍煎瀷鍙穒d鏌ヨ瀛樺湪鐨刡om")
+ public AjaxResult getByModelList(@RequestBody List<Long> productModelId) {
+ if (CollectionUtils.isEmpty(productModelId)) return AjaxResult.error("璇烽�夋嫨瑕佹煡璇㈢殑瑙勬牸鍨嬪彿");
+ List<ProductBom> productBoms = productBomService.list(Wrappers.<ProductBom>lambdaQuery().in(ProductBom::getProductModelId, productModelId));
+ return AjaxResult.success(productBoms);
+ }
+
@PostMapping("uploadBom")
@PreAuthorize("@ss.hasPermi('product:bom:import')")
diff --git a/src/main/java/com/ruoyi/production/controller/ProductWorkOrderController.java b/src/main/java/com/ruoyi/production/controller/ProductWorkOrderController.java
index 029e457..7aa7b2d 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductWorkOrderController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductWorkOrderController.java
@@ -5,10 +5,13 @@
import com.ruoyi.production.dto.ProductWorkOrderDto;
import com.ruoyi.production.pojo.ProductWorkOrder;
import com.ruoyi.production.service.ProductWorkOrderService;
-import com.ruoyi.quality.pojo.QualityInspect;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
-import org.springframework.web.bind.annotation.*;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletResponse;
@@ -17,44 +20,28 @@
@RequestMapping("/productWorkOrder")
public class ProductWorkOrderController {
- private ProductWorkOrderService productWorkOrderservice;
+ private final ProductWorkOrderService productWorkOrderservice;
-
- /**
- * 浜у搧宸ュ崟瀹炰綋绫诲垎椤垫煡璇�
- */
- @ApiOperation("浜у搧宸ュ崟瀹炰綋绫诲垎椤垫煡璇�")
+ @ApiOperation("浜у搧宸ュ崟鍒嗛〉鏌ヨ")
@GetMapping("/page")
public R page(Page<ProductWorkOrderDto> page, ProductWorkOrderDto productWorkOrder) {
return R.ok(productWorkOrderservice.listPage(page, productWorkOrder));
}
- /**
- * 浜у搧宸ュ崟鏇存柊
- */
@ApiOperation("浜у搧宸ュ崟鏇存柊")
- @PostMapping ("/updateProductWorkOrder")
+ @PostMapping("/updateProductWorkOrder")
public R updateProductWorkOrder(@RequestBody ProductWorkOrderDto productWorkOrderDto) {
return R.ok(productWorkOrderservice.updateProductWorkOrder(productWorkOrderDto));
}
- /**
- * pda鏍规嵁浜岀淮鐮佺殑宸ュ崟id鏌ヨ鏁版嵁
- */
- @ApiOperation("pda鏍规嵁浜岀淮鐮佺殑宸ュ崟id鏌ヨ鏁版嵁")
+ @ApiOperation("鏍规嵁id鏌ヨ宸ュ崟")
@GetMapping("/getProductWorkOrderById")
public R getProductWorkOrderById(Long id) {
- return R.ok(productWorkOrderservice.getById(id));
+ return R.ok(productWorkOrderservice.getProductWorkOrderById(id));
}
- /**
- * 宸ュ崟娴佽浆鍗′笅杞�
- * @param response
- * @param productWorkOrder
- */
@PostMapping("/down")
public void down(HttpServletResponse response, @RequestBody ProductWorkOrder productWorkOrder) {
productWorkOrderservice.down(response, productWorkOrder);
}
-
}
diff --git a/src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java b/src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java
index 6e2ca95..64242af 100644
--- a/src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java
+++ b/src/main/java/com/ruoyi/production/dto/ProductWorkOrderDto.java
@@ -1,37 +1,28 @@
package com.ruoyi.production.dto;
-import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import com.ruoyi.production.pojo.ProductWorkOrder;
-import com.ruoyi.production.pojo.ProductWorkOrderFile;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
-import java.util.List;
@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;
-
- //鐢熶骇璁㈠崟鍙�
@ApiModelProperty(value = "鐢熶骇璁㈠崟鍙�")
private String productOrderNpsNo;
@@ -43,4 +34,7 @@
@ApiModelProperty(value = "宸ュ崟绫诲瀷 姝e父 /杩斿伐杩斾慨")
private String workOrderType;
+
+ @ApiModelProperty(value = "鎶ュ伐浜哄悕绉帮紝澶氫釜閫楀彿鍒嗛殧")
+ private String reportUserNames;
}
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductOrderMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductOrderMapper.java
index 72aa6cd..6cc8297 100644
--- a/src/main/java/com/ruoyi/production/mapper/ProductOrderMapper.java
+++ b/src/main/java/com/ruoyi/production/mapper/ProductOrderMapper.java
@@ -16,7 +16,14 @@
@Mapper
public interface ProductOrderMapper extends BaseMapper<ProductOrder> {
- IPage<ProductOrderDto> pageProductOrder(Page page, @Param("c") ProductOrderDto productOrder);
+ default IPage<ProductOrderDto> pageProductOrder(Page page, ProductOrderDto productOrder) {
+ return pageProductOrder(page, productOrder, null, true);
+ }
+
+ IPage<ProductOrderDto> pageProductOrder(Page page,
+ @Param("c") ProductOrderDto productOrder,
+ @Param("userId") Long userId,
+ @Param("isAdmin") Boolean isAdmin);
List<ProcessRoute> listProcessRoute(@Param("productModelId") Long productModelId);
diff --git a/src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java b/src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java
index d637f7d..13d0a11 100644
--- a/src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java
+++ b/src/main/java/com/ruoyi/production/mapper/ProductWorkOrderMapper.java
@@ -15,7 +15,16 @@
@Mapper
public interface ProductWorkOrderMapper extends BaseMapper<ProductWorkOrder> {
- IPage<ProductWorkOrderDto> pageProductWorkOrder(Page<ProductWorkOrderDto> page, @Param("c") ProductWorkOrderDto productWorkOrder);
+ default IPage<ProductWorkOrderDto> pageProductWorkOrder(Page<ProductWorkOrderDto> page, ProductWorkOrderDto productWorkOrder) {
+ return pageProductWorkOrder(page, productWorkOrder, null, true);
+ }
+
+ IPage<ProductWorkOrderDto> pageProductWorkOrder(Page<ProductWorkOrderDto> page,
+ @Param("c") ProductWorkOrderDto productWorkOrder,
+ @Param("userId") Long userId,
+ @Param("isAdmin") Boolean isAdmin);
+
+ Integer checkUserCanAccess(@Param("workOrderId") Long workOrderId, @Param("userId") Long userId);
ProductWorkOrderDto getProductWorkOrderFlowCard(@Param("id") Long id);
diff --git a/src/main/java/com/ruoyi/production/pojo/ProcessRoute.java b/src/main/java/com/ruoyi/production/pojo/ProcessRoute.java
index fe661b3..342a402 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProcessRoute.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProcessRoute.java
@@ -8,18 +8,25 @@
import lombok.Data;
import java.time.LocalDateTime;
+import java.util.List;
@TableName("process_route")
@Data
@ApiModel(value = "processRoute", description = "宸ヨ壓璺嚎涓昏〃")
public class ProcessRoute {
- @ApiModelProperty(value = "搴忓彿")
+ @ApiModelProperty(value = "ID")
private Long id;
- @ApiModelProperty(value = "浜у搧ID")
- //product_model
+ @ApiModelProperty(value = "浜у搧瑙勬牸ID锛堝吋瀹规棫瀛楁锛�")
private Long productModelId;
+
+ @ApiModelProperty(value = "澶氫骇鍝両D锛岄�楀彿鍒嗛殧")
+ private String productModelIds;
+
+ @TableField(exist = false)
+ @ApiModelProperty(value = "澶氫骇鍝両D鍒楄〃")
+ private List<Long> productModelIdList;
@ApiModelProperty(value = "鎻忚堪")
private String description;
@@ -39,6 +46,6 @@
@ApiModelProperty(value = "宸ヨ壓璺嚎缂栫爜")
private String processRouteCode;
- @ApiModelProperty(value = "BOM鐨処D")
+ @ApiModelProperty(value = "BOM ID")
private Integer bomId;
}
diff --git a/src/main/java/com/ruoyi/production/pojo/ProcessRouteItem.java b/src/main/java/com/ruoyi/production/pojo/ProcessRouteItem.java
index 973b29e..b34c08f 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProcessRouteItem.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProcessRouteItem.java
@@ -6,39 +6,47 @@
import lombok.Data;
import java.time.LocalDateTime;
+import java.util.List;
@Data
@TableName("process_route_item")
-@ApiModel(value = "processRouteItem", description = "宸ヨ壓璺嚎瀛愯〃")
+@ApiModel(value = "processRouteItem", description = "宸ヨ壓璺嚎鏄庣粏")
public class ProcessRouteItem {
@TableId(type = IdType.AUTO)
private Long id;
- @ApiModelProperty(value = "宸ヨ壓璺嚎id")
+ @ApiModelProperty(value = "宸ヨ壓璺嚎ID")
private Long routeId;
- @ApiModelProperty(value = "宸ュ簭id")
+ @ApiModelProperty(value = "宸ュ簭ID")
private Long processId;
- @ApiModelProperty(value ="浜у搧id")
+ @ApiModelProperty(value = "浜у搧瑙勬牸ID锛堝吋瀹规棫瀛楁锛�")
private Long productModelId;
+
+ @ApiModelProperty(value = "澶氫骇鍝両D锛岄�楀彿鍒嗛殧")
+ private String productModelIds;
+
+ @TableField(exist = false)
+ @ApiModelProperty(value = "澶氫骇鍝両D鍒楄〃")
+ private List<Long> productModelIdList;
@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;
- @ApiModelProperty(value ="鎷栧姩鎺掑簭")
+ @ApiModelProperty(value = "鎷栧姩鎺掑簭")
private Integer dragSort;
-
- @ApiModelProperty(value ="鏄惁璐ㄦ")
+ @ApiModelProperty(value = "鏄惁璐ㄦ")
private Boolean isQuality;
-
}
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductOrder.java b/src/main/java/com/ruoyi/production/pojo/ProductOrder.java
index 5286cd3..3e6fe55 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductOrder.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductOrder.java
@@ -1,9 +1,12 @@
package com.ruoyi.production.pojo;
-import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
-import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
@@ -11,55 +14,37 @@
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
+import java.util.List;
@Data
@TableName("product_order")
-public class ProductOrder implements Serializable {
+public class ProductOrder implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
- /**
- * 閿�鍞彴璐d
- */
@ApiModelProperty(value = "閿�鍞彴璐d")
private Long salesLedgerId;
- /**
- * 閿�鍞彴璐︿骇鍝乮d(sales_ledger_product)
- */
@ApiModelProperty(value = "閿�鍞彴璐︿骇鍝乮d")
private Long saleLedgerProductId;
- /**
- * 浜у搧瑙勬牸id
- */
@ApiModelProperty(value = "浜у搧瑙勬牸id")
private Long productModelId;
- /**
- * 妯$増鐨勫伐鑹鸿矾绾縤d
- */
@ApiModelProperty(value = "宸ヨ壓璺嚎id")
private Long routeId;
- /**
- * 鐢熶骇璁㈠崟鍙�
- */
@ApiModelProperty(value = "鐢熶骇璁㈠崟鍙�")
@Excel(name = "鐢熶骇璁㈠崟鍙�")
private String npsNo;
- /**
- * 绉熸埛id
- */
@ApiModelProperty(value = "绉熸埛id")
@TableField(fill = FieldFill.INSERT)
private Long tenantId;
- //鍒涘缓鏃堕棿
@ApiModelProperty(value = "鍒涘缓鏃堕棿")
@TableField(fill = FieldFill.INSERT)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@@ -67,24 +52,16 @@
@Excel(name = "鍒涘缓鏃堕棿")
private LocalDateTime createTime;
- //淇敼鏃堕棿
@ApiModelProperty(value = "淇敼鏃堕棿")
@TableField(fill = FieldFill.INSERT_UPDATE)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime updateTime;
-
- /**
- * 闇�姹傛暟閲�
- */
@ApiModelProperty(value = "闇�姹傛暟閲�")
@Excel(name = "闇�姹傛暟閲�")
private BigDecimal quantity;
- /**
- * 瀹屾垚鏁伴噺
- */
@ApiModelProperty(value = "瀹屾垚鏁伴噺")
@Excel(name = "瀹屾垚鏁伴噺")
private BigDecimal completeQuantity;
@@ -101,6 +78,15 @@
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime endTime;
+ @TableField(exist = false)
+ @ApiModelProperty(value = "鍓嶇浼犲叆鐨勫伐搴忓垪琛�")
+ private List<ProductProcessRouteItem> processRouteItems;
+ @TableField(exist = false)
+ @ApiModelProperty(value = "鍓嶇浼犲叆鐨勫伐鑹鸿矾绾跨紪鍙�")
+ private String processRouteCode;
+ @TableField(exist = false)
+ @ApiModelProperty(value = "鍓嶇浼犲叆鐨凚OM id")
+ private Integer bomId;
}
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductProcessRouteItem.java b/src/main/java/com/ruoyi/production/pojo/ProductProcessRouteItem.java
index d84a7ce..bb201a5 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductProcessRouteItem.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductProcessRouteItem.java
@@ -1,6 +1,10 @@
package com.ruoyi.production.pojo;
-import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -13,32 +17,37 @@
@TableId(type = IdType.AUTO)
private Long id;
- @ApiModelProperty(value = "鐢熶骇璁㈠崟id(product_order_id)")
+ @ApiModelProperty(value = "鐢熶骇璁㈠崟id")
private Long productOrderId;
- @ApiModelProperty(value = "鐢熶骇璁㈠崟鐨勫伐鑹鸿矾绾縤d(product_process_route)")
+ @ApiModelProperty(value = "鐢熶骇璁㈠崟鐨勫伐鑹鸿矾绾縤d")
private Long productRouteId;
@ApiModelProperty(value = "宸ュ簭id")
private Long processId;
- @ApiModelProperty(value ="浜у搧id")
+ @ApiModelProperty(value = "浜у搧瑙勬牸id")
private Long productModelId;
- @ApiModelProperty(value = "绉熸埛ID")
+ @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;
- @ApiModelProperty(value ="鎷栧姩鎺掑簭")
+ @ApiModelProperty(value = "鎷栧姩鎺掑簭")
private Integer dragSort;
- @ApiModelProperty(value ="鏄惁璐ㄦ")
+ @ApiModelProperty(value = "鏄惁璐ㄦ")
private Boolean isQuality;
+ @ApiModelProperty(value = "鎶ュ伐浜篿d锛屽閫夛紝閫楀彿鍒嗛殧")
+ @TableField(exist = false)
+ private String reportUserIds;
}
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java b/src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java
index 4efc694..82aa0d6 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductWorkOrder.java
@@ -121,5 +121,11 @@
@ApiModelProperty(value = "瀹屾垚鏁伴噺")
private BigDecimal completeQuantity;
+ /**
+ * 鎶ュ伐浜篿d锛屽閫夛紝閫楀彿鍒嗛殧
+ */
+ @ApiModelProperty(value = "鎶ュ伐浜篿d锛屽閫夛紝閫楀彿鍒嗛殧")
+ private String reportUserIds;
+
}
diff --git a/src/main/java/com/ruoyi/production/service/ProductWorkOrderService.java b/src/main/java/com/ruoyi/production/service/ProductWorkOrderService.java
index 8ef28e6..51252a4 100644
--- a/src/main/java/com/ruoyi/production/service/ProductWorkOrderService.java
+++ b/src/main/java/com/ruoyi/production/service/ProductWorkOrderService.java
@@ -14,5 +14,7 @@
int updateProductWorkOrder(ProductWorkOrderDto productWorkOrderDto);
+ ProductWorkOrder getProductWorkOrderById(Long id);
+
void down(HttpServletResponse response, ProductWorkOrder productWorkOrder);
}
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java
index 12a46a9..6c30412 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProcessRouteServiceImpl.java
@@ -19,11 +19,14 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
+import java.util.Arrays;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
@Service
@AllArgsConstructor
@@ -44,26 +47,28 @@
@Override
public IPage<ProcessRouteDto> pageProcessRouteDto(Page<ProcessRouteDto> page, ProcessRouteDto processRouteDto) {
-
return processRouteMapper.pageProcessRouteDto(page, processRouteDto);
}
@Override
public Integer saveProcessRoute(ProcessRoute processRoute) {
+ normalizeProductModelIds(processRoute);
this.save(processRoute);
+
String dateStr = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
String idStr = String.format("%06d", processRoute.getId());
- String newProductCode = "GYLX" + dateStr + idStr;
- // 鏇存柊鏁版嵁搴撲腑鐨刾roductCode
- processRoute.setProcessRouteCode(newProductCode);
- // 鏌ヨbom娓呭崟
+ String routeCode = "GYLX" + dateStr + idStr;
+ processRoute.setProcessRouteCode(routeCode);
+
List<ProductStructureDto> productStructureDtos = productStructureService.listDetailBybomId(processRoute.getBomId());
- if(CollectionUtils.isNotEmpty(productStructureDtos)){
+ if (CollectionUtils.isNotEmpty(productStructureDtos)) {
AtomicInteger i = new AtomicInteger(1);
productStructureDtos.forEach(productStructureDto -> {
ProcessRouteItem processRouteItem = new ProcessRouteItem();
processRouteItem.setRouteId(processRoute.getId());
processRouteItem.setProcessId(productStructureDto.getProcessId());
+ processRouteItem.setProductModelId(processRoute.getProductModelId());
+ processRouteItem.setProductModelIds(processRoute.getProductModelIds());
processRouteItem.setDragSort(i.get());
processRouteItem.setIsQuality(false);
processRouteItemMapper.insert(processRouteItem);
@@ -75,13 +80,59 @@
@Override
public int batchDelete(List<Long> ids) {
- //鍏堝垽鏂槸鍚﹀凡缁忓紩鐢ㄤ簡
- List<ProductOrder> productOrders = productOrderMapper.selectList(Wrappers.<ProductOrder>lambdaQuery().in(ProductOrder::getRouteId, ids));
- if (productOrders.size()>0){
- throw new RuntimeException("璇ュ伐鑹鸿矾绾跨敓浜у凡寮曠敤锛屼笉鑳藉垹闄�");
+ List<ProductOrder> productOrders = productOrderMapper.selectList(
+ Wrappers.<ProductOrder>lambdaQuery().in(ProductOrder::getRouteId, ids)
+ );
+ if (!productOrders.isEmpty()) {
+ throw new RuntimeException("璇ュ伐鑹鸿矾绾垮凡琚敓浜ц鍗曞紩鐢紝涓嶈兘鍒犻櫎");
}
- //鍒犻櫎宸ヨ壓璺嚎璇︽儏
processRouteItemMapper.delete(Wrappers.<ProcessRouteItem>lambdaQuery().in(ProcessRouteItem::getRouteId, ids));
return processRouteMapper.deleteBatchIds(ids);
}
+
+ private void normalizeProductModelIds(ProcessRoute processRoute) {
+ if (processRoute == null) {
+ return;
+ }
+ String ids = joinProductModelIds(
+ processRoute.getProductModelIdList(),
+ processRoute.getProductModelIds(),
+ processRoute.getProductModelId()
+ );
+ processRoute.setProductModelIds(ids);
+ processRoute.setProductModelId(firstProductModelId(ids, processRoute.getProductModelId()));
+ }
+
+ private String joinProductModelIds(List<Long> idList, String ids, Long fallbackId) {
+ if (CollectionUtils.isNotEmpty(idList)) {
+ return idList.stream()
+ .filter(item -> item != null && item > 0)
+ .distinct()
+ .map(String::valueOf)
+ .collect(Collectors.joining(","));
+ }
+ if (StringUtils.hasText(ids)) {
+ return Arrays.stream(ids.split(","))
+ .map(String::trim)
+ .filter(StringUtils::hasText)
+ .distinct()
+ .collect(Collectors.joining(","));
+ }
+ return fallbackId == null ? null : String.valueOf(fallbackId);
+ }
+
+ private Long firstProductModelId(String ids, Long fallbackId) {
+ if (!StringUtils.hasText(ids)) {
+ return fallbackId;
+ }
+ String first = ids.split(",")[0].trim();
+ if (!StringUtils.hasText(first)) {
+ return fallbackId;
+ }
+ try {
+ return Long.parseLong(first);
+ } catch (NumberFormatException ignore) {
+ return fallbackId;
+ }
+ }
}
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
index 8a1099c..695d85d 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductOrderServiceImpl.java
@@ -7,16 +7,23 @@
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
-import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
-import com.ruoyi.procurementrecord.utils.StockUtils;
+import com.ruoyi.common.constant.Constants;
+import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.production.dto.ProductOrderDto;
import com.ruoyi.production.dto.ProductStructureDto;
-import com.ruoyi.production.mapper.*;
-import com.ruoyi.production.pojo.*;
+import com.ruoyi.production.mapper.ProcessRouteMapper;
+import com.ruoyi.production.mapper.ProductOrderMapper;
+import com.ruoyi.production.mapper.ProductProcessRouteItemMapper;
+import com.ruoyi.production.mapper.ProductProcessRouteMapper;
+import com.ruoyi.production.mapper.ProductWorkOrderMapper;
+import com.ruoyi.production.mapper.ProductionProductMainMapper;
+import com.ruoyi.production.pojo.ProcessRoute;
+import com.ruoyi.production.pojo.ProductOrder;
+import com.ruoyi.production.pojo.ProductProcessRoute;
+import com.ruoyi.production.pojo.ProductProcessRouteItem;
+import com.ruoyi.production.pojo.ProductWorkOrder;
+import com.ruoyi.production.pojo.ProductionProductMain;
import com.ruoyi.production.service.ProductOrderService;
-import com.ruoyi.quality.mapper.QualityInspectMapper;
-import com.ruoyi.quality.pojo.QualityInspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -39,9 +46,6 @@
private ProductProcessRouteMapper productProcessRouteMapper;
@Autowired
- private ProcessRouteItemMapper processRouteItemMapper;
-
- @Autowired
private ProductProcessRouteItemMapper productProcessRouteItemMapper;
@Autowired
@@ -50,54 +54,48 @@
@Autowired
private ProductionProductMainMapper productionProductMainMapper;
- @Autowired
- private ProductionProductOutputMapper productionProductOutputMapper;
-
- @Autowired
- private ProductionProductInputMapper productionProductInputMapper;
-
- @Autowired
- private QualityInspectMapper qualityInspectMapper;
-
- @Autowired
- private SalesLedgerProductionAccountingMapper salesLedgerProductionAccountingMapper;
-
- @Autowired
- private StockUtils stockUtils;
-
@Override
public IPage<ProductOrderDto> pageProductOrder(Page page, ProductOrderDto productOrder) {
- return productOrderMapper.pageProductOrder(page, productOrder);
+ Long userId = SecurityUtils.getUserId();
+ boolean isAdmin = SecurityUtils.isAdmin(userId) || SecurityUtils.hasRole(Constants.SUPER_ADMIN);
+ return productOrderMapper.pageProductOrder(page, productOrder, userId, isAdmin);
}
@Override
public int bindingRoute(ProductOrder productOrder) {
- //鏂板鐢熶骇璁㈠崟涓嬬殑宸ヨ壓璺嚎涓昏〃
- ProcessRoute processRoute = processRouteMapper.selectById(productOrder.getRouteId());
+ List<ProductProcessRouteItem> processRouteItems = productOrder.getProcessRouteItems();
+ if (ObjectUtils.isEmpty(processRouteItems)) {
+ throw new RuntimeException("宸ュ簭鍒楄〃涓嶈兘涓虹┖");
+ }
+
+ ProcessRoute processRoute = null;
+ if (ObjectUtils.isNotEmpty(productOrder.getRouteId())) {
+ processRoute = processRouteMapper.selectById(productOrder.getRouteId());
+ }
+
ProductProcessRoute productProcessRoute = new ProductProcessRoute();
- productProcessRoute.setProductModelId(processRoute.getProductModelId());
- productProcessRoute.setProcessRouteCode(processRoute.getProcessRouteCode());
+ productProcessRoute.setProductModelId(productOrder.getProductModelId());
+ productProcessRoute.setProcessRouteCode(processRoute != null ? processRoute.getProcessRouteCode() : productOrder.getProcessRouteCode());
productProcessRoute.setProductOrderId(productOrder.getId());
- productProcessRoute.setBomId(processRoute.getBomId());
+ productProcessRoute.setBomId(processRoute != null ? processRoute.getBomId() : productOrder.getBomId());
productProcessRouteMapper.insert(productProcessRoute);
- //鏂板鐢熶骇璁㈠崟涓嬬殑宸ヨ壓璺嚎瀛愯〃
- 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) {
+ for (ProductProcessRouteItem processRouteItem : processRouteItems) {
ProductProcessRouteItem productProcessRouteItem = new ProductProcessRouteItem();
- productProcessRouteItem.setProductModelId(processRouteItem.getProductModelId());
+ productProcessRouteItem.setProductModelId(productOrder.getProductModelId());
productProcessRouteItem.setProcessId(processRouteItem.getProcessId());
productProcessRouteItem.setProductOrderId(productOrder.getId());
productProcessRouteItem.setProductRouteId(productProcessRoute.getId());
productProcessRouteItem.setDragSort(processRouteItem.getDragSort());
+ productProcessRouteItem.setIsQuality(processRouteItem.getIsQuality());
+ productProcessRouteItem.setReportUserIds(processRouteItem.getReportUserIds());
int insert = productProcessRouteItemMapper.insert(productProcessRouteItem);
if (insert > 0) {
- // 鏌ヨ浠婃棩宸插瓨鍦ㄧ殑鏈�澶у伐鍗曞彿
ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectMax(datePrefix);
- int sequenceNumber = 1; // 榛樿搴忓彿
+ int sequenceNumber = 1;
if (lastWorkOrder != null && lastWorkOrder.getWorkOrderNo() != null) {
- String lastNo = lastWorkOrder.getWorkOrderNo().toString();
+ String lastNo = lastWorkOrder.getWorkOrderNo();
if (lastNo.startsWith(datePrefix)) {
String seqStr = lastNo.substring(datePrefix.length());
try {
@@ -107,13 +105,14 @@
}
}
}
- // 鐢熸垚瀹屾暣鐨勫伐鍗曞彿
String workOrderNoStr = "GD" + String.format("%s%03d", datePrefix, sequenceNumber);
ProductWorkOrder productWorkOrder = new ProductWorkOrder();
productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
productWorkOrder.setProductOrderId(productOrder.getId());
ProductOrder order = productOrderMapper.selectById(productOrder.getId());
productWorkOrder.setPlanQuantity(order.getQuantity());
+ // 鏂板鐢熶骇璁㈠崟鏃讹紝灏嗗伐搴忎笂鐨勬姤宸ヤ汉鍚屾鍒板伐鍗曪紝鍚庣画鎸夊伐鍗曟姤宸ヤ汉鍋氭潈闄愭牎楠�
+ productWorkOrder.setReportUserIds(productProcessRouteItem.getReportUserIds());
productWorkOrder.setWorkOrderNo(workOrderNoStr);
productWorkOrder.setStatus(1);
productWorkOrderMapper.insert(productWorkOrder);
@@ -134,11 +133,11 @@
@Override
public Boolean addProductOrder(ProductOrder productOrder) {
- String string = generateNextOrderNo(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")));
- productOrder.setNpsNo(string);
+ String orderNo = generateNextOrderNo(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")));
+ productOrder.setNpsNo(orderNo);
productOrder.setCompleteQuantity(BigDecimal.ZERO);
this.save(productOrder);
- if (ObjectUtils.isNotEmpty(productOrder.getRouteId())) {
+ if (ObjectUtils.isNotEmpty(productOrder.getProcessRouteItems())) {
this.bindingRoute(productOrder);
}
return true;
@@ -146,36 +145,32 @@
@Override
public Boolean delete(Long[] ids) {
- //濡傛灉宸茬粡寮�濮嬬敓浜�,涓嶈兘鍒犻櫎
- //鏌ヨ鐢熶骇璁㈠崟涓嬬殑宸ュ崟
- List<ProductWorkOrder> productWorkOrders = productWorkOrderMapper.selectList(Wrappers.<ProductWorkOrder>lambdaQuery().in(ProductWorkOrder::getProductOrderId, ids));
- if (productWorkOrders.size()>0){
- //鍒ゆ柇鏄惁鏈夋姤宸ユ暟鎹�
- List<ProductionProductMain> productionProductMains = productionProductMainMapper.selectList(Wrappers.<ProductionProductMain>lambdaQuery()
- .in(ProductionProductMain::getWorkOrderId, productWorkOrders.stream().map(ProductWorkOrder::getId).collect(Collectors.toList())));
- if (productionProductMains.size()>0){
- throw new RuntimeException("鐢熶骇璁㈠崟宸茬粡寮�濮嬬敓浜�,涓嶈兘鍒犻櫎");
+ List<ProductWorkOrder> productWorkOrders = productWorkOrderMapper.selectList(
+ Wrappers.<ProductWorkOrder>lambdaQuery().in(ProductWorkOrder::getProductOrderId, ids)
+ );
+ if (!productWorkOrders.isEmpty()) {
+ List<ProductionProductMain> productionProductMains = productionProductMainMapper.selectList(
+ Wrappers.<ProductionProductMain>lambdaQuery()
+ .in(ProductionProductMain::getWorkOrderId, productWorkOrders.stream().map(ProductWorkOrder::getId).collect(Collectors.toList()))
+ );
+ if (!productionProductMains.isEmpty()) {
+ throw new RuntimeException("鐢熶骇璁㈠崟宸茬粡寮�濮嬬敓浜э紝涓嶈兘鍒犻櫎");
}
- //鍒犻櫎宸ュ崟
productWorkOrderMapper.delete(Wrappers.<ProductWorkOrder>lambdaQuery().in(ProductWorkOrder::getProductOrderId, ids));
}
- //鍒犻櫎宸ヨ壓璺嚎
+
productProcessRouteItemMapper.delete(new LambdaQueryWrapper<ProductProcessRouteItem>()
.in(ProductProcessRouteItem::getProductOrderId, ids));
productProcessRouteMapper.delete(new LambdaQueryWrapper<ProductProcessRoute>()
.in(ProductProcessRoute::getProductOrderId, ids));
- //鍒犻櫎鐢熶骇璁㈠崟
productOrderMapper.delete(new LambdaQueryWrapper<ProductOrder>()
.in(ProductOrder::getId, ids));
return true;
}
- //鑾峰彇褰撳墠鐢熶骇璁㈠崟鍙�
public String getMaxOrderNoByDate(String datePrefix) {
QueryWrapper<ProductOrder> queryWrapper = new QueryWrapper<>();
- // 鍖归厤浠� SC + 鏃ユ湡寮�澶寸殑璁㈠崟鍙�
queryWrapper.likeRight("nps_no", "SC" + datePrefix);
- // 鎸夎鍗曞彿鍊掑簭鎺掑垪
queryWrapper.orderByDesc("nps_no");
queryWrapper.last("LIMIT 1");
@@ -185,20 +180,15 @@
public String generateNextOrderNo(String datePrefix) {
String maxOrderNo = getMaxOrderNoByDate(datePrefix);
- int sequence = 1; // 榛樿璧峰搴忓彿
+ int sequence = 1;
if (maxOrderNo != null && !maxOrderNo.isEmpty()) {
- // 鎻愬彇娴佹按鍙烽儴鍒嗭紙鍋囪鏍煎紡涓� SC + 鏃ユ湡 + 娴佹按鍙凤級
String sequenceStr = maxOrderNo.substring(("SC" + datePrefix).length());
try {
sequence = Integer.parseInt(sequenceStr) + 1;
} catch (NumberFormatException e) {
- // 寮傚父鎯呭喌涓嬮噸缃负1
sequence = 1;
}
}
- // 鐢熸垚鏂拌鍗曞彿
return "SC" + datePrefix + String.format("%04d", sequence);
}
-
-
}
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java
index c5fbac0..dcdb6c1 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductProcessRouteItemServiceImpl.java
@@ -161,6 +161,8 @@
productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
productWorkOrder.setProductOrderId(productProcessRouteItem.getProductOrderId());
productWorkOrder.setPlanQuantity(productOrder.getQuantity());
+ // 鎵嬪姩鏂板宸ュ簭骞剁敓鎴愬伐鍗曟椂锛屽悓姝ュ伐搴忔姤宸ヤ汉鍒板伐鍗�
+ productWorkOrder.setReportUserIds(productProcessRouteItem.getReportUserIds());
productWorkOrder.setWorkOrderNo(workOrderNoStr);
productWorkOrder.setStatus(1);
productWorkOrderMapper.insert(productWorkOrder);
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductStructureServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductStructureServiceImpl.java
index 8a45d99..38c7300 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductStructureServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductStructureServiceImpl.java
@@ -2,6 +2,7 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.production.dto.ProductStructureDto;
import com.ruoyi.production.mapper.ProductStructureMapper;
import com.ruoyi.production.pojo.ProductStructure;
@@ -86,7 +87,7 @@
// 鐪熷疄鐨勭埗鑺傜偣 ID
Long realParentId;
for (ProductStructureDto psDto : flatDtoList) {
- if (psDto.getId() == null && psDto.getParentTempId() != null) {
+ if (psDto.getId() == null && StringUtils.isNotEmpty(psDto.getParentTempId())) {
ProductStructure child = tempEntityMap.get(psDto.getTempId());
if (tempEntityMap.containsKey(psDto.getParentTempId())) {
// 鐖惰妭鐐规槸鏂拌妭鐐�
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
index 4a68ce8..91d9639 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductWorkOrderServiceImpl.java
@@ -1,25 +1,22 @@
package com.ruoyi.production.service.impl;
-
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
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.deepoove.poi.XWPFTemplate;
-import com.deepoove.poi.config.Configure;
import com.deepoove.poi.data.PictureRenderData;
import com.deepoove.poi.data.Pictures;
-import com.ruoyi.common.utils.HackLoopTableRenderPolicy;
+import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.utils.MatrixToImageWriter;
+import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.production.dto.ProductWorkOrderDto;
import com.ruoyi.production.mapper.ProductWorkOrderFileMapper;
import com.ruoyi.production.mapper.ProductWorkOrderMapper;
import com.ruoyi.production.pojo.ProductWorkOrder;
import com.ruoyi.production.pojo.ProductWorkOrderFile;
import com.ruoyi.production.service.ProductWorkOrderService;
-import com.ruoyi.quality.pojo.QualityInspectParam;
-import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@@ -48,16 +45,26 @@
@Override
public IPage<ProductWorkOrderDto> listPage(Page<ProductWorkOrderDto> page, ProductWorkOrderDto productWorkOrder) {
- return productWorkOrdermapper.pageProductWorkOrder(page, productWorkOrder);
+ Long userId = SecurityUtils.getUserId();
+ boolean isAdmin = SecurityUtils.isAdmin(userId) || SecurityUtils.hasRole(Constants.SUPER_ADMIN);
+ return productWorkOrdermapper.pageProductWorkOrder(page, productWorkOrder, userId, isAdmin);
}
@Override
public int updateProductWorkOrder(ProductWorkOrderDto productWorkOrderDto) {
+ checkWorkOrderPermission(productWorkOrderDto.getId());
return productWorkOrdermapper.updateById(productWorkOrderDto);
}
@Override
+ public ProductWorkOrder getProductWorkOrderById(Long id) {
+ checkWorkOrderPermission(id);
+ return this.getById(id);
+ }
+
+ @Override
public void down(HttpServletResponse response, ProductWorkOrder productWorkOrder) {
+ checkWorkOrderPermission(productWorkOrder.getId());
ProductWorkOrderDto productWorkOrderDto = productWorkOrdermapper.getProductWorkOrderFlowCard(productWorkOrder.getId());
String codePath;
try {
@@ -65,13 +72,12 @@
} catch (Exception e) {
throw new RuntimeException(e);
}
- /*鑾峰彇闄勪欢鍥剧墖绫诲瀷*/
List<Map<String, Object>> images = new ArrayList<>();
List<ProductWorkOrderFile> productWorkOrderFiles = productWorkOrderFileMapper.selectList(Wrappers.<ProductWorkOrderFile>lambdaQuery().eq(ProductWorkOrderFile::getWorkOrderId, productWorkOrder.getId()));
if (CollectionUtils.isNotEmpty(productWorkOrderFiles)) {
productWorkOrderFiles.forEach(productWorkOrderFile -> {
Map<String, Object> image = new HashMap<>();
- PictureRenderData pictureRenderData = Pictures.ofLocal( productWorkOrderFile.getUrl()).sizeInCm(17, 20).create();
+ PictureRenderData pictureRenderData = Pictures.ofLocal(productWorkOrderFile.getUrl()).sizeInCm(17, 20).create();
image.put("url", pictureRenderData);
images.add(image);
});
@@ -92,16 +98,14 @@
put("actualStartTime", productWorkOrderDto.getActualStartTime());
put("actualEndTime", productWorkOrderDto.getActualEndTime());
put("twoCode", Pictures.ofLocal(codePath).create());
- put("images", images.isEmpty()?null:images);
+ put("images", images.isEmpty() ? null : images);
}});
try {
response.setContentType("application/msword");
- String fileName = URLEncoder.encode(
- "娴佽浆鍗�", "UTF-8");
+ String fileName = URLEncoder.encode("娴佽浆鍗�", "UTF-8");
response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
- response.setHeader("Content-disposition",
- "attachment;filename=" + fileName + ".docx");
+ response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".docx");
OutputStream os = response.getOutputStream();
template.write(os);
os.flush();
@@ -113,4 +117,18 @@
}
}
+ private void checkWorkOrderPermission(Long workOrderId) {
+ if (workOrderId == null) {
+ throw new RuntimeException("宸ュ崟ID涓嶈兘涓虹┖");
+ }
+ Long userId = SecurityUtils.getUserId();
+ boolean isAdmin = SecurityUtils.isAdmin(userId) || SecurityUtils.hasRole(Constants.SUPER_ADMIN);
+ if (isAdmin) {
+ return;
+ }
+ Integer count = productWorkOrdermapper.checkUserCanAccess(workOrderId, userId);
+ if (count == null || count == 0) {
+ throw new RuntimeException("鏃犳潈璁块棶璇ュ伐鍗�");
+ }
+ }
}
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 68b52cb..82fcdba 100644
--- a/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
+++ b/src/main/java/com/ruoyi/sales/service/impl/SalesLedgerProductServiceImpl.java
@@ -6,6 +6,10 @@
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.basic.mapper.ProductMapper;
+import com.ruoyi.basic.mapper.ProductModelMapper;
+import com.ruoyi.basic.pojo.Product;
+import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum;
import com.ruoyi.framework.web.domain.R;
@@ -62,6 +66,10 @@
private SalesLedgerMapper salesLedgerMapper;
private PurchaseLedgerMapper purchaseLedgerMapper;
+
+ private ProductMapper productMapper;
+
+ private ProductModelMapper productModelMapper;
private ProductOrderMapper productOrderMapper;
@@ -263,74 +271,103 @@
}
/**
+ * 閫氳繃浜у搧澶х被锛岃鏍煎瀷鍙锋煡璇roductModelId
+ */
+ public Long getProductModelId(String productCategory, String productSpecification) {
+ Product product = productMapper.selectOne(new QueryWrapper<Product>()
+ .lambda()
+ .eq(Product::getProductName, productCategory)
+ .orderByDesc(Product::getId)
+ .last("LIMIT 1"));
+ if(product == null){
+ throw new RuntimeException("璇峰厛娣诲姞浜у搧");
+ }
+ ProductModel productModel = productModelMapper.selectOne(new QueryWrapper<ProductModel>()
+ .lambda()
+ .eq(ProductModel::getProductId, product.getId())
+ .eq(ProductModel::getModel, productSpecification)
+ .orderByDesc(ProductModel::getId)
+ .last("LIMIT 1"));
+ return productModel == null ? null : productModel.getId();
+ }
+
+ /**
* 鏂板鐢熶骇鏁版嵁
*/
public void addProductionData(SalesLedgerProduct salesLedgerProduct) {
ProductOrder productOrder = new ProductOrder();
productOrder.setSalesLedgerId(salesLedgerProduct.getSalesLedgerId());
- productOrder.setProductModelId(salesLedgerProduct.getProductModelId());
+ if(salesLedgerProduct.getProductModelId() == null){
+ Long productModelId = getProductModelId(salesLedgerProduct.getProductCategory(), salesLedgerProduct.getSpecificationModel());
+ productOrder.setProductModelId(productModelId);
+ }else{
+ productOrder.setProductModelId(salesLedgerProduct.getProductModelId());
+ }
productOrder.setSaleLedgerProductId(salesLedgerProduct.getId());
String string = productOrderServiceImpl.generateNextOrderNo(LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd")));
productOrder.setNpsNo(string);
productOrder.setQuantity(salesLedgerProduct.getQuantity());//闇�姹傛暟閲�
productOrder.setCompleteQuantity(BigDecimal.ZERO);//瀹屾垚鏁伴噺
productOrderMapper.insert(productOrder);
-
- List<ProcessRoute> processRoutes = processRouteMapper.selectList(new QueryWrapper<ProcessRoute>().lambda()
- .eq(ProcessRoute::getProductModelId, salesLedgerProduct.getProductModelId())
- .orderByDesc(ProcessRoute::getCreateTime));
- if (processRoutes.size()>0){
- ProcessRoute processRoute = processRoutes.get(0);
- //鏂板鐢熶骇璁㈠崟宸ヨ壓璺嚎涓昏〃
- ProductProcessRoute productProcessRoute = new ProductProcessRoute();
- productProcessRoute.setProductModelId(processRoute.getProductModelId());
- productProcessRoute.setProcessRouteCode(processRoute.getProcessRouteCode());
- productProcessRoute.setProductOrderId(productOrder.getId());
- productProcessRoute.setBomId(processRoute.getBomId());
- productProcessRouteMapper.insert(productProcessRoute);
- //鏂板鐢熶骇璁㈠崟宸ヨ壓璺嚎瀛愯〃
- 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(processRouteItem.getProductModelId());
- productProcessRouteItem.setProcessId(processRouteItem.getProcessId());
- productProcessRouteItem.setProductOrderId(productOrder.getId());
- productProcessRouteItem.setProductRouteId(productProcessRoute.getId());
- productProcessRouteItem.setDragSort(processRouteItem.getDragSort());
- int insert = productProcessRouteItemMapper.insert(productProcessRouteItem);
- if (insert > 0) {
- // 鏌ヨ浠婃棩宸插瓨鍦ㄧ殑鏈�澶у伐鍗曞彿
- ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectMax(datePrefix);
- 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 ="GD"+ String.format("%s%03d", datePrefix, sequenceNumber);
- ProductWorkOrder productWorkOrder = new ProductWorkOrder();
- productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
- productWorkOrder.setProductOrderId(productOrder.getId());
- productWorkOrder.setPlanQuantity(salesLedgerProduct.getQuantity());
- productWorkOrder.setWorkOrderNo(workOrderNoStr);
- productWorkOrder.setStatus(1);
-
- productWorkOrderMapper.insert(productWorkOrder);
- }
-
- }
- productOrder.setRouteId(processRoute.getId());
- productOrderMapper.updateById(productOrder);
- }
+ // 鍙栨秷榛樿鐨勫伐鑹鸿矾绾�
+// List<ProcessRoute> processRoutes = processRouteMapper.selectList(
+// new QueryWrapper<ProcessRoute>()
+// .and(wrapper -> wrapper.eq("product_model_id", salesLedgerProduct.getProductModelId())
+// .or()
+// .apply("find_in_set({0}, product_model_ids)", salesLedgerProduct.getProductModelId()))
+// .orderByDesc("create_time"));
+// if (processRoutes.size()>0){
+// ProcessRoute processRoute = processRoutes.get(0);
+// //鏂板鐢熶骇璁㈠崟宸ヨ壓璺嚎涓昏〃
+// ProductProcessRoute productProcessRoute = new ProductProcessRoute();
+// productProcessRoute.setProductModelId(salesLedgerProduct.getProductModelId());
+// productProcessRoute.setProcessRouteCode(processRoute.getProcessRouteCode());
+// productProcessRoute.setProductOrderId(productOrder.getId());
+// productProcessRoute.setBomId(processRoute.getBomId());
+// productProcessRouteMapper.insert(productProcessRoute);
+// //鏂板鐢熶骇璁㈠崟宸ヨ壓璺嚎瀛愯〃
+// 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(salesLedgerProduct.getProductModelId());
+// productProcessRouteItem.setProcessId(processRouteItem.getProcessId());
+// productProcessRouteItem.setProductOrderId(productOrder.getId());
+// productProcessRouteItem.setProductRouteId(productProcessRoute.getId());
+// productProcessRouteItem.setDragSort(processRouteItem.getDragSort());
+// int insert = productProcessRouteItemMapper.insert(productProcessRouteItem);
+// if (insert > 0) {
+// // 鏌ヨ浠婃棩宸插瓨鍦ㄧ殑鏈�澶у伐鍗曞彿
+// ProductWorkOrder lastWorkOrder = productWorkOrderMapper.selectMax(datePrefix);
+// 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 ="GD"+ String.format("%s%03d", datePrefix, sequenceNumber);
+// ProductWorkOrder productWorkOrder = new ProductWorkOrder();
+// productWorkOrder.setProductProcessRouteItemId(productProcessRouteItem.getId());
+// productWorkOrder.setProductOrderId(productOrder.getId());
+// productWorkOrder.setPlanQuantity(salesLedgerProduct.getQuantity());
+// productWorkOrder.setWorkOrderNo(workOrderNoStr);
+// productWorkOrder.setStatus(1);
+//
+// productWorkOrderMapper.insert(productWorkOrder);
+// }
+//
+// }
+// productOrder.setRouteId(processRoute.getId());
+// productOrderMapper.updateById(productOrder);
+// }
}
/**
@@ -491,7 +528,13 @@
@Override
public R judgmentInventory(SalesLedgerProduct salesLedgerProduct) {
//鑾峰彇浜у搧鏈�鏂扮殑宸ヨ壓璺嚎
- ProcessRoute processRoute = processRouteMapper.selectOne(new QueryWrapper<ProcessRoute>().lambda().eq(ProcessRoute::getProductModelId, salesLedgerProduct.getProductModelId()).orderByDesc(ProcessRoute::getCreateTime).last("LIMIT 1"));
+ ProcessRoute processRoute = processRouteMapper.selectOne(
+ new QueryWrapper<ProcessRoute>()
+ .and(wrapper -> wrapper.eq("product_model_id", salesLedgerProduct.getProductModelId())
+ .or()
+ .apply("find_in_set({0}, product_model_ids)", salesLedgerProduct.getProductModelId()))
+ .orderByDesc("create_time")
+ .last("LIMIT 1"));
if (processRoute == null) {
return R.fail("璇峰厛璁剧疆宸ヨ壓璺嚎");
}
diff --git a/src/main/resources/mapper/production/ProcessRouteItemMapper.xml b/src/main/resources/mapper/production/ProcessRouteItemMapper.xml
index 1b5e2b4..a4d62ba 100644
--- a/src/main/resources/mapper/production/ProcessRouteItemMapper.xml
+++ b/src/main/resources/mapper/production/ProcessRouteItemMapper.xml
@@ -1,5 +1,5 @@
-<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
- "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+锘�<?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.ProcessRouteItemMapper">
<resultMap id="basicMap" type="com.ruoyi.production.pojo.ProcessRouteItem">
@@ -7,29 +7,84 @@
<result property="routeId" column="route_id"/>
<result property="processId" column="process_id"/>
<result property="productModelId" column="product_model_id"/>
+ <result property="productModelIds" column="product_model_ids"/>
<result property="tenantId" column="tenant_id"/>
<result property="createTime" column="create_time"/>
<result property="updateTime" column="update_time"/>
<result property="dragSort" column="drag_sort"/>
+ <result property="isQuality" column="is_quality"/>
</resultMap>
<select id="listProcessRouteItemDto" resultType="com.ruoyi.production.dto.ProcessRouteItemDto">
select pri.*,
- pr.description ,
+ pr.description as route_name,
pp.name as process_name,
- pm.speculative_trading_name,
- pm.product_id,
- pm.model,
- p.product_name,
- pm.unit
- from
- process_route_item pri
- left join product_model pm on pri.product_model_id = pm.id
- left join product_process pp on pp.id = pri.process_id
- left join product p on p.id = pm.product_id
- left join process_route pr on pr.id = pri.route_id
- where
- pri.route_id = #{c.routeId}
+ t.speculative_trading_name,
+ t.product_id,
+ t.model,
+ t.product_name,
+ t.unit
+ from process_route_item pri
+ left join product_process pp on pp.id = pri.process_id
+ left join process_route pr on pr.id = pri.route_id
+ left join (
+ select item.id as item_id,
+ group_concat(
+ distinct pm.speculative_trading_name
+ order by
+ case
+ when item.product_model_ids is null or item.product_model_ids = '' then pm.id
+ else find_in_set(pm.id, item.product_model_ids)
+ end
+ separator ','
+ ) as speculative_trading_name,
+ max(pm.product_id) as product_id,
+ group_concat(
+ distinct pm.model
+ order by
+ case
+ when item.product_model_ids is null or item.product_model_ids = '' then pm.id
+ else find_in_set(pm.id, item.product_model_ids)
+ end
+ separator ','
+ ) as model,
+ group_concat(
+ distinct p.product_name
+ order by
+ case
+ when item.product_model_ids is null or item.product_model_ids = '' then pm.id
+ else find_in_set(pm.id, item.product_model_ids)
+ end
+ separator ','
+ ) as product_name,
+ group_concat(
+ distinct pm.unit
+ order by
+ case
+ when item.product_model_ids is null or item.product_model_ids = '' then pm.id
+ else find_in_set(pm.id, item.product_model_ids)
+ end
+ separator ','
+ ) as unit
+ from process_route_item item
+ left join product_model pm
+ on (find_in_set(pm.id, item.product_model_ids) > 0
+ or ((item.product_model_ids is null or item.product_model_ids = '') and pm.id = item.product_model_id))
+ left join product p on p.id = pm.product_id
+ group by item.id
+ ) t on t.item_id = pri.id
+ where pri.route_id = #{c.routeId}
+ <if test="c.productModelId != null">
+ and exists (
+ select 1
+ from product_model pm_filter
+ where (
+ find_in_set(pm_filter.id, pri.product_model_ids) > 0
+ or ((pri.product_model_ids is null or pri.product_model_ids = '') and pm_filter.id = pri.product_model_id)
+ )
+ and pm_filter.id = #{c.productModelId}
+ )
+ </if>
order by pri.drag_sort
</select>
</mapper>
diff --git a/src/main/resources/mapper/production/ProcessRouteMapper.xml b/src/main/resources/mapper/production/ProcessRouteMapper.xml
index 51c11b4..4a12183 100644
--- a/src/main/resources/mapper/production/ProcessRouteMapper.xml
+++ b/src/main/resources/mapper/production/ProcessRouteMapper.xml
@@ -1,26 +1,58 @@
-<?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">
+锘�<?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.ProcessRouteMapper">
-
<resultMap id="basicMap" type="com.ruoyi.production.pojo.ProcessRoute">
- <id property="id" column="id"/>
- <result property="productModelId" column="product_model_id"/>
- <result property="description" column="description"/>
- <result property="tenantId" column="tenant_id"/>
- <result property="createTime" column="create_time"/>
- <result property="updateTime" column="update_time"/>
+ <id property="id" column="id"/>
+ <result property="productModelId" column="product_model_id"/>
+ <result property="productModelIds" column="product_model_ids"/>
+ <result property="description" column="description"/>
+ <result property="tenantId" column="tenant_id"/>
+ <result property="createTime" column="create_time"/>
+ <result property="updateTime" column="update_time"/>
+ <result property="processRouteCode" column="process_route_code"/>
+ <result property="bomId" column="bom_id"/>
</resultMap>
<select id="pageProcessRouteDto" resultType="com.ruoyi.production.dto.ProcessRouteDto">
- select ps.*, p.product_name,pm.product_id,pm.model,pb.bom_no
+ select ps.*,
+ t.product_name,
+ t.product_id,
+ t.model,
+ pb.bom_no
from process_route ps
left join product_bom pb on ps.bom_id = pb.id
- left join product_model pm on ps.product_model_id = pm.id
- left join product p on pm.product_id = p.id
+ left join (
+ select pr.id as route_id,
+ group_concat(
+ distinct p.product_name
+ order by
+ case
+ when pr.product_model_ids is null or pr.product_model_ids = '' then pm.id
+ else find_in_set(pm.id, pr.product_model_ids)
+ end
+ separator ','
+ ) as product_name,
+ max(pm.product_id) as product_id,
+ group_concat(
+ distinct pm.model
+ order by
+ case
+ when pr.product_model_ids is null or pr.product_model_ids = '' then pm.id
+ else find_in_set(pm.id, pr.product_model_ids)
+ end
+ separator ','
+ ) as model
+ from process_route pr
+ left join product_model pm
+ on (find_in_set(pm.id, pr.product_model_ids) > 0
+ or ((pr.product_model_ids is null or pr.product_model_ids = '') and pm.id = pr.product_model_id))
+ left join product p on pm.product_id = p.id
+ group by pr.id
+ ) t on t.route_id = ps.id
<where>
<if test="c.model != null and c.model != ''">
- and pm.model like concat('%',#{c.model},'%')
+ and t.model like concat('%',#{c.model},'%')
</if>
</where>
order by ps.id asc
diff --git a/src/main/resources/mapper/production/ProductOrderMapper.xml b/src/main/resources/mapper/production/ProductOrderMapper.xml
index 6b993bf..3fcec90 100644
--- a/src/main/resources/mapper/production/ProductOrderMapper.xml
+++ b/src/main/resources/mapper/production/ProductOrderMapper.xml
@@ -63,6 +63,14 @@
<if test="c.startTime != null and c.endTime != null">
and po.create_time between #{c.startTime} and #{c.endTime}
</if>
+ <if test="isAdmin == false">
+ and exists (
+ select 1
+ from product_work_order pwo_auth
+ where pwo_auth.product_order_id = po.id
+ and find_in_set(#{userId}, pwo_auth.report_user_ids)
+ )
+ </if>
</where>
</select>
<select id="listProcessRoute" resultType="com.ruoyi.production.pojo.ProcessRoute">
diff --git a/src/main/resources/mapper/production/ProductWorkOrderMapper.xml b/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
index 14b883e..b026862 100644
--- a/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
+++ b/src/main/resources/mapper/production/ProductWorkOrderMapper.xml
@@ -21,11 +21,18 @@
<select id="pageProductWorkOrder" resultType="com.ruoyi.production.dto.ProductWorkOrderDto">
SELECT
pwo.*,
+ pwo.report_user_ids,
pp.NAME as processName,
pm.model,
pm.unit,
p.product_name AS productName,
po.nps_no AS productOrderNpsNo,
+ (
+ SELECT GROUP_CONCAT(COALESCE(NULLIF(su.nick_name, ''), su.user_name)
+ ORDER BY FIND_IN_SET(su.user_id, pwo.report_user_ids) SEPARATOR ',')
+ FROM sys_user su
+ WHERE FIND_IN_SET(su.user_id, pwo.report_user_ids)
+ ) AS reportUserNames,
ROUND(pwo.complete_quantity / pwo.plan_quantity * 100, 2) AS completionStatus,
CASE
WHEN pwo.work_order_no LIKE 'FG%' THEN '杩斿伐杩斾慨'
@@ -48,6 +55,15 @@
<if test="c.productOrderId != null and c.productOrderId != ''">
and pwo.product_order_id = #{c.productOrderId}
</if>
+ <if test="isAdmin == false">
+ and find_in_set(#{userId}, pwo.report_user_ids)
+ </if>
+ </select>
+ <select id="checkUserCanAccess" resultType="java.lang.Integer">
+ SELECT COUNT(1)
+ FROM product_work_order pwo
+ WHERE pwo.id = #{workOrderId}
+ AND find_in_set(#{userId}, pwo.report_user_ids)
</select>
<select id="getProductWorkOrderFlowCard" resultType="com.ruoyi.production.dto.ProductWorkOrderDto">
SELECT
--
Gitblit v1.9.3