From 53c0da6e44a01acf9d97bdc7abaf25e5984b92dc Mon Sep 17 00:00:00 2001
From: huminmin <mac@MacBook-Pro.local>
Date: 星期一, 13 七月 2026 14:39:57 +0800
Subject: [PATCH] 修改生产核算

---
 src/main/java/com/ruoyi/production/bean/dto/ProductionAccountDetailExportDto.java |   58 ++++++++++++++
 src/main/java/com/ruoyi/production/service/impl/ProductionAccountServiceImpl.java |   99 +++++++++++++++++++-----
 src/main/java/com/ruoyi/production/service/ProductionAccountService.java          |    2 
 src/main/resources/mapper/production/ProductionProductMainMapper.xml              |    4 +
 src/main/java/com/ruoyi/production/bean/dto/ProductionProductMainDto.java         |   15 +++
 src/main/java/com/ruoyi/production/controller/ProductionAccountController.java    |   44 ++++++++++
 src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java     |    3 
 src/main/java/com/ruoyi/production/bean/dto/ProductionAccountDto.java             |    3 
 8 files changed, 203 insertions(+), 25 deletions(-)

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 13cad8b..59fe13e 100644
--- a/src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java
+++ b/src/main/java/com/ruoyi/approve/service/impl/ApprovalInstanceServiceImpl.java
@@ -33,6 +33,7 @@
 import com.ruoyi.procurementrecord.utils.StockUtils;
 import com.ruoyi.production.mapper.ProductionProductMainMapper;
 import com.ruoyi.production.pojo.ProductionProductMain;
+import com.ruoyi.production.service.ProductionAccountService;
 import com.ruoyi.project.system.domain.SysDept;
 import com.ruoyi.project.system.domain.SysUser;
 import com.ruoyi.project.system.mapper.SysDeptMapper;
@@ -97,6 +98,7 @@
     private final EnterpriseNewsScopeDeptMapper enterpriseNewsScopeDeptMapper;
     private final ApprovalTemplateNodeApproverMapper approvalTemplateNodeApproverMapper;
     private final ProductionProductMainMapper productionProductMainMapper;
+    private final ProductionAccountService productionAccountService;
 
     @Override
     public R listPage(Page<ApprovalInstanceVo> page, ApprovalInstanceDto approvalInstanceDto) {
@@ -717,6 +719,7 @@
             return;
         }
         productionProductMainMapper.updateById(productionProductMain);
+        productionAccountService.rebuildByProductionProductMainId(productionProductMain.getId());
     }
 
     private List<ApprovalTask> createNodeAndTasks(ApprovalInstance instance, ApprovalTemplateNode templateNode) {
diff --git a/src/main/java/com/ruoyi/production/bean/dto/ProductionAccountDetailExportDto.java b/src/main/java/com/ruoyi/production/bean/dto/ProductionAccountDetailExportDto.java
new file mode 100644
index 0000000..e20edee
--- /dev/null
+++ b/src/main/java/com/ruoyi/production/bean/dto/ProductionAccountDetailExportDto.java
@@ -0,0 +1,58 @@
+package com.ruoyi.production.bean.dto;
+
+import com.ruoyi.framework.aspectj.lang.annotation.Excel;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+
+@Data
+@Schema(name = "ProductionAccountDetailExportDto", description = "鐢熶骇鏍哥畻瀵煎嚭鏄庣粏")
+public class ProductionAccountDetailExportDto {
+
+    @Excel(name = "鎶ュ伐鍗曞彿")
+    private String reportNo;
+
+    @Excel(name = "鐢熶骇鏃ユ湡", dateFormat = "yyyy-MM-dd")
+    private LocalDate schedulingDate;
+
+    @Excel(name = "鐢熶骇浜�")
+    private String schedulingUserName;
+
+    @Excel(name = "瀹℃牳鐘舵��")
+    private String auditStatusName;
+
+    @Excel(name = "鎶ュ伐绫诲瀷")
+    private String reportTypeName;
+
+    @Excel(name = "閿�鍞悎鍚屽彿")
+    private String salesContractNo;
+
+    @Excel(name = "浜у搧澶х被")
+    private String productName;
+
+    @Excel(name = "瑙勬牸鍨嬪彿")
+    private String productModelName;
+
+    @Excel(name = "鍗曚綅")
+    private String unit;
+
+    @Excel(name = "宸ュ簭")
+    private String process;
+
+    @Excel(name = "宸ュ崟缂栧彿")
+    private String workOrderNo;
+
+    @Excel(name = "宸ユ椂锛坔锛�")
+    private BigDecimal workHour;
+
+    @Excel(name = "鐢熶骇鏁伴噺")
+    private BigDecimal quantity;
+
+    @Excel(name = "宸ユ椂瀹氶")
+    private BigDecimal workHours;
+
+    @Excel(name = "宸ヨ祫")
+    private BigDecimal wages;
+}
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 a72f7cb..a60baac 100644
--- a/src/main/java/com/ruoyi/production/bean/dto/ProductionAccountDto.java
+++ b/src/main/java/com/ruoyi/production/bean/dto/ProductionAccountDto.java
@@ -64,8 +64,7 @@
     private LocalDate entryDate;
 
     @Schema(description = "鏃ユ湡鑼冨洿")
-    @DateTimeFormat(pattern = "yyyy-MM-dd")
-    private LocalDate[] dateRange;
+    private String[] dateRange;
 
     @Schema(description = "寮�濮嬫棩鏈�")
     @JsonFormat(pattern = "yyyy-MM-dd")
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 0879617..eb6d6b3 100644
--- a/src/main/java/com/ruoyi/production/bean/dto/ProductionProductMainDto.java
+++ b/src/main/java/com/ruoyi/production/bean/dto/ProductionProductMainDto.java
@@ -21,11 +21,20 @@
     @Schema(description = "鎶ュ伐ID")
     private Long productMainId;
 
+    @Schema(description = "鎶ュ伐鍗曞彿")
+    private String reportNo;
+
     @Schema(description = "鎶ュ伐缁撴灉绫诲瀷锛�0鍚堟牸锛�1杞诲井杩斿伐锛�2涓ラ噸杩斿伐锛�3鎶ュ簾")
     private Integer reportType;
 
+    @Schema(description = "鎶ュ伐缁撴灉绫诲瀷鍚嶇О")
+    private String reportTypeName;
+
     @Schema(description = "瀹℃牳鐘舵�侊細0寰呭鏍革紝1瀹℃牳閫氳繃锛�2瀹℃牳涓嶉�氳繃")
     private Integer auditStatus;
+
+    @Schema(description = "瀹℃牳鐘舵�佸悕绉�")
+    private String auditStatusName;
 
     @Schema(description = "瀹℃牳鎰忚")
     private String auditRemark;
@@ -78,6 +87,12 @@
     @Schema(description = "宸ヨ祫")
     private BigDecimal wages;
 
+    @Schema(description = "宸ヨ祫淇閲戦")
+    private BigDecimal adjustAmount;
+
+    @Schema(description = "宸ヨ祫淇璇存槑")
+    private String adjustRemark;
+
     @Schema(description = "宸ュ簭鍙傛暟鍒楄〃")
     private List<ProductionOrderRoutingOperationParam> productionOperationParamList;
 }
diff --git a/src/main/java/com/ruoyi/production/controller/ProductionAccountController.java b/src/main/java/com/ruoyi/production/controller/ProductionAccountController.java
index f1695c8..b401446 100644
--- a/src/main/java/com/ruoyi/production/controller/ProductionAccountController.java
+++ b/src/main/java/com/ruoyi/production/controller/ProductionAccountController.java
@@ -3,13 +3,17 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.ruoyi.framework.web.domain.R;
+import com.ruoyi.common.utils.poi.ExcelUtil;
+import com.ruoyi.framework.aspectj.lang.annotation.Log;
+import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
+import com.ruoyi.production.bean.dto.ProductionAccountDetailExportDto;
 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.service.ProductionAccountService;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import lombok.RequiredArgsConstructor;
+import jakarta.servlet.http.HttpServletResponse;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -30,26 +34,62 @@
     private final ProductionAccountService productionAccountService;
 
     @GetMapping("/listPage")
+    @Log(title = "鐢熶骇鏍哥畻-鍒嗛〉鏌ヨ", businessType = BusinessType.OTHER)
     @Operation(summary = "鐢熶骇鏍哥畻鍒嗛〉鏌ヨ")
-    public R<IPage<ProductionAccountVo>> listPage(Page<ProductionAccountDto> page, ProductionAccountDto dto) {
+    public R<IPage<com.ruoyi.production.bean.vo.ProductionAccountVo>> listPage(Page<ProductionAccountDto> page, ProductionAccountDto dto) {
         return R.ok(productionAccountService.listPage(page, dto));
     }
 
     @GetMapping("/listProductionDetails")
+    @Log(title = "鐢熶骇鏍哥畻-宸ヨ祫鏄庣粏鏌ヨ", businessType = BusinessType.OTHER)
     @Operation(summary ="鏌ヨ宸ヤ汉鐢熶骇宸ヨ祫淇℃伅")
     public R<IPage<ProductionProductMainDto>> listProductionDetails(ProductionAccountDto productionAccountDto, Page page) {
         return R.ok(productionAccountService.listProductionDetails(productionAccountDto,page));
     }
 
     @PostMapping("/batchAccounting")
+    @Log(title = "鐢熶骇鏍哥畻-鎵归噺鏍哥畻", businessType = BusinessType.UPDATE)
     @Operation(summary = "鎵归噺鏍哥畻")
     public R<Boolean> batchAccounting(@RequestBody ProductionAccountDto dto) {
         return R.ok(productionAccountService.batchAccounting(dto));
     }
 
     @PostMapping("/singleAdjust")
+    @Log(title = "鐢熶骇鏍哥畻-鍗曚釜淇", businessType = BusinessType.UPDATE)
     @Operation(summary = "鍗曚釜淇")
     public R<Boolean> singleAdjust(@RequestBody ProductionAccountDto dto) {
         return R.ok(productionAccountService.singleAdjust(dto));
     }
+
+    @PostMapping("/exportSalarySlip")
+    @Log(title = "鐢熶骇鏍哥畻-瀵煎嚭宸ヨ祫鏉�", businessType = BusinessType.EXPORT)
+    @Operation(summary = "瀵煎嚭宸ヨ祫鏉�")
+    public void exportSalarySlip(HttpServletResponse response, ProductionAccountDto dto) {
+        ExcelUtil<ProductionAccountDetailExportDto> util = new ExcelUtil<>(ProductionAccountDetailExportDto.class);
+        util.exportExcel(response,
+                productionAccountService.listProductionDetails(dto, new Page<>(1, Integer.MAX_VALUE))
+                        .getRecords()
+                        .stream()
+                        .map(item -> {
+                            ProductionAccountDetailExportDto exportDto = new ProductionAccountDetailExportDto();
+                            exportDto.setReportNo(item.getReportNo());
+                            exportDto.setSchedulingDate(item.getSchedulingDate());
+                            exportDto.setSchedulingUserName(item.getSchedulingUserName());
+                            exportDto.setAuditStatusName(item.getAuditStatusName());
+                            exportDto.setReportTypeName(item.getReportTypeName());
+                            exportDto.setSalesContractNo(item.getSalesContractNo());
+                            exportDto.setProductName(item.getProductName());
+                            exportDto.setProductModelName(item.getProductModelName());
+                            exportDto.setUnit(item.getUnit());
+                            exportDto.setProcess(item.getProcess());
+                            exportDto.setWorkOrderNo(item.getWorkOrderNo());
+                            exportDto.setWorkHour(item.getWorkHour());
+                            exportDto.setQuantity(item.getQuantity());
+                            exportDto.setWorkHours(item.getWorkHours());
+                            exportDto.setWages(item.getWages());
+                            return exportDto;
+                        })
+                        .toList(),
+                "鐢熶骇宸ヨ祫鏉�");
+    }
 }
diff --git a/src/main/java/com/ruoyi/production/service/ProductionAccountService.java b/src/main/java/com/ruoyi/production/service/ProductionAccountService.java
index b5b56db..b2ceb4e 100644
--- a/src/main/java/com/ruoyi/production/service/ProductionAccountService.java
+++ b/src/main/java/com/ruoyi/production/service/ProductionAccountService.java
@@ -24,4 +24,6 @@
     Boolean batchAccounting(ProductionAccountDto dto);
 
     Boolean singleAdjust(ProductionAccountDto dto);
+
+    Boolean rebuildByProductionProductMainId(Long productionProductMainId);
 }
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 cd9e476..50fa2d4 100644
--- a/src/main/java/com/ruoyi/production/service/impl/ProductionAccountServiceImpl.java
+++ b/src/main/java/com/ruoyi/production/service/impl/ProductionAccountServiceImpl.java
@@ -33,6 +33,7 @@
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.format.DateTimeParseException;
 import java.util.List;
 
 @Service
@@ -100,26 +101,58 @@
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean singleAdjust(ProductionAccountDto dto) {
-        if (dto == null || dto.getSchedulingUserId() == null) {
+        if (dto == null || (dto.getProductionProductMainId() == 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);
+        if (dto.getProductionProductMainId() != null) {
+            ProductionAccount account = new ProductionAccount();
+            account.setAdjustAmount(adjustAmount);
+            account.setAdjustRemark(dto.getAdjustRemark());
+            account.setAdjustUser(dto.getAdjustUser());
+            account.setAdjustTime(LocalDateTime.now());
+            baseMapper.update(account, new LambdaQueryWrapper<ProductionAccount>()
+                    .eq(ProductionAccount::getProductionProductMainId, dto.getProductionProductMainId()));
+        } else {
+            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;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean rebuildByProductionProductMainId(Long productionProductMainId) {
+        if (productionProductMainId == null) {
+            return Boolean.FALSE;
+        }
+        ProductionProductMain productionProductMain = productionProductMainMapper.selectById(productionProductMainId);
+        if (productionProductMain == null) {
+            return Boolean.FALSE;
+        }
+        if (productionProductMain.getAuditStatus() == null || productionProductMain.getAuditStatus() != 1) {
+            productionAccountDelete(productionProductMainId);
+            return Boolean.FALSE;
+        }
+        if (productionProductMain.getReportType() == null || productionProductMain.getReportType() != 0) {
+            productionAccountDelete(productionProductMainId);
+            return Boolean.FALSE;
+        }
+        rebuildAccount(productionProductMain);
         return Boolean.TRUE;
     }
 
@@ -127,6 +160,14 @@
         if (productionProductMain == null || productionProductMain.getId() == null) {
             return;
         }
+        ProductionAccount existedAccount = baseMapper.selectOne(Wrappers.<ProductionAccount>lambdaQuery()
+                .eq(ProductionAccount::getProductionProductMainId, productionProductMain.getId())
+                .last("limit 1"));
+        BigDecimal existedAdjustAmount = existedAccount == null ? null : existedAccount.getAdjustAmount();
+        String existedAdjustRemark = existedAccount == null ? null : existedAccount.getAdjustRemark();
+        Long existedAdjustUser = existedAccount == null ? null : existedAccount.getAdjustUser();
+        LocalDateTime existedAdjustTime = existedAccount == null ? null : existedAccount.getAdjustTime();
+
         productionAccountDelete(productionProductMain.getId());
         ProductionProductOutput output = productionProductOutputMapper.selectOne(
                 Wrappers.<ProductionProductOutput>lambdaQuery()
@@ -157,6 +198,10 @@
         account.setTechnologyOperationName(technologyOperation == null ? null : technologyOperation.getName());
         account.setSchedulingDate(LocalDateTime.now());
         account.setAccountingBatchNo("BATCH-" + LocalDate.now());
+        account.setAdjustAmount(existedAdjustAmount);
+        account.setAdjustRemark(existedAdjustRemark);
+        account.setAdjustUser(existedAdjustUser);
+        account.setAdjustTime(existedAdjustTime);
         baseMapper.insert(account);
     }
 
@@ -173,22 +218,23 @@
         if (dto == null) {
             return new ProductionAccountDto();
         }
-        LocalDate[] dateRange = dto.getDateRange();
         if ((dto.getEntryDateStart() == null || dto.getEntryDateEnd() == null)
-                && dateRange != null
-                && dateRange.length > 0) {
+                && dto.getDateRange() != null
+                && dto.getDateRange().length > 0) {
+            LocalDate rangeStart = parseDate(dto.getDateRange()[0]);
+            LocalDate rangeEnd = dto.getDateRange().length > 1 ? parseDate(dto.getDateRange()[1]) : rangeStart;
             if (dto.getEntryDateStart() == null) {
-                dto.setEntryDateStart(dateRange[0]);
+                dto.setEntryDateStart(rangeStart);
             }
             if (dto.getEntryDateEnd() == null) {
-                dto.setEntryDateEnd(dateRange.length > 1 ? dateRange[1] : dateRange[0]);
+                dto.setEntryDateEnd(rangeEnd);
             }
         }
 
         String dateType = dto.getDateType();
         if ("day".equalsIgnoreCase(dateType)) {
-            if (dto.getEntryDate() == null && dateRange != null && dateRange.length > 0) {
-                dto.setEntryDate(dateRange[0]);
+            if (dto.getEntryDate() == null && dto.getDateRange() != null && dto.getDateRange().length > 0) {
+                dto.setEntryDate(parseDate(dto.getDateRange()[0]));
             }
             if (dto.getEntryDate() == null) {
                 dto.setEntryDate(dto.getEntryDateStart());
@@ -206,4 +252,15 @@
         return dto;
     }
 
+    private LocalDate parseDate(String dateValue) {
+        if (dateValue == null || dateValue.isEmpty()) {
+            return null;
+        }
+        try {
+            return LocalDate.parse(dateValue);
+        } catch (DateTimeParseException e) {
+            throw new ServiceException("鏃ユ湡鏍煎紡閿欒锛岃浣跨敤 yyyy-MM-dd");
+        }
+    }
+
 }
diff --git a/src/main/resources/mapper/production/ProductionProductMainMapper.xml b/src/main/resources/mapper/production/ProductionProductMainMapper.xml
index d2e89f7..77d6495 100644
--- a/src/main/resources/mapper/production/ProductionProductMainMapper.xml
+++ b/src/main/resources/mapper/production/ProductionProductMainMapper.xml
@@ -136,11 +136,15 @@
                ifnull(ppo.quantity, 0) as quantity,
                ifnull(ppo.scrap_qty, 0) as scrapQty,
                date(pa.scheduling_date) as schedulingDate,
+               pa.scheduling_user_id as schedulingUserId,
                pa.scheduling_user_name as schedulingUserName,
                cast(ifnull(ppm.work_hour, 0) as decimal(18,4)) as workHour,
                cast(ifnull(pa.work_hours, 0) as decimal(18,4)) as workHours,
+               cast(ifnull(pa.adjust_amount, 0) as decimal(18,4)) as adjustAmount,
+               pa.adjust_remark as adjustRemark,
                cast(
                    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

--
Gitblit v1.9.3