From 2ee9e158e3129070f6b1fd953da1540f05d4f2b0 Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期五, 10 七月 2026 18:04:50 +0800
Subject: [PATCH] 修改报工
---
src/main/java/com/ruoyi/production/service/impl/ProductionAccountServiceImpl.java | 135 +++++++++++
src/main/java/com/ruoyi/common/enums/TypeEnums.java | 3
src/main/java/com/ruoyi/quality/pojo/QualityUnqualified.java | 18 +
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java | 207 +++++++++++++++++
src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml | 8
src/main/resources/mapper/stock/StockInventoryMapper.xml | 2
src/main/java/com/ruoyi/approve/service/ApprovalTemplateService.java | 2
src/main/java/com/ruoyi/production/bean/dto/ProductionProductMainDto.java | 9
src/main/java/com/ruoyi/production/pojo/ProductionAccount.java | 15 +
src/main/java/com/ruoyi/production/controller/ProductionAccountController.java | 14 +
src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java | 28 ++
src/main/java/com/ruoyi/production/controller/ProductionProductMainController.java | 7
doc/sql/天津玮苓乐器.sql | 15 +
src/main/java/com/ruoyi/approve/service/impl/ApprovalTemplateServiceImpl.java | 19 +
src/main/java/com/ruoyi/production/service/ProductionProductMainService.java | 2
src/main/java/com/ruoyi/production/service/ProductionAccountService.java | 4
src/main/java/com/ruoyi/quality/controller/QualityUnqualifiedController.java | 39 +++
src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java | 22 +
src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java | 12 +
src/main/java/com/ruoyi/production/bean/vo/ProductionAccountVo.java | 18 +
src/main/resources/mapper/production/ProductionProductMainMapper.xml | 43 +++
src/main/resources/mapper/production/ProductionAccountMapper.xml | 41 ++
src/main/java/com/ruoyi/production/bean/dto/ProductionAccountDto.java | 16 +
23 files changed, 663 insertions(+), 16 deletions(-)
diff --git "a/doc/sql/\345\244\251\346\264\245\347\216\256\350\213\223\344\271\220\345\231\250.sql" "b/doc/sql/\345\244\251\346\264\245\347\216\256\350\213\223\344\271\220\345\231\250.sql"
new file mode 100644
index 0000000..d9ad285
--- /dev/null
+++ "b/doc/sql/\345\244\251\346\264\245\347\216\256\350\213\223\344\271\220\345\231\250.sql"
@@ -0,0 +1,15 @@
+ALTER TABLE `production_product_main`
+ ADD COLUMN `report_type` int NULL DEFAULT 0 COMMENT '鎶ュ伐缁撴灉绫诲瀷锛�0鍚堟牸锛�1杞诲井杩斿伐锛�2涓ラ噸杩斿伐锛�3鎶ュ簾' AFTER `status`,
+ADD COLUMN `audit_status` int NULL DEFAULT 0 COMMENT '瀹℃牳鐘舵�侊細0寰呭鏍革紝1瀹℃牳閫氳繃锛�2瀹℃牳涓嶉�氳繃' AFTER `report_type`,
+ADD COLUMN `audit_remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '瀹℃牳鎰忚' AFTER `audit_status`;
+
+
+ALTER TABLE `production_account`
+ ADD COLUMN `adjust_amount` decimal(18,2) NULL DEFAULT NULL COMMENT '宸ヨ祫淇閲戦' AFTER `technology_operation_name`,
+ ADD COLUMN `adjust_remark` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '宸ヨ祫淇璇存槑' AFTER `adjust_amount`,
+ ADD COLUMN `adjust_user` bigint NULL DEFAULT NULL COMMENT '淇浜�' AFTER `adjust_remark`,
+ ADD COLUMN `adjust_time` datetime NULL DEFAULT NULL COMMENT '淇鏃堕棿' AFTER `adjust_user`,
+ ADD COLUMN `accounting_batch_no` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '鏍哥畻鎵规鍙�' AFTER `adjust_time`;
+
+ALTER TABLE `quality_unqualified`
+ ADD COLUMN `photo_urls` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL COMMENT '涓嶅悎鏍煎浘鐗�' AFTER `deal_result`;
diff --git a/src/main/java/com/ruoyi/approve/service/ApprovalTemplateService.java b/src/main/java/com/ruoyi/approve/service/ApprovalTemplateService.java
index 38bbabc..21cf00a 100644
--- a/src/main/java/com/ruoyi/approve/service/ApprovalTemplateService.java
+++ b/src/main/java/com/ruoyi/approve/service/ApprovalTemplateService.java
@@ -31,4 +31,6 @@
ApprovalTemplateVo getApprovalTemplateVoById(Long id);
+ ApprovalTemplateVo getEnabledTemplateByBusinessType(Long businessType);
+
}
diff --git a/src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java
index 64a2eb3..13cad8b 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java
@@ -31,6 +31,8 @@
import com.ruoyi.framework.security.LoginUser;
import com.ruoyi.framework.web.domain.R;
import com.ruoyi.procurementrecord.utils.StockUtils;
+import com.ruoyi.production.mapper.ProductionProductMainMapper;
+import com.ruoyi.production.pojo.ProductionProductMain;
import com.ruoyi.project.system.domain.SysDept;
import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.project.system.mapper.SysDeptMapper;
@@ -94,6 +96,7 @@
private final EnterpriseNewsMapper enterpriseNewsMapper;
private final EnterpriseNewsScopeDeptMapper enterpriseNewsScopeDeptMapper;
private final ApprovalTemplateNodeApproverMapper approvalTemplateNodeApproverMapper;
+ private final ProductionProductMainMapper productionProductMainMapper;
@Override
public R listPage(Page<ApprovalInstanceVo> page, ApprovalInstanceDto approvalInstanceDto) {
@@ -550,6 +553,10 @@
}
if (TypeEnums.ENTERPRISE_NEWS_APPROVAL.getCode().equals(businessType)) {
handleNewsApprovalFinished(instance, status);
+ return;
+ }
+ if (TypeEnums.PRODUCTION_REPORT_APPROVAL.getCode().equals(businessType)) {
+ handleProductionReportApprovalFinished(instance, status);
}
}
@@ -691,6 +698,27 @@
shippingInfoMapper.updateById(shippingInfo);
}
+ private void handleProductionReportApprovalFinished(ApprovalInstance instance, String status) {
+ if (instance == null || instance.getBusinessId() == null) {
+ return;
+ }
+ ProductionProductMain productionProductMain = productionProductMainMapper.selectById(instance.getBusinessId());
+ if (productionProductMain == null) {
+ return;
+ }
+
+ if ("APPROVED".equals(status)) {
+ productionProductMain.setAuditStatus(1);
+ } else if ("REJECTED".equals(status)) {
+ productionProductMain.setAuditStatus(2);
+ } else if ("PENDING".equals(status)) {
+ productionProductMain.setAuditStatus(0);
+ } else {
+ return;
+ }
+ productionProductMainMapper.updateById(productionProductMain);
+ }
+
private List<ApprovalTask> createNodeAndTasks(ApprovalInstance instance, ApprovalTemplateNode templateNode) {
List<ApprovalTemplateNodeApprover> approvers = approvalTemplateNodeApproverMapper.selectList(
new LambdaQueryWrapper<ApprovalTemplateNodeApprover>()
diff --git a/src/main/java/com/ruoyi/approve/service/impl/ApprovalTemplateServiceImpl.java b/src/main/java/com/ruoyi/approve/service/impl/ApprovalTemplateServiceImpl.java
index a0b07d5..43680f9 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApprovalTemplateServiceImpl.java
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApprovalTemplateServiceImpl.java
@@ -183,6 +183,25 @@
return buildTemplateVo(template, nodeMap, approverMap);
}
+ @Override
+ public ApprovalTemplateVo getEnabledTemplateByBusinessType(Long businessType) {
+ if (businessType == null) {
+ return null;
+ }
+ ApprovalTemplate template = this.getOne(
+ new LambdaQueryWrapper<ApprovalTemplate>()
+ .eq(ApprovalTemplate::getDeleted, 0)
+ .eq(ApprovalTemplate::getEnabled, 1)
+ .eq(ApprovalTemplate::getBusinessType, businessType)
+ .orderByDesc(ApprovalTemplate::getId)
+ .last("limit 1")
+ );
+ if (template == null) {
+ return null;
+ }
+ return getApprovalTemplateVoById(template.getId());
+ }
+
/**
* 鎵归噺濉厖妯℃澘鑺傜偣鍙婅妭鐐瑰鎵逛汉锛岄伩鍏嶅惊鐜煡搴撱��
*/
diff --git a/src/main/java/com/ruoyi/common/enums/TypeEnums.java b/src/main/java/com/ruoyi/common/enums/TypeEnums.java
index ba1c1f3..0e1fbc5 100644
--- a/src/main/java/com/ruoyi/common/enums/TypeEnums.java
+++ b/src/main/java/com/ruoyi/common/enums/TypeEnums.java
@@ -24,7 +24,8 @@
OVERTIME_APPROVAL(15L, "鍔犵彮瀹℃壒"),
TRAVEL_REIMBURSEMENT_APPROVAL(16L, "鍑哄樊鎶ラ攢瀹℃壒"),
EXPENSE_APPROVAL(17L, "璐圭敤瀹℃壒"),
- ENTERPRISE_NEWS_APPROVAL(18L, "浼佷笟鏂伴椈瀹℃壒");
+ ENTERPRISE_NEWS_APPROVAL(18L, "浼佷笟鏂伴椈瀹℃壒"),
+ PRODUCTION_REPORT_APPROVAL(19L, "鎶ュ伐瀹℃壒");
diff --git a/src/main/java/com/ruoyi/production/bean/dto/ProductionAccountDto.java b/src/main/java/com/ruoyi/production/bean/dto/ProductionAccountDto.java
index 5bd2fd1..a72f7cb 100644
--- a/src/main/java/com/ruoyi/production/bean/dto/ProductionAccountDto.java
+++ b/src/main/java/com/ruoyi/production/bean/dto/ProductionAccountDto.java
@@ -6,6 +6,7 @@
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
+import java.math.BigDecimal;
import java.time.LocalDate;
@Data
@@ -39,6 +40,21 @@
@Schema(description = "宸ュ簭")
private String process;
+ @Schema(description = "宸ヨ祫淇閲戦")
+ private BigDecimal adjustAmount;
+
+ @Schema(description = "宸ヨ祫淇璇存槑")
+ private String adjustRemark;
+
+ @Schema(description = "淇浜�")
+ private Long adjustUser;
+
+ @Schema(description = "鎶ュ伐缁撴灉绫诲瀷锛�0鍚堟牸锛�1杞诲井杩斿伐锛�2涓ラ噸杩斿伐锛�3鎶ュ簾")
+ private Integer reportType;
+
+ @Schema(description = "瀹℃牳鐘舵�侊細0寰呭鏍革紝1瀹℃牳閫氳繃锛�2瀹℃牳涓嶉�氳繃")
+ private Integer auditStatus;
+
@Schema(description = "鏃ユ湡绫诲瀷锛堟寜澶�/鎸夋湀锛�")
private String dateType;
diff --git a/src/main/java/com/ruoyi/production/bean/dto/ProductionProductMainDto.java b/src/main/java/com/ruoyi/production/bean/dto/ProductionProductMainDto.java
index cbac4b5..0879617 100644
--- a/src/main/java/com/ruoyi/production/bean/dto/ProductionProductMainDto.java
+++ b/src/main/java/com/ruoyi/production/bean/dto/ProductionProductMainDto.java
@@ -21,6 +21,15 @@
@Schema(description = "鎶ュ伐ID")
private Long productMainId;
+ @Schema(description = "鎶ュ伐缁撴灉绫诲瀷锛�0鍚堟牸锛�1杞诲井杩斿伐锛�2涓ラ噸杩斿伐锛�3鎶ュ簾")
+ private Integer reportType;
+
+ @Schema(description = "瀹℃牳鐘舵�侊細0寰呭鏍革紝1瀹℃牳閫氳繃锛�2瀹℃牳涓嶉�氳繃")
+ private Integer auditStatus;
+
+ @Schema(description = "瀹℃牳鎰忚")
+ private String auditRemark;
+
@Schema(description = "绉熸埛ID")
private Long tenantId;
diff --git a/src/main/java/com/ruoyi/production/bean/vo/ProductionAccountVo.java b/src/main/java/com/ruoyi/production/bean/vo/ProductionAccountVo.java
index 68bcb23..1338d84 100644
--- a/src/main/java/com/ruoyi/production/bean/vo/ProductionAccountVo.java
+++ b/src/main/java/com/ruoyi/production/bean/vo/ProductionAccountVo.java
@@ -11,6 +11,15 @@
@Schema(name = "ProductionAccountVo", description = "鐢熶骇鏍哥畻鍒嗛〉缁撴灉")
public class ProductionAccountVo {
+ @Schema(description = "鎶ュ伐鍗曞彿")
+ private String reportNo;
+
+ @Schema(description = "瀹℃牳鐘舵��")
+ private String auditStatusName;
+
+ @Schema(description = "鎶ュ伐绫诲瀷")
+ private String reportTypeName;
+
@Schema(description = "瀹㈡埛鍚堝悓鍙�")
private String customerContractNo;
@@ -35,6 +44,9 @@
@Schema(description = "鎺掍骇浜哄憳鍚嶇О")
private String schedulingUserName;
+ @Schema(description = "宸ュ崟缂栧彿")
+ private String workOrderNo;
+
@Schema(description = "宸ヨ祫")
private BigDecimal wages;
@@ -44,6 +56,12 @@
@Schema(description = "宸ヨ祫瀹氶")
private BigDecimal workHours;
+ @Schema(description = "宸ヨ祫淇閲戦")
+ private BigDecimal adjustAmount;
+
+ @Schema(description = "宸ヨ祫淇璇存槑")
+ private String adjustRemark;
+
@Schema(description = "宸ユ椂")
private BigDecimal workHour;
diff --git a/src/main/java/com/ruoyi/production/controller/ProductionAccountController.java b/src/main/java/com/ruoyi/production/controller/ProductionAccountController.java
index d87996f..f1695c8 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductionAccountController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductionAccountController.java
@@ -10,9 +10,11 @@
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.bind.annotation.RequestBody;
/**
* <p>
@@ -38,4 +40,16 @@
public R<IPage<ProductionProductMainDto>> listProductionDetails(ProductionAccountDto productionAccountDto, Page page) {
return R.ok(productionAccountService.listProductionDetails(productionAccountDto,page));
}
+
+ @PostMapping("/batchAccounting")
+ @Operation(summary = "鎵归噺鏍哥畻")
+ public R<Boolean> batchAccounting(@RequestBody ProductionAccountDto dto) {
+ return R.ok(productionAccountService.batchAccounting(dto));
+ }
+
+ @PostMapping("/singleAdjust")
+ @Operation(summary = "鍗曚釜淇")
+ public R<Boolean> singleAdjust(@RequestBody ProductionAccountDto dto) {
+ return R.ok(productionAccountService.singleAdjust(dto));
+ }
}
diff --git a/src/main/java/com/ruoyi/production/controller/ProductionProductMainController.java b/src/main/java/com/ruoyi/production/controller/ProductionProductMainController.java
index 926a59f..0d542e3 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductionProductMainController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductionProductMainController.java
@@ -80,6 +80,13 @@
return R.ok(productionProductMainService.removeProductMain(id));
}
+ @PostMapping("/audit")
+ @Operation(summary = "瀹℃牳鐢熶骇鎶ュ伐")
+ @PreAuthorize("@ss.hasPermi('productionProductMain:audit')")
+ public R audit(@RequestBody ProductionProductMainDto productionProductMainDto) {
+ return R.ok(productionProductMainService.auditProductMain(productionProductMainDto));
+ }
+
/**
* 瀵煎嚭
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionAccount.java b/src/main/java/com/ruoyi/production/pojo/ProductionAccount.java
index c53f138..ec164a4 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductionAccount.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionAccount.java
@@ -45,6 +45,21 @@
@Schema(description = "宸ュ簭鍚嶇О")
private String technologyOperationName;
+ @Schema(description = "宸ヨ祫淇閲戦")
+ private BigDecimal adjustAmount;
+
+ @Schema(description = "宸ヨ祫淇璇存槑")
+ private String adjustRemark;
+
+ @Schema(description = "淇浜�")
+ private Long adjustUser;
+
+ @Schema(description = "淇鏃堕棿")
+ private LocalDateTime adjustTime;
+
+ @Schema(description = "鏍哥畻鎵规鍙�")
+ private String accountingBatchNo;
+
@Schema(description = "鐢熶骇鏃ユ湡")
private LocalDateTime schedulingDate;
diff --git a/src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java b/src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
index 9de89fb..c485cd0 100644
--- a/src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
+++ b/src/main/java/com/ruoyi/production/pojo/ProductionProductMain.java
@@ -33,6 +33,18 @@
@Schema(description = "鎶ュ伐鐘舵��")
private Integer status;
+ @Schema(description = "鎶ュ伐缁撴灉绫诲瀷锛�0鍚堟牸锛�1杞诲井杩斿伐锛�2涓ラ噸杩斿伐锛�3鎶ュ簾")
+ @TableField("report_type")
+ private Integer reportType;
+
+ @Schema(description = "瀹℃牳鐘舵�侊細0寰呭鏍革紝1瀹℃牳閫氳繃锛�2瀹℃牳涓嶉�氳繃")
+ @TableField("audit_status")
+ private Integer auditStatus;
+
+ @Schema(description = "瀹℃牳鎰忚")
+ @TableField("audit_remark")
+ private String auditRemark;
+
@Schema(description = "鍒涘缓鏃堕棿")
@TableField(fill = FieldFill.INSERT)
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
diff --git a/src/main/java/com/ruoyi/production/service/ProductionAccountService.java b/src/main/java/com/ruoyi/production/service/ProductionAccountService.java
index a02c3a4..b5b56db 100644
--- a/src/main/java/com/ruoyi/production/service/ProductionAccountService.java
+++ b/src/main/java/com/ruoyi/production/service/ProductionAccountService.java
@@ -20,4 +20,8 @@
IPage<ProductionAccountVo> listPage(Page<ProductionAccountDto> page, ProductionAccountDto dto);
IPage<ProductionProductMainDto> listProductionDetails(ProductionAccountDto productionAccountDto, Page page);
+
+ Boolean batchAccounting(ProductionAccountDto dto);
+
+ Boolean singleAdjust(ProductionAccountDto dto);
}
diff --git a/src/main/java/com/ruoyi/production/service/ProductionProductMainService.java b/src/main/java/com/ruoyi/production/service/ProductionProductMainService.java
index 6a07d2b..269496d 100644
--- a/src/main/java/com/ruoyi/production/service/ProductionProductMainService.java
+++ b/src/main/java/com/ruoyi/production/service/ProductionProductMainService.java
@@ -22,5 +22,7 @@
Boolean removeProductMain(Long id);
+ Boolean auditProductMain(ProductionProductMainDto productionProductMainDto);
+
ArrayList<Long> listMain(List<Long> idList);
}
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionAccountServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionAccountServiceImpl.java
index c35c757..cd9e476 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionAccountServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionAccountServiceImpl.java
@@ -1,19 +1,39 @@
package com.ruoyi.production.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.production.bean.dto.ProductionAccountDto;
import com.ruoyi.production.bean.dto.ProductionProductMainDto;
import com.ruoyi.production.bean.vo.ProductionAccountVo;
import com.ruoyi.production.mapper.ProductionAccountMapper;
+import com.ruoyi.production.mapper.ProductionOperationTaskMapper;
+import com.ruoyi.production.mapper.ProductionOrderRoutingOperationMapper;
import com.ruoyi.production.mapper.ProductionProductMainMapper;
+import com.ruoyi.production.mapper.ProductionProductOutputMapper;
import com.ruoyi.production.pojo.ProductionAccount;
+import com.ruoyi.production.pojo.ProductionOperationTask;
+import com.ruoyi.production.pojo.ProductionOrderRoutingOperation;
+import com.ruoyi.production.pojo.ProductionProductMain;
+import com.ruoyi.production.pojo.ProductionProductOutput;
+import com.ruoyi.technology.mapper.TechnologyOperationMapper;
+import com.ruoyi.technology.mapper.TechnologyRoutingOperationMapper;
+import com.ruoyi.technology.pojo.TechnologyOperation;
+import com.ruoyi.technology.pojo.TechnologyRoutingOperation;
+import com.ruoyi.project.system.mapper.SysUserMapper;
+import com.ruoyi.project.system.domain.SysUser;
import com.ruoyi.production.service.ProductionAccountService;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.ruoyi.common.exception.ServiceException;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import java.math.BigDecimal;
import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.List;
@Service
@RequiredArgsConstructor
@@ -21,6 +41,12 @@
private final ProductionProductMainMapper productionProductMainMapper;
+ private final ProductionProductOutputMapper productionProductOutputMapper;
+ private final ProductionOperationTaskMapper productionOperationTaskMapper;
+ private final ProductionOrderRoutingOperationMapper productionOrderRoutingOperationMapper;
+ private final TechnologyRoutingOperationMapper technologyRoutingOperationMapper;
+ private final TechnologyOperationMapper technologyOperationMapper;
+ private final SysUserMapper sysUserMapper;
@Override
public IPage<ProductionAccountVo> listPage(Page<ProductionAccountDto> page, ProductionAccountDto dto) {
@@ -32,7 +58,114 @@
@Override
public IPage<ProductionProductMainDto> listProductionDetails(ProductionAccountDto dto, Page page) {
// 鏌ヨ鐢熶骇鏍哥畻鏄庣粏
- return productionProductMainMapper.listProductionDetails(normalizeDateQuery(dto), page);
+ ProductionAccountDto queryDto = normalizeDateQuery(dto);
+ if (queryDto.getAuditStatus() == null) {
+ queryDto.setAuditStatus(1);
+ }
+ if (queryDto.getReportType() == null) {
+ queryDto.setReportType(0);
+ }
+ return productionProductMainMapper.listProductionDetails(queryDto, page);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public Boolean batchAccounting(ProductionAccountDto dto) {
+ ProductionAccountDto queryDto = normalizeDateQuery(dto);
+ LambdaQueryWrapper<ProductionProductMain> queryWrapper = Wrappers.<ProductionProductMain>lambdaQuery()
+ .eq(ProductionProductMain::getAuditStatus, 1)
+ .eq(ProductionProductMain::getReportType, 0);
+ if (queryDto.getSchedulingUserId() != null) {
+ queryWrapper.eq(ProductionProductMain::getUserId, queryDto.getSchedulingUserId());
+ }
+ if (queryDto.getSchedulingUserName() != null && !queryDto.getSchedulingUserName().isEmpty()) {
+ queryWrapper.like(ProductionProductMain::getUserName, queryDto.getSchedulingUserName());
+ }
+ if (queryDto.getEntryDate() != null) {
+ queryWrapper.apply("date(create_time) = {0}", queryDto.getEntryDate());
+ }
+ if (queryDto.getEntryDateStart() != null) {
+ queryWrapper.ge(ProductionProductMain::getCreateTime, queryDto.getEntryDateStart().atStartOfDay());
+ }
+ if (queryDto.getEntryDateEnd() != null) {
+ queryWrapper.le(ProductionProductMain::getCreateTime, queryDto.getEntryDateEnd().atTime(23, 59, 59));
+ }
+ List<ProductionProductMain> reportList = productionProductMainMapper.selectList(queryWrapper);
+ for (ProductionProductMain report : reportList) {
+ rebuildAccount(report);
+ }
+ return Boolean.TRUE;
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public Boolean singleAdjust(ProductionAccountDto dto) {
+ if (dto == null || dto.getSchedulingUserId() == null) {
+ throw new ServiceException("璇烽�夋嫨闇�瑕佷慨姝g殑浜哄憳");
+ }
+ BigDecimal adjustAmount = dto.getAdjustAmount();
+ if (adjustAmount == null || adjustAmount.compareTo(BigDecimal.ZERO) == 0) {
+ throw new ServiceException("淇閲戦涓嶈兘涓虹┖");
+ }
+ ProductionAccount account = new ProductionAccount();
+ account.setSchedulingUserId(dto.getSchedulingUserId());
+ account.setSchedulingUserName(dto.getSchedulingUserName());
+ account.setTechnologyOperationName("宸ヨ祫淇");
+ account.setAdjustAmount(adjustAmount);
+ account.setAdjustRemark(dto.getAdjustRemark());
+ account.setAdjustUser(dto.getAdjustUser());
+ account.setAdjustTime(LocalDateTime.now());
+ account.setSchedulingDate(LocalDateTime.now());
+ account.setWorkHours(BigDecimal.ZERO);
+ account.setFinishedNum(BigDecimal.ZERO);
+ account.setAccountingBatchNo("ADJ-" + LocalDate.now());
+ baseMapper.insert(account);
+ return Boolean.TRUE;
+ }
+
+ private void rebuildAccount(ProductionProductMain productionProductMain) {
+ if (productionProductMain == null || productionProductMain.getId() == null) {
+ return;
+ }
+ productionAccountDelete(productionProductMain.getId());
+ ProductionProductOutput output = productionProductOutputMapper.selectOne(
+ Wrappers.<ProductionProductOutput>lambdaQuery()
+ .eq(ProductionProductOutput::getProductionProductMainId, productionProductMain.getId())
+ .last("limit 1"));
+ if (output == null || output.getQuantity() == null || output.getQuantity().compareTo(BigDecimal.ZERO) <= 0) {
+ return;
+ }
+ ProductionOperationTask task = productionOperationTaskMapper.selectById(productionProductMain.getProductionOperationTaskId());
+ if (task == null) {
+ return;
+ }
+ ProductionOrderRoutingOperation routingOperation = productionOrderRoutingOperationMapper.selectById(task.getProductionOrderRoutingOperationId());
+ if (routingOperation == null) {
+ return;
+ }
+ TechnologyRoutingOperation technologyRoutingOperation = technologyRoutingOperationMapper.selectById(routingOperation.getTechnologyRoutingOperationId());
+ TechnologyOperation technologyOperation = technologyRoutingOperation == null ? null
+ : technologyOperationMapper.selectById(technologyRoutingOperation.getTechnologyOperationId());
+ SysUser user = sysUserMapper.selectUserById(productionProductMain.getUserId());
+
+ ProductionAccount account = new ProductionAccount();
+ account.setProductionProductMainId(productionProductMain.getId());
+ account.setSchedulingUserId(user == null ? productionProductMain.getUserId() : user.getUserId());
+ account.setSchedulingUserName(user == null ? productionProductMain.getUserName() : user.getNickName());
+ account.setFinishedNum(output.getQuantity());
+ account.setWorkHours(technologyOperation == null ? null : technologyOperation.getSalaryQuota());
+ account.setTechnologyOperationName(technologyOperation == null ? null : technologyOperation.getName());
+ account.setSchedulingDate(LocalDateTime.now());
+ account.setAccountingBatchNo("BATCH-" + LocalDate.now());
+ baseMapper.insert(account);
+ }
+
+ private void productionAccountDelete(Long productionProductMainId) {
+ if (productionProductMainId == null) {
+ return;
+ }
+ baseMapper.delete(new LambdaQueryWrapper<ProductionAccount>()
+ .eq(ProductionAccount::getProductionProductMainId, productionProductMainId));
}
private ProductionAccountDto normalizeDateQuery(ProductionAccountDto dto) {
diff --git a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
index 4a8366a..63069a7 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -7,10 +7,16 @@
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.alibaba.fastjson2.JSON;
+import com.ruoyi.approve.bean.dto.ApprovalInstanceDto;
+import com.ruoyi.approve.bean.vo.ApprovalTemplateVo;
+import com.ruoyi.approve.service.ApprovalInstanceService;
+import com.ruoyi.approve.service.ApprovalTemplateService;
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.TypeEnums;
import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum;
import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum;
import com.ruoyi.common.exception.ServiceException;
@@ -78,6 +84,8 @@
private final ProductionOrderRoutingOperationParamMapper productionOrderRoutingOperationParamMapper;
private final TechnologyRoutingOperationMapper technologyRoutingOperationMapper;
private final TechnologyOperationMapper technologyOperationMapper;
+ private final ApprovalTemplateService approvalTemplateService;
+ private final ApprovalInstanceService approvalInstanceService;
private final StockUtils stockUtils;
private final StockInRecordService stockInRecordService;
private final StockInventoryService stockInventoryService;
@@ -277,9 +285,13 @@
productionProductMain.setUserName(user == null ? dto.getUserName() : user.getNickName());
productionProductMain.setProductionOperationTaskId(taskId);
productionProductMain.setStatus(0);
+ productionProductMain.setReportType(dto.getReportType() == null ? 0 : dto.getReportType());
+ productionProductMain.setAuditStatus(dto.getAuditStatus() == null ? 0 : dto.getAuditStatus());
+ productionProductMain.setAuditRemark(dto.getAuditRemark());
productionProductMain.setWorkHour(dto.getWorkHour());
productionProductMainMapper.insert(productionProductMain);
syncOperationParamInputValue(dto, routingOperation.getId(), productionProductMain.getId());
+ createReportApprovalInstance(productionProductMain);
List<ProductStructureDto> productStructureDtos = resolveInputStructures(
productionOrder.getId(), routingOperation, productModel.getId());
@@ -406,7 +418,6 @@
productionAccount.setWorkHours(technologyOperation != null ? technologyOperation.getSalaryQuota() : null);
productionAccount.setTechnologyOperationName(technologyOperation == null ? null : technologyOperation.getName());
productionAccount.setSchedulingDate(LocalDateTime.now());
- productionAccountMapper.insert(productionAccount);
}
if (scrapQty.compareTo(BigDecimal.ZERO) > 0) {
stockUtils.addUnStockWithBatchNo(
@@ -417,6 +428,120 @@
qualifiedBatchNo);
}
return true;
+ }
+
+ private void createReportApprovalInstance(ProductionProductMain productionProductMain) {
+ if (productionProductMain == null || productionProductMain.getId() == null) {
+ return;
+ }
+ ApprovalTemplateVo templateVo = approvalTemplateService.getEnabledTemplateByBusinessType(
+ TypeEnums.PRODUCTION_REPORT_APPROVAL.getCode()
+ );
+ if (templateVo == null) {
+ throw new ServiceException("璇峰厛閰嶇疆鎶ュ伐瀹℃壒妯℃澘");
+ }
+ ApprovalInstanceDto approvalInstanceDto = new ApprovalInstanceDto();
+ approvalInstanceDto.setTemplateId(templateVo.getId());
+ approvalInstanceDto.setTemplateName(templateVo.getTemplateName());
+ approvalInstanceDto.setBusinessId(productionProductMain.getId());
+ approvalInstanceDto.setBusinessType(TypeEnums.PRODUCTION_REPORT_APPROVAL.getCode());
+ approvalInstanceDto.setTitle(productionProductMain.getProductNo());
+ approvalInstanceDto.setApplicantId(productionProductMain.getUserId());
+ approvalInstanceDto.setApplicantName(productionProductMain.getUserName());
+ approvalInstanceDto.setApplyTime(LocalDateTime.now());
+ approvalInstanceDto.setStatus("PENDING");
+ approvalInstanceDto.setFormConfig(JSON.toJSONString(buildReportApprovalFormConfig(productionProductMain)));
+ approvalInstanceService.add(approvalInstanceDto);
+ }
+
+ private Map<String, Object> buildReportApprovalFormConfig(ProductionProductMain productionProductMain) {
+ Map<String, Object> formConfig = new LinkedHashMap<>();
+ formConfig.put("summaryPlaceholder", "鎶ュ伐瀹℃壒");
+ formConfig.put("approvalType", "production_report");
+
+ List<Map<String, Object>> fields = new ArrayList<>();
+ fields.add(buildReportField("productNo", "鎶ュ伐鍗曞彿", "text", productionProductMain.getProductNo()));
+ fields.add(buildReportField("userName", "鎶ュ伐浜哄憳", "text", productionProductMain.getUserName()));
+ fields.add(buildReportField("workOrderNo", "宸ュ崟缂栧彿", "text", resolveWorkOrderNo(productionProductMain.getProductionOperationTaskId())));
+ fields.add(buildReportField("reportType", "鎶ュ伐缁撴灉", "select", resolveReportTypeLabel(productionProductMain.getReportType())));
+ fields.add(buildReportField("workHour", "宸ユ椂", "number", productionProductMain.getWorkHour()));
+ fields.add(buildReportField("auditStatus", "瀹℃牳鐘舵��", "select", resolveAuditStatusLabel(productionProductMain.getAuditStatus())));
+ fields.add(buildReportField("auditRemark", "瀹℃牳鎰忚", "textarea", productionProductMain.getAuditRemark()));
+ formConfig.put("fields", fields);
+
+ Map<String, Object> formPayload = new LinkedHashMap<>();
+ formPayload.put("productNo", productionProductMain.getProductNo());
+ formPayload.put("userName", productionProductMain.getUserName());
+ formPayload.put("workOrderNo", resolveWorkOrderNo(productionProductMain.getProductionOperationTaskId()));
+ formPayload.put("reportType", resolveReportTypeLabel(productionProductMain.getReportType()));
+ formPayload.put("workHour", productionProductMain.getWorkHour());
+ formPayload.put("auditStatus", resolveAuditStatusLabel(productionProductMain.getAuditStatus()));
+ formPayload.put("auditRemark", productionProductMain.getAuditRemark());
+ formConfig.put("formPayload", formPayload);
+ return formConfig;
+ }
+
+ private Map<String, Object> buildReportField(String key, String label, String type, Object defaultValue) {
+ Map<String, Object> field = new LinkedHashMap<>();
+ field.put("key", key);
+ field.put("label", label);
+ field.put("type", type);
+ field.put("required", Boolean.FALSE);
+ field.put("defaultValue", defaultValue);
+ return field;
+ }
+
+ private String resolveWorkOrderNo(Long productionOperationTaskId) {
+ if (productionOperationTaskId == null) {
+ return null;
+ }
+ ProductionOperationTask task = productionOperationTaskMapper.selectById(productionOperationTaskId);
+ if (task != null && task.getWorkOrderNo() != null) {
+ return task.getWorkOrderNo();
+ }
+ if (task == null || task.getProductionOrderRoutingOperationId() == null) {
+ return null;
+ }
+ ProductionOrderRoutingOperation routingOperation = productionOrderRoutingOperationMapper.selectById(task.getProductionOrderRoutingOperationId());
+ if (routingOperation == null || routingOperation.getProductionOrderId() == null) {
+ return null;
+ }
+ ProductionOrder productionOrder = productionOrderMapper.selectById(routingOperation.getProductionOrderId());
+ return productionOrder == null ? null : productionOrder.getNpsNo();
+ }
+
+ private String resolveReportTypeLabel(Integer reportType) {
+ if (reportType == null) {
+ return "鈥�";
+ }
+ switch (reportType) {
+ case 0:
+ return "鍚堟牸";
+ case 1:
+ return "杞诲井杩斿伐";
+ case 2:
+ return "涓ラ噸杩斿伐";
+ case 3:
+ return "鎶ュ簾";
+ default:
+ return "鈥�";
+ }
+ }
+
+ private String resolveAuditStatusLabel(Integer auditStatus) {
+ if (auditStatus == null) {
+ return "寰呭鏍�";
+ }
+ switch (auditStatus) {
+ case 0:
+ return "寰呭鏍�";
+ case 1:
+ return "瀹℃牳閫氳繃";
+ case 2:
+ return "瀹℃牳涓嶉�氳繃";
+ default:
+ return "鈥�";
+ }
}
private String resolveLatestStockInBatchNo(Long recordId,
@@ -681,6 +806,86 @@
return dto.getProductionOperationTaskId();
}
+ private boolean isCountingWageReport(ProductionProductMain productionProductMain) {
+ return productionProductMain != null
+ && productionProductMain.getAuditStatus() != null
+ && productionProductMain.getAuditStatus() == 1
+ && productionProductMain.getReportType() != null
+ && productionProductMain.getReportType() == 0;
+ }
+
+ private boolean isExcludedFromWage(ProductionProductMain productionProductMain) {
+ return productionProductMain != null
+ && productionProductMain.getReportType() != null
+ && productionProductMain.getReportType() != 0;
+ }
+
+ @Override
+ public Boolean auditProductMain(ProductionProductMainDto productionProductMainDto) {
+ if (productionProductMainDto == null || productionProductMainDto.getId() == null) {
+ throw new ServiceException("鍙傛暟閿欒");
+ }
+ ProductionProductMain productionProductMain = productionProductMainMapper.selectById(productionProductMainDto.getId());
+ if (productionProductMain == null) {
+ throw new ServiceException("鎶ュ伐涓嶅瓨鍦�");
+ }
+ Integer auditStatus = productionProductMainDto.getAuditStatus();
+ if (auditStatus == null) {
+ throw new ServiceException("瀹℃牳鐘舵�佷笉鑳戒负绌�");
+ }
+ productionProductMain.setAuditStatus(auditStatus);
+ productionProductMain.setAuditRemark(productionProductMainDto.getAuditRemark());
+ productionProductMainMapper.updateById(productionProductMain);
+ productionAccountMapper.delete(new LambdaQueryWrapper<ProductionAccount>()
+ .eq(ProductionAccount::getProductionProductMainId, productionProductMain.getId()));
+ if (auditStatus == 1 && !isExcludedFromWage(productionProductMain)) {
+ rebuildProductionAccount(productionProductMain);
+ }
+ return true;
+ }
+
+ private void rebuildProductionAccount(ProductionProductMain productionProductMain) {
+ if (productionProductMain == null || productionProductMain.getId() == null) {
+ return;
+ }
+ ProductionProductOutput output = productionProductOutputMapper.selectOne(
+ Wrappers.<ProductionProductOutput>lambdaQuery()
+ .eq(ProductionProductOutput::getProductionProductMainId, productionProductMain.getId())
+ .last("limit 1"));
+ if (output == null) {
+ return;
+ }
+ ProductionOperationTask productionOperationTask = productionOperationTaskMapper.selectById(productionProductMain.getProductionOperationTaskId());
+ if (productionOperationTask == null) {
+ return;
+ }
+ ProductionOrderRoutingOperation routingOperation = productionOrderRoutingOperationMapper.selectById(productionOperationTask.getProductionOrderRoutingOperationId());
+ if (routingOperation == null) {
+ return;
+ }
+ ProductionOrder productionOrder = productionOrderMapper.selectById(productionOperationTask.getProductionOrderId());
+ if (productionOrder == null) {
+ return;
+ }
+ TechnologyRoutingOperation technologyRoutingOperation = technologyRoutingOperationMapper.selectById(routingOperation.getTechnologyRoutingOperationId());
+ TechnologyOperation technologyOperation = technologyRoutingOperation == null ? null
+ : technologyOperationMapper.selectById(technologyRoutingOperation.getTechnologyOperationId());
+ SysUser user = userMapper.selectUserById(productionProductMain.getUserId());
+ BigDecimal productQty = defaultDecimal(output.getQuantity());
+ if (productQty.compareTo(BigDecimal.ZERO) <= 0) {
+ return;
+ }
+ ProductionAccount productionAccount = new ProductionAccount();
+ productionAccount.setProductionProductMainId(productionProductMain.getId());
+ productionAccount.setSchedulingUserId(user == null ? productionProductMain.getUserId() : user.getUserId());
+ productionAccount.setSchedulingUserName(user == null ? productionProductMain.getUserName() : user.getNickName());
+ productionAccount.setFinishedNum(productQty);
+ productionAccount.setWorkHours(technologyOperation != null ? technologyOperation.getSalaryQuota() : null);
+ productionAccount.setTechnologyOperationName(technologyOperation == null ? null : technologyOperation.getName());
+ productionAccount.setSchedulingDate(LocalDateTime.now());
+ productionAccountMapper.insert(productionAccount);
+ }
+
@Override
public ArrayList<Long> listMain(List<Long> idList) {
// 鏌ヨ涓昏〃ID闆嗗悎
diff --git a/src/main/java/com/ruoyi/quality/controller/QualityUnqualifiedController.java b/src/main/java/com/ruoyi/quality/controller/QualityUnqualifiedController.java
index a2222c3..02c979a 100644
--- a/src/main/java/com/ruoyi/quality/controller/QualityUnqualifiedController.java
+++ b/src/main/java/com/ruoyi/quality/controller/QualityUnqualifiedController.java
@@ -4,6 +4,7 @@
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.R;
+import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.quality.pojo.QualityUnqualified;
import com.ruoyi.quality.service.IQualityUnqualifiedService;
import io.swagger.v3.oas.annotations.Operation;
@@ -37,6 +38,10 @@
@Log(title = "鏂板涓嶅悎鏍肩鐞�", businessType = BusinessType.INSERT)
public R<?> add(@RequestBody QualityUnqualified qualityUnqualified) {
qualityUnqualified.setInspectState(0);
+ if (qualityUnqualified.getDealType() != null) {
+ qualityUnqualified.setDealResult(resolveDealResult(qualityUnqualified.getDealType()));
+ }
+ normalizeRepairWorkHour(qualityUnqualified);
return R.ok(qualityUnqualifiedService.save(qualityUnqualified));
}
@@ -78,6 +83,10 @@
@Operation(summary = "涓嶅悎鏍肩鐞嗕慨鏀�")
@Log(title = "涓嶅悎鏍肩鐞嗕慨鏀�", businessType = BusinessType.UPDATE)
public R<?> update(@RequestBody QualityUnqualified qualityUnqualified) {
+ if (qualityUnqualified.getDealType() != null) {
+ qualityUnqualified.setDealResult(resolveDealResult(qualityUnqualified.getDealType()));
+ }
+ normalizeRepairWorkHour(qualityUnqualified);
return R.ok(qualityUnqualifiedService.updateById(qualityUnqualified));
}
@@ -115,8 +124,38 @@
@Operation(summary = "涓嶅悎鏍肩鐞嗗鐞�")
@Log(title = "涓嶅悎鏍肩鐞嗗鐞�", businessType = BusinessType.OTHER)
public R<?> deal(@RequestBody QualityUnqualified qualityUnqualified) {
+ if (qualityUnqualified.getDealType() != null) {
+ qualityUnqualified.setDealResult(resolveDealResult(qualityUnqualified.getDealType()));
+ }
+ normalizeRepairWorkHour(qualityUnqualified);
return R.ok(qualityUnqualifiedService.deal(qualityUnqualified));
}
+ private String resolveDealResult(Integer dealType) {
+ if (dealType == null) {
+ return null;
+ }
+ return switch (dealType) {
+ case 0 -> "杞诲井杩斿伐";
+ case 1 -> "涓ラ噸杩斿伐";
+ case 2 -> "鎶ュ簾";
+ default -> null;
+ };
+ }
+
+ private void normalizeRepairWorkHour(QualityUnqualified qualityUnqualified) {
+ if (qualityUnqualified == null || qualityUnqualified.getDealType() == null) {
+ return;
+ }
+ if (qualityUnqualified.getDealType() == 0) {
+ if (qualityUnqualified.getRepairWorkHour() == null
+ || qualityUnqualified.getRepairWorkHour().compareTo(java.math.BigDecimal.ZERO) <= 0) {
+ throw new ServiceException("杞诲井杩斿伐蹇呴』濉啓澶т簬0鐨勪慨鐞嗗伐鏃�");
+ }
+ } else {
+ qualityUnqualified.setRepairWorkHour(java.math.BigDecimal.ZERO);
+ }
+ }
+
}
diff --git a/src/main/java/com/ruoyi/quality/pojo/QualityUnqualified.java b/src/main/java/com/ruoyi/quality/pojo/QualityUnqualified.java
index e20f4be..e6cb765 100644
--- a/src/main/java/com/ruoyi/quality/pojo/QualityUnqualified.java
+++ b/src/main/java/com/ruoyi/quality/pojo/QualityUnqualified.java
@@ -99,6 +99,24 @@
private String dealResult;
/**
+ * 涓嶅悎鏍煎浘鐗�
+ */
+ @Excel(name = "涓嶅悎鏍煎浘鐗�")
+ private String photoUrls;
+
+ @Schema(description = "涓嶅悎鏍煎鐞嗙被鍨嬶細0杞诲井杩斿伐锛�1涓ラ噸杩斿伐锛�2鎶ュ簾")
+ @Excel(name = "涓嶅悎鏍煎鐞嗙被鍨�", readConverterExp = "0=杞诲井杩斿伐,1=涓ラ噸杩斿伐,2=鎶ュ簾")
+ private Integer dealType;
+
+ @Schema(description = "淇悊宸ユ椂")
+ @Excel(name = "淇悊宸ユ椂")
+ private BigDecimal repairWorkHour;
+
+ @Schema(description = "鏄惁閲嶆柊鐢熸垚鏂板崟锛�0鍚︼紝1鏄�")
+ @Excel(name = "鏄惁閲嶆柊鐢熸垚鏂板崟", readConverterExp = "0=鍚�,1=鏄�")
+ private Integer regenerateNewOrder;
+
+ /**
* 澶勭悊浜�
*/
@Excel(name = "澶勭悊浜�")
diff --git a/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java b/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
index b3d93b8..303826a 100644
--- a/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
+++ b/src/main/java/com/ruoyi/quality/service/impl/QualityUnqualifiedServiceImpl.java
@@ -73,14 +73,29 @@
QualityInspect qualityInspect = qualityInspectService.getById(unqualified.getInspectId());
String batchNo = qualityInspect == null ? null
: resolveProductionBatchNo(qualityInspect.getProductMainId(), qualityInspect.getId(), qualityInspect.getProductModelId());
+ if (qualityUnqualified.getDealType() != null) {
+ switch (qualityUnqualified.getDealType()) {
+ case 0:
+ qualityUnqualified.setDealResult("杞诲井杩斿伐");
+ break;
+ case 1:
+ qualityUnqualified.setDealResult("涓ラ噸杩斿伐");
+ break;
+ case 2:
+ qualityUnqualified.setDealResult("鎶ュ簾");
+ break;
+ default:
+ break;
+ }
+ }
if (ObjectUtils.isNotNull(qualityInspect) && qualityInspect.getInspectType() != 0) {
switch (qualityUnqualified.getDealResult()) {
- case "杩斾慨":
- case "杩斿伐":
+ case "涓ラ噸杩斿伐":
+ case "杞诲井杩斿伐":
if (ObjectUtils.isNotNull(qualityInspect.getProductMainId())) {
ProductionProductMain sourceMain = productionProductMainMapper.selectById(qualityInspect.getProductMainId());
if (sourceMain == null || sourceMain.getProductionOperationTaskId() == null) {
- throw new ServiceException("鍘嗗彶鎶ュ伐鏈粦瀹氱敓浜у伐鍗曪紝鏃犳硶鎸夋柊妯″瀷杩斾慨/杩斿伐");
+ throw new ServiceException("鍘嗗彶鎶ュ伐鏈粦瀹氱敓浜у伐鍗曪紝鏃犳硶鎸夋柊妯″瀷杩斿伐");
}
createReworkProductionByNewModel(sourceMain, unqualified.getQuantity());
}
@@ -88,6 +103,7 @@
case "鎶ュ簾":
stockUtils.addUnStockWithBatchNo(qualityInspect.getProductModelId(), unqualified.getQuantity(),
StockInQualifiedRecordTypeEnum.DEFECTIVE_SCRAP.getCode(), unqualified.getId(), batchNo);
+ qualityUnqualified.setRegenerateNewOrder(1);
break;
case "璁╂鏀捐":
stockUtils.addStockWithBatchNo(qualityInspect.getProductModelId(), unqualified.getQuantity(),
diff --git a/src/main/resources/mapper/production/ProductionAccountMapper.xml b/src/main/resources/mapper/production/ProductionAccountMapper.xml
index 4be1c23..fd439de 100644
--- a/src/main/resources/mapper/production/ProductionAccountMapper.xml
+++ b/src/main/resources/mapper/production/ProductionAccountMapper.xml
@@ -13,6 +13,11 @@
<result column="finished_num" property="finishedNum" />
<result column="work_hours" property="workHours" />
<result column="technology_operation_name" property="technologyOperationName" />
+ <result column="adjust_amount" property="adjustAmount" />
+ <result column="adjust_remark" property="adjustRemark" />
+ <result column="adjust_user" property="adjustUser" />
+ <result column="adjust_time" property="adjustTime" />
+ <result column="accounting_batch_no" property="accountingBatchNo" />
<result column="scheduling_date" property="schedulingDate" />
<result column="create_user" property="createUser" />
<result column="create_time" property="createTime" />
@@ -23,13 +28,27 @@
<select id="listPage" resultType="com.ruoyi.production.bean.vo.ProductionAccountVo">
select
+ group_concat(distinct ppm.product_no order by ppm.product_no separator ',') as reportNo,
+ case
+ when sum(case when ppm.audit_status = 0 then 1 else 0 end) > 0 then '寰呭鏍�'
+ when sum(case when ppm.audit_status = 2 then 1 else 0 end) > 0 then '瀹℃牳涓嶉�氳繃'
+ else '瀹℃牳閫氳繃'
+ end as auditStatusName,
+ case
+ when sum(case when ppm.report_type = 1 then 1 else 0 end) > 0 then '杞诲井杩斿伐'
+ when sum(case when ppm.report_type = 2 then 1 else 0 end) > 0 then '涓ラ噸杩斿伐'
+ when sum(case when ppm.report_type = 3 then 1 else 0 end) > 0 then '鎶ュ簾'
+ else '鍚堟牸'
+ end as reportTypeName,
group_concat(distinct p_parent.product_name order by p_parent.product_name separator ',') as productCategory,
group_concat(distinct pm.model order by pm.model separator ',') as specificationModel,
group_concat(distinct pm.unit order by pm.unit separator ',') as unit,
pa.scheduling_user_id as schedulingUserId,
pa.scheduling_user_name as schedulingUserName,
+ group_concat(distinct pot.work_order_no order by pot.work_order_no separator ',') as workOrderNo,
cast(sum(
case
+ when pa.adjust_amount is not null then ifnull(pa.adjust_amount, 0)
when poro.type = 0 then ifnull(pa.work_hours, 0) * ifnull(ppm.work_hour, 0)
else ifnull(pa.work_hours, 0) * ifnull(pa.finished_num, 0) *
case
@@ -41,6 +60,7 @@
) as decimal(18,4)) as wages,
cast(sum(ifnull(pa.finished_num, 0)) as decimal(18,4)) as finishedNum,
cast(sum(ifnull(pa.work_hours, 0)) as decimal(18,4)) as workHours,
+ cast(sum(ifnull(pa.adjust_amount, 0)) as decimal(18,4)) as adjustAmount,
cast(sum(ifnull(ppm.work_hour, 0)) as decimal(18,4)) as workHour,
case
when sum(ifnull(ppo.quantity, 0) + ifnull(ppo.scrapQty, 0)) = 0 then '0%'
@@ -55,6 +75,7 @@
)
end as outputRate,
group_concat(distinct pa.technology_operation_name order by pa.technology_operation_name separator ',') as process,
+ group_concat(distinct pa.adjust_remark order by pa.adjust_time desc separator ',') as adjustRemark,
case
when count(distinct date(pa.scheduling_date)) = 1 then min(date(pa.scheduling_date))
else null
@@ -79,6 +100,8 @@
group by production_product_main_id
) ppo on ppo.production_product_main_id = ppm.id
<where>
+ and ppm.audit_status = 1
+ and ppm.report_type = 0
<if test="c != null">
<if test="c.productCategory != null and c.productCategory != ''">
and p_parent.product_name like concat('%', #{c.productCategory}, '%')
@@ -115,9 +138,12 @@
<select id="selectUserAccount" resultType="com.ruoyi.production.bean.dto.UserAccountDto">
select ifnull(sum(finished_num), 0) as accountBalance,
ifnull(sum(work_hours), 0) as account
- from production_account
- where scheduling_user_id = #{userId}
- and date_format(scheduling_date, '%Y-%m') = #{date}
+ from production_account pa
+ inner join production_product_main ppm on ppm.id = pa.production_product_main_id
+ where pa.scheduling_user_id = #{userId}
+ and date_format(pa.scheduling_date, '%Y-%m') = #{date}
+ and ppm.audit_status = 1
+ and ppm.report_type = 0
</select>
<select id="selectDailyWagesStats" resultType="java.util.Map">
@@ -125,9 +151,12 @@
cast(ifnull(sum(finished_num), 0) as decimal(18,2)) as numberOfCompleted,
cast(ifnull(sum(work_hours), 0) as decimal(18,2)) as amount,
cast(0 as decimal(18,2)) as passRate
- from production_account
- where scheduling_date >= #{startDate}
- and scheduling_date <= #{endDate}
+ from production_account pa
+ inner join production_product_main ppm on ppm.id = pa.production_product_main_id
+ where pa.scheduling_date >= #{startDate}
+ and pa.scheduling_date <= #{endDate}
+ and ppm.audit_status = 1
+ and ppm.report_type = 0
group by date_format(scheduling_date, '%m-%d')
order by date_format(scheduling_date, '%m-%d')
</select>
diff --git a/src/main/resources/mapper/production/ProductionProductMainMapper.xml b/src/main/resources/mapper/production/ProductionProductMainMapper.xml
index df585f9..d2e89f7 100644
--- a/src/main/resources/mapper/production/ProductionProductMainMapper.xml
+++ b/src/main/resources/mapper/production/ProductionProductMainMapper.xml
@@ -7,6 +7,9 @@
<id column="id" property="id" />
<result column="product_no" property="productNo" />
<result column="production_operation_task_id" property="productionOperationTaskId" />
+ <result column="report_type" property="reportType" />
+ <result column="audit_status" property="auditStatus" />
+ <result column="audit_remark" property="auditRemark" />
<result column="dept_id" property="deptId" />
<result column="update_time" property="updateTime" />
<result column="create_user" property="createUser" />
@@ -16,6 +19,20 @@
<select id="listPageProductionProductMainDto" resultType="com.ruoyi.production.bean.dto.ProductionProductMainDto">
select ppm.*,
+ ppm.product_no as reportNo,
+ case ppm.report_type
+ when 0 then '鍚堟牸'
+ when 1 then '杞诲井杩斿伐'
+ when 2 then '涓ラ噸杩斿伐'
+ when 3 then '鎶ュ簾'
+ else '鏈煡'
+ end as reportTypeName,
+ case ppm.audit_status
+ when 0 then '寰呭鏍�'
+ when 1 then '瀹℃牳閫氳繃'
+ when 2 then '瀹℃牳涓嶉�氳繃'
+ else '鏈煡'
+ end as auditStatusName,
pot.work_order_no as workOrderNo,
case pot.status
when 1 then '寰呯‘璁�'
@@ -57,6 +74,12 @@
<if test="c.productNo != null and c.productNo != ''">
and ppm.product_no like concat('%', #{c.productNo}, '%')
</if>
+ <if test="c.auditStatus != null">
+ and ppm.audit_status = #{c.auditStatus}
+ </if>
+ <if test="c.reportType != null">
+ and ppm.report_type = #{c.reportType}
+ </if>
<if test="c.workOrderNo != null and c.workOrderNo != ''">
and pot.work_order_no like concat('%', #{c.workOrderNo}, '%')
</if>
@@ -91,6 +114,20 @@
<select id="listProductionDetails" resultType="com.ruoyi.production.bean.dto.ProductionProductMainDto">
select ppm.*,
+ ppm.product_no as reportNo,
+ case ppm.report_type
+ when 0 then '鍚堟牸'
+ when 1 then '杞诲井杩斿伐'
+ when 2 then '涓ラ噸杩斿伐'
+ when 3 then '鎶ュ簾'
+ else '鏈煡'
+ end as reportTypeName,
+ case ppm.audit_status
+ when 0 then '寰呭鏍�'
+ when 1 then '瀹℃牳閫氳繃'
+ when 2 then '瀹℃牳涓嶉�氳繃'
+ else '鏈煡'
+ end as auditStatusName,
pot.work_order_no as workOrderNo,
p.product_name as productName,
pm.model as productModelName,
@@ -125,6 +162,12 @@
left join production_product_output ppo on ppo.production_product_main_id = ppm.id
<where>
<if test="c != null">
+ <if test="c.auditStatus != null">
+ and ppm.audit_status = #{c.auditStatus}
+ </if>
+ <if test="c.reportType != null">
+ and ppm.report_type = #{c.reportType}
+ </if>
<if test="c.productCategory != null and c.productCategory != ''">
and p_parent.product_name like concat('%', #{c.productCategory}, '%')
</if>
diff --git a/src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml b/src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml
index d995258..2892921 100644
--- a/src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml
+++ b/src/main/resources/mapper/quality/QualityUnqualifiedMapper.xml
@@ -14,6 +14,7 @@
qu.quantity,
qu.defective_phenomena,
qu.deal_result,
+ qu.photo_urls,
qu.deal_name,
qu.deal_time,
CASE
@@ -72,9 +73,10 @@
qu.product_name,
qu.unit,
qu.quantity,
- qu.defective_phenomena,
- qu.deal_result,
- qu.deal_name,
+ qu.defective_phenomena,
+ qu.deal_result,
+ qu.photo_urls,
+ qu.deal_name,
qu.deal_time,
CASE
WHEN qu.model = pm.id THEN pm.model
diff --git a/src/main/resources/mapper/stock/StockInventoryMapper.xml b/src/main/resources/mapper/stock/StockInventoryMapper.xml
index ed780a7..4b45c07 100644
--- a/src/main/resources/mapper/stock/StockInventoryMapper.xml
+++ b/src/main/resources/mapper/stock/StockInventoryMapper.xml
@@ -222,7 +222,7 @@
unit,
product_name,
product_id
- order by combined.create_time desc
+ order by MAX(create_time) desc
</select>
<select id="listStockInventoryExportData" resultType="com.ruoyi.stock.execl.StockInventoryExportData">
--
Gitblit v1.9.3