From eccacd586dfbaace7c47bf52f4c96d096d8ef7dc Mon Sep 17 00:00:00 2001
From: zhanghl <253316343@qq.com>
Date: 星期三, 23 四月 2025 18:20:20 +0800
Subject: [PATCH] 钣金按部门统计时间

---
 aps-modules/aps-core/src/main/resources/mapper/core/ApsPlatePlanMapper.xml                                 |   37 +-
 aps-modules/aps-core/src/main/java/com/aps/core/mapper/ApsPlateProcessShopStatMapper.java                  |   67 ++++
 aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsPlateProcessShopStat.java                        |  140 +++++++++
 aps-modules/aps-core/src/main/resources/mapper/core/ApsPlateProcessShopStatMapper.xml                      |  118 +++++++
 aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsPlateProcessShopPlanStat.java                    |   68 ++++
 aps-modules/aps-core/src/main/java/com/aps/core/service/IApsPlateProcessShopStatService.java               |   67 ++++
 aps-modules/aps-core/src/main/resources/mapper/core/ApsShopMapper.xml                                      |    1 
 aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlatePlanServiceImpl.java                  |    3 
 aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsPlateProcessShopStatController.java |   74 ++++
 aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlateProcessShopStatServiceImpl.java       |  283 ++++++++++++++++++
 10 files changed, 840 insertions(+), 18 deletions(-)

diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsPlateProcessShopStatController.java b/aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsPlateProcessShopStatController.java
new file mode 100644
index 0000000..687fc25
--- /dev/null
+++ b/aps-modules/aps-core/src/main/java/com/aps/core/controller/mainPlan/ApsPlateProcessShopStatController.java
@@ -0,0 +1,74 @@
+package com.aps.core.controller.mainPlan;
+
+import com.aps.common.core.utils.poi.ExcelUtil;
+import com.aps.common.core.web.controller.BaseController;
+import com.aps.common.core.web.domain.AjaxResult;
+import com.aps.common.core.web.page.TableDataInfo;
+import com.aps.common.log.annotation.Log;
+import com.aps.common.log.enums.BusinessType;
+import com.aps.common.security.annotation.RequiresPermissions;
+import com.aps.core.domain.ApsPlateProcessShopStat;
+import com.aps.core.service.IApsPlateProcessShopStatService;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 閽i噾杞﹂棿缁熻Controller
+ * 
+ * @author zhl
+ * @date 2025-04-23
+ */
+
+
+@RestController
+@RequestMapping("/ApsPlateProcessShopStat")
+public class ApsPlateProcessShopStatController extends BaseController
+{
+    @Autowired
+    private IApsPlateProcessShopStatService apsPlateProcessShopStatService;
+
+
+    /**
+     * 瀵煎嚭閽i噾杞﹂棿缁熻鍒楄〃
+     */
+
+    @RequiresPermissions("ApsPlateProcessShopStat:ApsPlateProcessShopStat:export")
+    @Log(title = "閽i噾杞﹂棿缁熻", businessType = BusinessType.EXPORT)
+    @PostMapping("/export")
+    public void export(HttpServletResponse response, ApsPlateProcessShopStat apsPlateProcessShopStat)
+    {
+        List<ApsPlateProcessShopStat> list = apsPlateProcessShopStatService.selectApsPlateProcessShopStatList(apsPlateProcessShopStat);
+        ExcelUtil<ApsPlateProcessShopStat> util = new ExcelUtil<ApsPlateProcessShopStat>(ApsPlateProcessShopStat.class);
+        util.exportExcel(response, list, "閽i噾杞﹂棿缁熻鏁版嵁");
+    }
+
+
+    /**
+     * 淇敼閽i噾杞﹂棿缁熻
+     */
+
+
+    @Log(title = "閽i噾杞﹂棿缁熻", businessType = BusinessType.UPDATE)
+    @PostMapping("/update")
+    public AjaxResult update(@RequestBody ApsPlateProcessShopStat apsPlateProcessShopStat)
+    {
+        apsPlateProcessShopStatService.saveShopStat();
+        return toAjax(true);
+    }
+
+    /**
+     * 鏌ヨ閽i噾杞﹂棿缁熻鍒楄〃
+     */
+
+
+    @GetMapping("/list")
+    public AjaxResult list(ApsPlateProcessShopStat apsPlateProcessShopStat)
+    {
+        return apsPlateProcessShopStatService.getShopPlanStat();
+
+    }
+
+}
diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsPlateProcessShopPlanStat.java b/aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsPlateProcessShopPlanStat.java
new file mode 100644
index 0000000..dbf0d80
--- /dev/null
+++ b/aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsPlateProcessShopPlanStat.java
@@ -0,0 +1,68 @@
+package com.aps.core.domain;
+
+import com.aps.common.core.annotation.Excel;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class ApsPlateProcessShopPlanStat implements Serializable {
+    @Serial
+    private static final long serialVersionUID = 1L;
+
+    /** 涓婚敭id */
+    private String id;
+    /** 涓讳欢鏂欏彿 */
+    @Excel(name = "涓讳欢鏂欏彿")
+    private String mainPartNumber;
+
+    /** 涓氬姟绫诲瀷 */
+    @Excel(name = "涓氬姟绫诲瀷")
+    private String businessType;
+
+    /** 鍗曟嵁鍙� */
+    @Excel(name = "鍗曟嵁鍙�")
+    private String documentNumber;
+
+    /** 闇�姹傚垎绫� */
+    @Excel(name = "闇�姹傚垎绫�")
+    private String requirementType;
+
+    /** 鍗曟嵁鐘舵�� */
+    @Excel(name = "鍗曟嵁鐘舵��")
+    private String documentStatus;
+
+    /** 褰撳墠宸ュ簭 */
+    @Excel(name = "褰撳墠宸ュ簭")
+    private String workCenter;
+
+
+    /** 鏂欏彿 */
+    @Excel(name = "鏂欏彿")
+    private String itemNumber;
+
+    /** 鍥惧彿 */
+    @Excel(name = "鍥惧彿")
+    private String drawingNo;
+
+    /** 鐗堟湰鍙� */
+    @Excel(name = "鐗堟湰鍙�")
+    private String versionNumber;
+
+    /** 鐢熶骇鏁伴噺 */
+    @Excel(name = "鐢熶骇鏁伴噺")
+    private BigDecimal productionQuantity;
+
+    /** 璁″垝瀹屽伐鏃� */
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    @Excel(name = "璁″垝瀹屽伐鏃�", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date planEndDay;
+
+    private List<ApsPlateProcessShopStat> deptPlans=new ArrayList<>();
+}
diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsPlateProcessShopStat.java b/aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsPlateProcessShopStat.java
new file mode 100644
index 0000000..7ce2638
--- /dev/null
+++ b/aps-modules/aps-core/src/main/java/com/aps/core/domain/ApsPlateProcessShopStat.java
@@ -0,0 +1,140 @@
+package com.aps.core.domain;
+
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+import com.aps.common.core.annotation.Excel;
+//import io.swagger.annotations.ApiModel;
+//import io.swagger.annotations.ApiModelProperty;
+import com.aps.common.core.web.domain.BaseEntity;
+
+/**
+ * 閽i噾杞﹂棿缁熻瀵硅薄 aps_plate_process_shop_stat
+ * 
+ * @author zhl
+ * @date 2025-04-23
+ */
+//@ApiModel("閽i噾杞﹂棿缁熻瀹炰綋绫�")
+public class ApsPlateProcessShopStat extends BaseEntity
+{
+    private static final long serialVersionUID = 1L;
+
+    /** $column.columnComment */
+    //@ApiModelProperty("$column.columnComment")
+    private Long id;
+
+    /** 鍗曟嵁鍙� */
+    @Excel(name = "鍗曟嵁鍙�")
+    ///@ApiModelProperty("鍗曟嵁鍙�")
+    private String docNo;
+
+    /** 杞﹂棿缂栫爜 */
+    @Excel(name = "杞﹂棿缂栫爜")
+    //@ApiModelProperty("杞﹂棿缂栫爜")
+    private String shopCode;
+
+    /** 杞﹂棿鍚嶇О */
+    @Excel(name = "杞﹂棿鍚嶇О")
+    //@ApiModelProperty("杞﹂棿鍚嶇О")
+    private String shopName;
+
+    /** 璁″垝寮�濮嬫椂闂� */
+    @Excel(name = "璁″垝寮�濮嬫椂闂�")
+    //@ApiModelProperty("璁″垝寮�濮嬫椂闂�")
+    private String planStartDate;
+
+    /** 璁″垝缁撴潫鏃ユ湡 */
+    @Excel(name = "璁″垝缁撴潫鏃ユ湡")
+    //@ApiModelProperty("璁″垝缁撴潫鏃ユ湡")
+    private String planEndDate;
+
+    /** 鍒犻櫎鏍囧織锛�0浠h〃瀛樺湪 2浠h〃鍒犻櫎锛� */
+    //@ApiModelProperty("鍒犻櫎鏍囧織锛�0浠h〃瀛樺湪 2浠h〃鍒犻櫎锛�")
+    private String delFlag;
+
+    public void setId(Long id) 
+    {
+        this.id = id;
+    }
+
+    public Long getId() 
+    {
+        return id;
+    }
+
+    public void setDocNo(String docNo) 
+    {
+        this.docNo = docNo;
+    }
+
+    public String getDocNo() 
+    {
+        return docNo;
+    }
+
+    public void setShopCode(String shopCode) 
+    {
+        this.shopCode = shopCode;
+    }
+
+    public String getShopCode() 
+    {
+        return shopCode;
+    }
+
+    public void setShopName(String shopName) 
+    {
+        this.shopName = shopName;
+    }
+
+    public String getShopName() 
+    {
+        return shopName;
+    }
+
+    public void setPlanStartDate(String planStartDate) 
+    {
+        this.planStartDate = planStartDate;
+    }
+
+    public String getPlanStartDate() 
+    {
+        return planStartDate;
+    }
+
+    public void setPlanEndDate(String planEndDate) 
+    {
+        this.planEndDate = planEndDate;
+    }
+
+    public String getPlanEndDate() 
+    {
+        return planEndDate;
+    }
+
+    public void setDelFlag(String delFlag) 
+    {
+        this.delFlag = delFlag;
+    }
+
+    public String getDelFlag() 
+    {
+        return delFlag;
+    }
+
+    @Override
+    public String toString() {
+        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
+            .append("id", getId())
+            .append("docNo", getDocNo())
+            .append("shopCode", getShopCode())
+            .append("shopName", getShopName())
+            .append("planStartDate", getPlanStartDate())
+            .append("planEndDate", getPlanEndDate())
+            .append("delFlag", getDelFlag())
+            .append("createBy", getCreateBy())
+            .append("createTime", getCreateTime())
+            .append("updateBy", getUpdateBy())
+            .append("updateTime", getUpdateTime())
+            .toString();
+    }
+}
diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/mapper/ApsPlateProcessShopStatMapper.java b/aps-modules/aps-core/src/main/java/com/aps/core/mapper/ApsPlateProcessShopStatMapper.java
new file mode 100644
index 0000000..bca065d
--- /dev/null
+++ b/aps-modules/aps-core/src/main/java/com/aps/core/mapper/ApsPlateProcessShopStatMapper.java
@@ -0,0 +1,67 @@
+package com.aps.core.mapper;
+
+import java.util.List;
+import com.aps.core.domain.ApsPlateProcessShopStat;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 閽i噾杞﹂棿缁熻Mapper鎺ュ彛
+ * 
+ * @author zhl
+ * @date 2025-04-23
+ */
+@Mapper
+public interface ApsPlateProcessShopStatMapper 
+{
+    /**
+     * 鏌ヨ閽i噾杞﹂棿缁熻
+     * 
+     * @param id 閽i噾杞﹂棿缁熻涓婚敭
+     * @return 閽i噾杞﹂棿缁熻
+     */
+    public ApsPlateProcessShopStat selectApsPlateProcessShopStatById(Long id);
+
+    /**
+     * 鏌ヨ閽i噾杞﹂棿缁熻鍒楄〃
+     * 
+     * @param apsPlateProcessShopStat 閽i噾杞﹂棿缁熻
+     * @return 閽i噾杞﹂棿缁熻闆嗗悎
+     */
+    public List<ApsPlateProcessShopStat> selectApsPlateProcessShopStatList(ApsPlateProcessShopStat apsPlateProcessShopStat);
+
+    /**
+     * 鏂板閽i噾杞﹂棿缁熻
+     * 
+     * @param apsPlateProcessShopStat 閽i噾杞﹂棿缁熻
+     * @return 缁撴灉
+     */
+    public int insertApsPlateProcessShopStat(ApsPlateProcessShopStat apsPlateProcessShopStat);
+
+    /**
+     * 淇敼閽i噾杞﹂棿缁熻
+     * 
+     * @param apsPlateProcessShopStat 閽i噾杞﹂棿缁熻
+     * @return 缁撴灉
+     */
+    public int updateApsPlateProcessShopStat(ApsPlateProcessShopStat apsPlateProcessShopStat);
+
+    /**
+     * 鍒犻櫎閽i噾杞﹂棿缁熻
+     * 
+     * @param id 閽i噾杞﹂棿缁熻涓婚敭
+     * @return 缁撴灉
+     */
+    public int deleteApsPlateProcessShopStatById(Long id);
+
+    /**
+     * 鎵归噺鍒犻櫎閽i噾杞﹂棿缁熻
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑鏁版嵁涓婚敭闆嗗悎
+     * @return 缁撴灉
+     */
+    public int deleteApsPlateProcessShopStatByIds(Long[] ids);
+
+    int deleteAll();
+
+    void batchInsert(List<ApsPlateProcessShopStat> stats);
+}
diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/service/IApsPlateProcessShopStatService.java b/aps-modules/aps-core/src/main/java/com/aps/core/service/IApsPlateProcessShopStatService.java
new file mode 100644
index 0000000..2d76dc3
--- /dev/null
+++ b/aps-modules/aps-core/src/main/java/com/aps/core/service/IApsPlateProcessShopStatService.java
@@ -0,0 +1,67 @@
+package com.aps.core.service;
+
+import java.util.List;
+
+import com.aps.common.core.web.domain.AjaxResult;
+import com.aps.core.domain.ApsPlateProcessShopStat;
+
+/**
+ * 閽i噾杞﹂棿缁熻Service鎺ュ彛
+ * 
+ * @author zhl
+ * @date 2025-04-23
+ */
+public interface IApsPlateProcessShopStatService 
+{
+    /**
+     * 鏌ヨ閽i噾杞﹂棿缁熻
+     * 
+     * @param id 閽i噾杞﹂棿缁熻涓婚敭
+     * @return 閽i噾杞﹂棿缁熻
+     */
+    public ApsPlateProcessShopStat selectApsPlateProcessShopStatById(Long id);
+
+    /**
+     * 鏌ヨ閽i噾杞﹂棿缁熻鍒楄〃
+     * 
+     * @param apsPlateProcessShopStat 閽i噾杞﹂棿缁熻
+     * @return 閽i噾杞﹂棿缁熻闆嗗悎
+     */
+    public List<ApsPlateProcessShopStat> selectApsPlateProcessShopStatList(ApsPlateProcessShopStat apsPlateProcessShopStat);
+
+    /**
+     * 鏂板閽i噾杞﹂棿缁熻
+     * 
+     * @param apsPlateProcessShopStat 閽i噾杞﹂棿缁熻
+     * @return 缁撴灉
+     */
+    public int insertApsPlateProcessShopStat(ApsPlateProcessShopStat apsPlateProcessShopStat);
+
+    /**
+     * 淇敼閽i噾杞﹂棿缁熻
+     * 
+     * @param apsPlateProcessShopStat 閽i噾杞﹂棿缁熻
+     * @return 缁撴灉
+     */
+    public int updateApsPlateProcessShopStat(ApsPlateProcessShopStat apsPlateProcessShopStat);
+
+    /**
+     * 鎵归噺鍒犻櫎閽i噾杞﹂棿缁熻
+     * 
+     * @param ids 闇�瑕佸垹闄ょ殑閽i噾杞﹂棿缁熻涓婚敭闆嗗悎
+     * @return 缁撴灉
+     */
+    public int deleteApsPlateProcessShopStatByIds(Long[] ids);
+
+    /**
+     * 鍒犻櫎閽i噾杞﹂棿缁熻淇℃伅
+     * 
+     * @param id 閽i噾杞﹂棿缁熻涓婚敭
+     * @return 缁撴灉
+     */
+    public int deleteApsPlateProcessShopStatById(Long id);
+
+    void saveShopStat();
+
+    AjaxResult getShopPlanStat();
+}
diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlatePlanServiceImpl.java b/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlatePlanServiceImpl.java
index defb7ec..eb57e76 100644
--- a/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlatePlanServiceImpl.java
+++ b/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlatePlanServiceImpl.java
@@ -183,4 +183,7 @@
            return Strings.EMPTY;
         }
     }
+
+
+
 }
diff --git a/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlateProcessShopStatServiceImpl.java b/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlateProcessShopStatServiceImpl.java
new file mode 100644
index 0000000..dcaec74
--- /dev/null
+++ b/aps-modules/aps-core/src/main/java/com/aps/core/service/impl/ApsPlateProcessShopStatServiceImpl.java
@@ -0,0 +1,283 @@
+package com.aps.core.service.impl;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import com.alibaba.fastjson.JSONObject;
+import com.aps.common.core.utils.DateUtils;
+import com.aps.common.core.utils.bean.BeanUtils;
+import com.aps.common.core.web.domain.AjaxResult;
+import com.aps.common.security.utils.SecurityUtils;
+import com.aps.core.domain.*;
+import com.aps.core.mapper.*;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.aps.core.service.IApsPlateProcessShopStatService;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * 閽i噾杞﹂棿缁熻Service涓氬姟灞傚鐞�
+ *
+ * @author zhl
+ * @date 2025-04-23
+ */
+@Slf4j
+@Service
+public class ApsPlateProcessShopStatServiceImpl implements IApsPlateProcessShopStatService {
+    @Autowired
+    private ApsPlateProcessShopStatMapper apsPlateProcessShopStatMapper;
+    @Resource
+    private ApsPlateProcessStatMapper apsPlateProcessStatMapper;
+
+    @Resource
+    private ApsShopMapper shopMapper;
+
+    @Resource
+    private ApsStandardProcessMapper standardProcessMapper;
+
+    @Resource
+    private ApsPlatePlanMapper apsPlatePlanMapper;
+
+
+    /**
+     * 鏌ヨ閽i噾杞﹂棿缁熻
+     *
+     * @param id 閽i噾杞﹂棿缁熻涓婚敭
+     * @return 閽i噾杞﹂棿缁熻
+     */
+    @Override
+    public ApsPlateProcessShopStat selectApsPlateProcessShopStatById(Long id) {
+        return apsPlateProcessShopStatMapper.selectApsPlateProcessShopStatById(id);
+    }
+
+    /**
+     * 鏌ヨ閽i噾杞﹂棿缁熻鍒楄〃
+     *
+     * @param apsPlateProcessShopStat 閽i噾杞﹂棿缁熻
+     * @return 閽i噾杞﹂棿缁熻
+     */
+    @Override
+    public List<ApsPlateProcessShopStat> selectApsPlateProcessShopStatList(ApsPlateProcessShopStat apsPlateProcessShopStat) {
+        return apsPlateProcessShopStatMapper.selectApsPlateProcessShopStatList(apsPlateProcessShopStat);
+    }
+
+    /**
+     * 鏂板閽i噾杞﹂棿缁熻
+     *
+     * @param apsPlateProcessShopStat 閽i噾杞﹂棿缁熻
+     * @return 缁撴灉
+     */
+    @Override
+    public int insertApsPlateProcessShopStat(ApsPlateProcessShopStat apsPlateProcessShopStat) {
+        apsPlateProcessShopStat.setCreateTime(DateUtils.getNowDate());
+        return apsPlateProcessShopStatMapper.insertApsPlateProcessShopStat(apsPlateProcessShopStat);
+    }
+
+    /**
+     * 淇敼閽i噾杞﹂棿缁熻
+     *
+     * @param apsPlateProcessShopStat 閽i噾杞﹂棿缁熻
+     * @return 缁撴灉
+     */
+    @Override
+    public int updateApsPlateProcessShopStat(ApsPlateProcessShopStat apsPlateProcessShopStat) {
+        apsPlateProcessShopStat.setUpdateTime(DateUtils.getNowDate());
+        return apsPlateProcessShopStatMapper.updateApsPlateProcessShopStat(apsPlateProcessShopStat);
+    }
+
+    /**
+     * 鎵归噺鍒犻櫎閽i噾杞﹂棿缁熻
+     *
+     * @param ids 闇�瑕佸垹闄ょ殑閽i噾杞﹂棿缁熻涓婚敭
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteApsPlateProcessShopStatByIds(Long[] ids) {
+        return apsPlateProcessShopStatMapper.deleteApsPlateProcessShopStatByIds(ids);
+    }
+
+    /**
+     * 鍒犻櫎閽i噾杞﹂棿缁熻淇℃伅
+     *
+     * @param id 閽i噾杞﹂棿缁熻涓婚敭
+     * @return 缁撴灉
+     */
+    @Override
+    public int deleteApsPlateProcessShopStatById(Long id) {
+        return apsPlateProcessShopStatMapper.deleteApsPlateProcessShopStatById(id);
+    }
+
+    /**
+     * 淇濆瓨閽i噾杞﹂棿缁熻
+     */
+    @Transactional
+    @Override
+    public void saveShopStat() {
+        try {
+            // 寮�濮嬩箣鍓嶅厛鍒犻櫎鎵�鏈夊巻鍙叉暟鎹�
+            apsPlateProcessShopStatMapper.deleteAll();
+
+            // 瀹氫箟璇ュ姛鑳戒娇鐢ㄦ暟鎹簮涓哄崡閫氱殑宸ュ巶
+            final String plant = "FORTUNA";
+
+            // 鏌ヨ鐩稿叧鏁版嵁
+            ApsPlatePlan platePlan = new ApsPlatePlan();
+            platePlan.setPlant(plant);
+            List<ApsPlatePlan> planList = apsPlatePlanMapper.selectApsPlatePlanList(platePlan);
+
+            List<ApsPlateProcessStat> statList = apsPlateProcessStatMapper.selectApsPlateProcessStatList(new ApsPlateProcessStat());
+
+            ApsShop apsShop = new ApsShop();
+            apsShop.setPlantCode(plant);
+            List<ApsShop> shopList = shopMapper.selectApsShopList(apsShop);
+
+            ApsStandardProcess process = new ApsStandardProcess();
+            process.setPlant(plant);
+            List<ApsStandardProcess> shopProcesses = standardProcessMapper.selectApsStandardProcessList(process);
+            if (planList.isEmpty() || shopList.isEmpty() || shopProcesses.isEmpty()) {
+                log.warn("璁″垝鍒楄〃銆佽溅闂村垪琛ㄦ垨宸ュ簭鍒楄〃涓虹┖锛屾棤娉曠敓鎴愮粺璁′俊鎭�");
+                return;
+            }
+            // 鏋勫缓杞﹂棿鍚嶇О鍒板伐搴忓悕绉扮殑鏄犲皠
+            Map<String, List<String>> shopToProcessNames = shopProcesses.stream()
+                    .collect(Collectors.groupingBy(ApsStandardProcess::getWorkShop,
+                            Collectors.mapping(ApsStandardProcess::getProcessName, Collectors.toList())
+                    ));
+            // 鎵归噺鎻掑叆缁熻鏁版嵁
+            List<ApsPlateProcessShopStat> statsToInsert = new ArrayList<>();
+            for (ApsPlatePlan plan : planList) {
+                for (ApsShop shop : shopList) {
+                    ApsPlateProcessShopStat stat = createShopStat(plan, shop, shopToProcessNames, statList);
+                    statsToInsert.add(stat);
+                }
+            }
+            // 鎵归噺鎻掑叆浠ユ彁楂樻�ц兘
+            if (!statsToInsert.isEmpty()) {
+                int batchSize = 1000;
+                for (int i = 0; i < statsToInsert.size(); i += batchSize) {
+                    int end = Math.min(i + batchSize, statsToInsert.size());
+                    List<ApsPlateProcessShopStat> batch = statsToInsert.subList(i, end);
+                    apsPlateProcessShopStatMapper.batchInsert(batch);
+                }
+            }
+        } catch (Exception e) {
+            log.error("淇濆瓨閽i噾杞﹂棿缁熻鏃跺彂鐢熷紓甯�", e);
+            throw new RuntimeException("淇濆瓨閽i噾杞﹂棿缁熻澶辫触", e);
+        }
+    }
+
+    /**
+     * 鍒涘缓鍗曚釜杞﹂棿缁熻瀵硅薄
+     */
+    private ApsPlateProcessShopStat createShopStat(ApsPlatePlan plan, ApsShop shop,
+                                                   Map<String, List<String>> shopToProcessNames, List<ApsPlateProcessStat> statList) {
+        String shopName = shop.getShopName();
+        ApsPlateProcessShopStat stat = new ApsPlateProcessShopStat();
+        stat.setDocNo(plan.getDocumentNumber());
+        stat.setShopCode(shop.getShopCode());
+        stat.setShopName(shopName);
+        stat.setDelFlag("0");
+        stat.setCreateBy(SecurityUtils.getUsername());
+        stat.setCreateTime(DateUtils.getNowDate());
+
+        try {
+
+
+            List<String> processNames = shopToProcessNames.getOrDefault(shopName, Collections.emptyList());
+            if (!processNames.isEmpty()) {
+                // 鏍规嵁宸ュ簭鍚嶇О锛屾煡璇㈣宸ュ崟涓嬫墍鏈夌殑宸ュ簭淇℃伅
+                List<ApsPlateProcessStat> processStats = statList.stream()
+                        .filter(x -> processNames.contains(x.getProcessName()) && x.getWorkOrderNo().equals(plan.getDocumentNumber()))
+                        .toList();
+                if (!processStats.isEmpty()) {
+                    // 鍙栧嚭宸ュ崟涓嬪伐搴忕殑鏈�灏忓紑濮嬫椂闂村拰鏈�澶х粨鏉熸椂闂�
+                    List<Date> startDayList = processStats.stream().map(ApsPlateProcessStat::getProcessPlanStartDay).filter(Objects::nonNull).toList();
+                    if (!startDayList.isEmpty()) {
+                        if (startDayList.size() == 1) {
+                            stat.setPlanStartDate(DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", startDayList.get(0)));
+                        } else {
+                            Optional<Date> minStartDay = processStats.stream()
+                                    .map(ApsPlateProcessStat::getProcessPlanStartDay)
+                                    .min(Comparator.naturalOrder());
+                            Date date = minStartDay.get();
+                            stat.setPlanStartDate(DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", date));
+                        }
+
+
+                    }
+                    List<Date> endDayList = processStats.stream().map(ApsPlateProcessStat::getProcessPlanEndDay).filter(Objects::nonNull).toList();
+                    if (!endDayList.isEmpty()) {
+                        if (endDayList.size() == 1) {
+                            stat.setPlanEndDate(DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", endDayList.get(0)));
+                        } else {
+                            Optional<Date> maxEndDay = processStats.stream()
+                                    .map(ApsPlateProcessStat::getProcessPlanEndDay)
+                                    .max(Comparator.naturalOrder());
+                            Date date = maxEndDay.get();
+                            stat.setPlanEndDate(DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", date));
+                        }
+
+                    }
+
+                }
+            }
+        } catch (Exception e) {
+            log.error("computer error:"+ JSONObject.toJSONString(stat));
+        }
+        return stat;
+    }
+
+    @Override
+    public AjaxResult getShopPlanStat() {
+        // 鎻愬彇纭紪鐮佸�间负甯搁噺
+        final String PLANT_CODE = "FORTUNA";
+
+        // 鍒濆鍖栧璞�
+        ApsPlatePlan platePlan = new ApsPlatePlan();
+        platePlan.setPlant(PLANT_CODE);
+
+        ApsShop apsShop = new ApsShop();
+        apsShop.setPlantCode(PLANT_CODE);
+
+        // 鑾峰彇杞﹂棿鍒楄〃骞跺鐞嗙┖鍊�
+        List<String> shopList = Optional.ofNullable(shopMapper.selectApsShopList(apsShop))
+                .orElse(Collections.emptyList())
+                .stream()
+                .map(ApsShop::getShopName)
+                .toList();
+
+        // 鑾峰彇璁″垝鍒楄〃鍜岀姸鎬佸垪琛�
+        List<ApsPlatePlan> planList = Optional.ofNullable(apsPlatePlanMapper.selectApsPlatePlanList(platePlan))
+                .orElse(Collections.emptyList());
+
+        List<ApsPlateProcessShopStat> shopStates = Optional.ofNullable(apsPlateProcessShopStatMapper.selectApsPlateProcessShopStatList(new ApsPlateProcessShopStat()))
+                .orElse(Collections.emptyList());
+
+        // 鎻愬墠瀵� shopStates 鎸� docNo 鍒嗙粍锛屽噺灏戦噸澶嶆祦鎿嶄綔
+        Map<String, List<ApsPlateProcessShopStat>> shopStatesByDocNo = shopStates.stream()
+                .collect(Collectors.groupingBy(ApsPlateProcessShopStat::getDocNo));
+
+        // 鏋勫缓缁撴灉鍒楄〃
+        List<ApsPlateProcessShopPlanStat> shopPlanStats = planList.stream()
+                .map(plan -> {
+                    ApsPlateProcessShopPlanStat shopPlanStat = new ApsPlateProcessShopPlanStat();
+                    BeanUtils.copyProperties(plan, shopPlanStat); // 纭繚鐩爣瀵硅薄鏄悎娉曠殑鍗曚釜瀵硅薄瀹炰緥
+
+                    // 鏍规嵁 docNo 鑾峰彇瀵瑰簲鐨� shopStatList
+                    List<ApsPlateProcessShopStat> shopStatList = shopStatesByDocNo.getOrDefault(plan.getDocumentNumber(), Collections.emptyList());
+                    shopPlanStat.setDeptPlans(shopStatList);
+
+                    return shopPlanStat;
+                })
+                .toList();
+
+        // 鏋勫缓杩斿洖缁撴灉
+        AjaxResult success = AjaxResult.success(shopPlanStats);
+        success.put("shopNames", shopList);
+        return success;
+    }
+
+
+}
diff --git a/aps-modules/aps-core/src/main/resources/mapper/core/ApsPlatePlanMapper.xml b/aps-modules/aps-core/src/main/resources/mapper/core/ApsPlatePlanMapper.xml
index 9231a28..6d758ea 100644
--- a/aps-modules/aps-core/src/main/resources/mapper/core/ApsPlatePlanMapper.xml
+++ b/aps-modules/aps-core/src/main/resources/mapper/core/ApsPlatePlanMapper.xml
@@ -49,40 +49,41 @@
     <select id="selectApsPlatePlanList" parameterType="ApsPlatePlan" resultMap="ApsPlatePlanResult">
         <include refid="selectApsPlatePlanVo"/>
         <where>  
-            <if test="masterPlanner != null  and masterPlanner != ''"> and master_planner like concat('%', #{masterPlanner}, '%')</if>
+            <if test="masterPlanner != null  and masterPlanner != ''"> and master_planner like '%'|| #{masterPlanner}|| '%'</if>
             <if test="weekDay != null "> and week_day = #{weekDay}</if>
-            <if test="weekCycle != null  and weekCycle != ''"> and week_cycle like concat('%', #{weekCycle}, '%')</if>
-            <if test="mainPartNumber != null  and mainPartNumber != ''"> and main_part_number like concat('%', #{mainPartNumber}, '%')</if>
-            <if test="mainPartDrawingNumber != null  and mainPartDrawingNumber != ''"> and main_part_drawing_number like concat('%', #{mainPartDrawingNumber}, '%')</if>
+            <if test="weekCycle != null  and weekCycle != ''"> and week_cycle like '%'||  #{weekCycle}|| '%' </if>
+            <if test="mainPartNumber != null  and mainPartNumber != ''"> and main_part_number like '%'|| #{mainPartNumber}  ||'%' </if>
+            <if test="mainPartDrawingNumber != null  and mainPartDrawingNumber != ''"> and main_part_drawing_number like  '%'|| #{mainPartDrawingNumber}|| '%'</if>
             <if test="customer != null  and customer != ''"> and customer like  '%' || #{customer} || '%'</if>
             <if test="businessType != null  and businessType != ''"> and business_type = #{businessType}</if>
             <if test="documentNumber != null  and documentNumber != ''"> and document_number like '%'|| #{documentNumber}|| '%'</if>
-            <if test="requirementType != null  and requirementType != ''"> and requirement_type like concat('%', #{requirementType}, '%')</if>
+            <if test="requirementType != null  and requirementType != ''"> and requirement_type like   '%'|| #{requirementType}||'%' </if>
             <if test="documentStatus != null  and documentStatus != ''"> and document_status = #{documentStatus}</if>
-            <if test="itemNumber != null  and itemNumber != ''"> and item_number like concat('%', #{itemNumber}, '%')</if>
-            <if test="drawingNo != null  and drawingNo != ''"> and drawing_no like concat('%', #{drawingNo}, '%')</if>
-            <if test="versionNumber != null  and versionNumber != ''"> and version_number like concat('%', #{versionNumber}, '%')</if>
+            <if test="itemNumber != null  and itemNumber != ''"> and item_number like '%'|| #{itemNumber}|| '%'</if>
+            <if test="drawingNo != null  and drawingNo != ''"> and drawing_no like  '%'|| #{drawingNo}|| '%'</if>
+            <if test="versionNumber != null  and versionNumber != ''"> and version_number like  '%'|| #{versionNumber}|| '%'</if>
             <if test="productionQuantity != null "> and production_quantity = #{productionQuantity}</if>
             <if test="goodProductsQuantity != null "> and good_products_quantity = #{goodProductsQuantity}</if>
-            <if test="processNumber != null  and processNumber != ''"> and process_number like concat('%', #{processNumber}, '%')</if>
-            <if test="workCenter != null  and workCenter != ''"> and work_center like concat('%', #{workCenter}, '%')</if>
-            <if test="department != null  and department != ''"> and department like concat('%', #{department}, '%')</if>
+            <if test="processNumber != null  and processNumber != ''"> and process_number like  '%'|| #{processNumber}||'%'</if>
+            <if test="workCenter != null  and workCenter != ''"> and work_center like  '%'|| #{workCenter}||'%'</if>
+            <if test="department != null  and department != ''"> and department like  '%'|| #{department}||'%'</if>
             <if test="params.beginPlanStartDay != null and params.beginPlanStartDay != '' and params.endPlanStartDay != null and params.endPlanStartDay != ''"> and plan_start_day between #{params.beginPlanStartDay} and #{params.endPlanStartDay}</if>
             <if test="params.beginPlanEndDay != null and params.beginPlanEndDay != '' and params.endPlanEndDay != null and params.endPlanEndDay != ''"> and plan_end_day between #{params.beginPlanEndDay} and #{params.endPlanEndDay}</if>
-            <if test="standbyNumber != null  and standbyNumber != ''"> and standby_number like concat('%', #{standbyNumber}, '%')</if>
-            <if test="standbyName != null  and standbyName != ''"> and standby_name like concat('%', #{standbyName}, '%')</if>
+            <if test="standbyNumber != null  and standbyNumber != ''"> and standby_number like  '%'|| #{standbyNumber}|| '%'</if>
+            <if test="standbyName != null  and standbyName != ''"> and standby_name like  '%'|| #{standbyName}||'%'</if>
             <if test="standbyStock != null "> and standby_stock = #{standbyStock}</if>
-            <if test="nextProcessDeparment != null  and nextProcessDeparment != ''"> and next_process_deparment like concat('%', #{nextProcessDeparment}, '%')</if>
+            <if test="nextProcessDeparment != null  and nextProcessDeparment != ''"> and next_process_deparment like   '%'|| #{nextProcessDeparment}|| '%'</if>
             <if test="isSuspended != null "> and is_suspended = #{isSuspended}</if>
-            <if test="isOutsourcing != null  and isOutsourcing != ''"> and is_outsourcing like concat('%', #{isOutsourcing}, '%')</if>
-            <if test="account != null  and account != ''"> and account like concat('%', #{account}, '%')</if>
-            <if test="advancedMaterials != null  and advancedMaterials != ''"> and advanced_materials like concat('%', #{advancedMaterials}, '%')</if>
-            <if test="advancedDocumentNumber != null  and advancedDocumentNumber != ''"> and advanced_document_number like concat('%', #{advancedDocumentNumber}, '%')</if>
+            <if test="isOutsourcing != null  and isOutsourcing != ''"> and is_outsourcing like  '%'|| #{isOutsourcing}||'%'</if>
+            <if test="account != null  and account != ''"> and account like  '%'|| #{account}|| '%'</if>
+            <if test="advancedMaterials != null  and advancedMaterials != ''"> and advanced_materials like  '%'|| #{advancedMaterials}|| '%'</if>
+            <if test="advancedDocumentNumber != null  and advancedDocumentNumber != ''"> and advanced_document_number  '%'|| #{advancedDocumentNumber}|| '%'</if>
             <if test="params.beginAdvancedRequirementDay != null and params.beginAdvancedRequirementDay != '' and params.endAdvancedRequirementDay != null and params.endAdvancedRequirementDay != ''"> and advanced_requirement_day between #{params.beginAdvancedRequirementDay} and #{params.endAdvancedRequirementDay}</if>
             <if test="isPlanComplete != null "> and is_plan_complete = #{isPlanComplete}</if>
             <if test="isStockComplete != null "> and is_stock_complete = #{isStockComplete}</if>
             <if test="hasTurnback != null "> and has_turnback = #{hasTurnback}</if>
             <if test="hasRisk != null "> and has_risk = #{hasRisk}</if>
+            <if test="plant != null "> and plant = #{plant}</if>
              and del_flag='0'
         </where>
     </select>
diff --git a/aps-modules/aps-core/src/main/resources/mapper/core/ApsPlateProcessShopStatMapper.xml b/aps-modules/aps-core/src/main/resources/mapper/core/ApsPlateProcessShopStatMapper.xml
new file mode 100644
index 0000000..3292fc1
--- /dev/null
+++ b/aps-modules/aps-core/src/main/resources/mapper/core/ApsPlateProcessShopStatMapper.xml
@@ -0,0 +1,118 @@
+<?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.aps.core.mapper.ApsPlateProcessShopStatMapper">
+    
+    <resultMap type="ApsPlateProcessShopStat" id="ApsPlateProcessShopStatResult">
+        <result property="id"    column="id"    />
+        <result property="docNo"    column="doc_no"    />
+        <result property="shopCode"    column="shop_code"    />
+        <result property="shopName"    column="shop_name"    />
+        <result property="planStartDate"    column="plan_start_date"    />
+        <result property="planEndDate"    column="plan_end_date"    />
+        <result property="delFlag"    column="del_flag"    />
+        <result property="createBy"    column="create_by"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateBy"    column="update_by"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectApsPlateProcessShopStatVo">
+        select id, doc_no, shop_code, shop_name, plan_start_date, plan_end_date, del_flag, create_by, create_time, update_by, update_time from aps_plate_process_shop_stat
+    </sql>
+
+    <select id="selectApsPlateProcessShopStatList" parameterType="ApsPlateProcessShopStat" resultMap="ApsPlateProcessShopStatResult">
+        <include refid="selectApsPlateProcessShopStatVo"/>
+        <where>  
+            <if test="docNo != null  and docNo != ''"> and doc_no = #{docNo}</if>
+            <if test="shopCode != null  and shopCode != ''"> and shop_code = #{shopCode}</if>
+            <if test="shopName != null  and shopName != ''"> and shop_name = #{shopName}</if>
+            <if test="planStartDate != null  and planStartDate != ''"> and plan_start_date = #{planStartDate}</if>
+            <if test="planEndDate != null  and planEndDate != ''"> and plan_end_date = #{planEndDate}</if>
+             and del_flag='0'
+        </where>
+    </select>
+    
+    <select id="selectApsPlateProcessShopStatById" parameterType="Long" resultMap="ApsPlateProcessShopStatResult">
+        <include refid="selectApsPlateProcessShopStatVo"/>
+        where id = #{id}
+    </select>
+
+    <insert id="insertApsPlateProcessShopStat" parameterType="ApsPlateProcessShopStat" useGeneratedKeys="true" keyProperty="id">
+        insert into aps_plate_process_shop_stat
+        <trim prefix="(" suffix=")" suffixOverrides=",">
+            <if test="docNo != null">doc_no,</if>
+            <if test="shopCode != null">shop_code,</if>
+            <if test="shopName != null">shop_name,</if>
+            <if test="planStartDate != null">plan_start_date,</if>
+            <if test="planEndDate != null">plan_end_date,</if>
+            <if test="delFlag != null">del_flag,</if>
+            <if test="createBy != null">create_by,</if>
+            <if test="createTime != null">create_time,</if>
+            <if test="updateBy != null">update_by,</if>
+            <if test="updateTime != null">update_time,</if>
+         </trim>
+        <trim prefix="values (" suffix=")" suffixOverrides=",">
+            <if test="docNo != null">#{docNo},</if>
+            <if test="shopCode != null">#{shopCode},</if>
+            <if test="shopName != null">#{shopName},</if>
+            <if test="planStartDate != null">#{planStartDate},</if>
+            <if test="planEndDate != null">#{planEndDate},</if>
+            <if test="delFlag != null">#{delFlag},</if>
+            <if test="createBy != null">#{createBy},</if>
+            <if test="createTime != null">#{createTime},</if>
+            <if test="updateBy != null">#{updateBy},</if>
+            <if test="updateTime != null">#{updateTime},</if>
+         </trim>
+    </insert>
+
+    <update id="updateApsPlateProcessShopStat" parameterType="ApsPlateProcessShopStat">
+        update aps_plate_process_shop_stat
+        <trim prefix="SET" suffixOverrides=",">
+            <if test="docNo != null">doc_no = #{docNo},</if>
+            <if test="shopCode != null">shop_code = #{shopCode},</if>
+            <if test="shopName != null">shop_name = #{shopName},</if>
+            <if test="planStartDate != null">plan_start_date = #{planStartDate},</if>
+            <if test="planEndDate != null">plan_end_date = #{planEndDate},</if>
+            <if test="delFlag != null">del_flag = #{delFlag},</if>
+            <if test="createBy != null">create_by = #{createBy},</if>
+            <if test="createTime != null">create_time = #{createTime},</if>
+            <if test="updateBy != null">update_by = #{updateBy},</if>
+            <if test="updateTime != null">update_time = #{updateTime},</if>
+        </trim>
+        where id = #{id}
+    </update>
+
+    <delete id="deleteApsPlateProcessShopStatById" parameterType="Long">
+        delete from aps_plate_process_shop_stat where id = #{id}
+    </delete>
+
+    <delete id="deleteApsPlateProcessShopStatByIds" parameterType="String">
+        delete from aps_plate_process_shop_stat where id in 
+        <foreach item="id" collection="array" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </delete>
+    <delete id="deleteAll" >
+        delete from aps_plate_process_shop_stat where del_flag in ('0','1')
+    </delete>
+
+    <insert id="batchInsert" parameterType="java.util.List">
+        insert into aps_plate_process_shop_stat
+        (doc_no, shop_code, shop_name, plan_start_date, plan_end_date, del_flag, create_by, create_time)
+        values
+        <foreach collection="list" item="item" separator=",">
+        (
+            #{item.docNo},
+            #{item.shopCode},
+            #{item.shopName},
+            #{item.planStartDate},
+            #{item.planEndDate},
+            #{item.delFlag},
+            #{item.createBy},
+            #{item.createTime}
+        )
+        </foreach>
+    </insert>
+</mapper>
\ No newline at end of file
diff --git a/aps-modules/aps-core/src/main/resources/mapper/core/ApsShopMapper.xml b/aps-modules/aps-core/src/main/resources/mapper/core/ApsShopMapper.xml
index dc82aa4..fcb5e28 100644
--- a/aps-modules/aps-core/src/main/resources/mapper/core/ApsShopMapper.xml
+++ b/aps-modules/aps-core/src/main/resources/mapper/core/ApsShopMapper.xml
@@ -27,6 +27,7 @@
             <if test="shopCode != null  and shopCode != ''"> and shop_code = #{shopCode}</if>
             <if test="plantCode != null  and plantCode != ''"> and plant_code = #{plantCode}</if>
             <if test="status != null  and status != ''"> and status = #{status}</if>
+             and status='1'
         </where>
     </select>
     

--
Gitblit v1.9.3