159 Commity 30eba74fef ... 411248931c

Autor SHA1 Wiadomość Data
  hbx 411248931c 合格0 判定 3 dni temu
  hbx bb24fa0c88 Merge remote-tracking branch 'origin/master' 3 dni temu
  hbx b470559962 Merge remote-tracking branch 'origin/master' 3 dni temu
  hbx f81af2d625 模糊查询 3 dni temu
  sunxianglong c04d21bc50 优化 3 dni temu
  sunxianglong 5bffbb90f3 配置文件 6 dni temu
  sunxianglong 183332a4dd 生产管理导出优化 1 tydzień temu
  sunxianglong 887a09fa8c 机加订单领料工件绑定和ccd导出优化 1 tydzień temu
  sunxianglong 6ab5fae15f 大屏基础修改 1 tydzień temu
  sunxianglong 2c64192b22 优化PDA销售订单列表显示 2 tygodni temu
  sunxianglong 28b08e5624 销售订单工件绑定和装配订单绑定优化 2 tygodni temu
  sunxianglong 35c76a8057 优化 2 tygodni temu
  sunxianglong cc18ba12ad 加上时间查询 2 tygodni temu
  sunxianglong 60ed761a03 优化 3 tygodni temu
  sunxianglong a070e8e7dc 返修记录和产品生产记录工件码模糊查询 3 tygodni temu
  sunxianglong 47a46c6518 返修改为返工 3 tygodni temu
  sunxianglong 0e23122c32 称重后台优化 3 tygodni temu
  sunxianglong f9b67bd36c 称重后台优化 1 miesiąc temu
  sunxianglong eed3bd59f6 称重后台 1 miesiąc temu
  sunxianglong 1b80890636 称重后台+涂胶点位更改 1 miesiąc temu
  sunxianglong 50b35976c4 优化来料报检列表 1 miesiąc temu
  sunxianglong 98d229ec22 转码功能和mes辅助支持30位 1 miesiąc temu
  sunxianglong b82627c779 优化 1 miesiąc temu
  sunxianglong 5d25895ca1 Merge branch 'master' of http://121.36.46.135:3000/mes-ljz/mescloud 1 miesiąc temu
  sunxianglong 133e8f9018 优化后台,增加PDAGP12拍照质量校验和提交工位结果 1 miesiąc temu
  sunxianglong cc54bf4b47 PDA拍照功能,ERP销售出货 1 miesiąc temu
  liuwei 87292a18db Merge remote-tracking branch 'origin/master' 1 miesiąc temu
  liuwei b7569b4294 ccd优化 1 miesiąc temu
  liuwei cf40b081f2 导出按钮 1 miesiąc temu
  liuwei 6d4f4d7094 Merge remote-tracking branch 'origin/master' 1 miesiąc temu
  liuwei 77ba51e67f 导出按钮 1 miesiąc temu
  liuwei 7cea692714 CCD旧模板兼容 1 miesiąc temu
  liuwei f6900d013e 搅拌摩擦焊优化 1 miesiąc temu
  liuwei 7dff09c249 CCD显示总成气密NG数 2 miesięcy temu
  liuwei 472262ce61 增加工件码 2 miesięcy temu
  liuwei 37f61cf12b 旧模板兼容 2 miesięcy temu
  liuwei e6027c28e5 总成气密完成 2 miesięcy temu
  sunxianglong 560445c9bb Merge branch 'master' of http://121.36.46.135:3000/mes-ljz/mescloud 2 miesięcy temu
  sunxianglong 32da3160e2 优化入库订单列表 2 miesięcy temu
  sunxianglong 2aadce214d Merge branch 'master' of http://121.36.46.135:3000/mes-ljz/mescloud 2 miesięcy temu
  sunxianglong e171707002 涂胶优化,安装水冷板优化 2 miesięcy temu
  sunxianglong 9ee4cd7304 涂胶优化 2 miesięcy temu
  sunxianglong ae7b1434e1 Merge branch 'master' of http://121.36.46.135:3000/mes-ljz/mescloud 2 miesięcy temu
  sunxianglong 97f2a49f8b OP220-240 QM优化定时任务 2 miesięcy temu
  sunxianglong 92275bb972 优化 2 miesięcy temu
  sunxianglong c0a448948b 优化 2 miesięcy temu
  liuwei c1f021a700 Merge remote-tracking branch 'origin/master' 2 miesięcy temu
  liuwei 730f5a7361 大屏优化 2 miesięcy temu
  liuwei 9ec14841b4 大屏1.0版本 2 miesięcy temu
  liuwei 2477a9268e 大屏1.0版本 2 miesięcy temu
  liuwei cf61e798ba 大屏优化 2 miesięcy temu
  liuwei 48513005d4 报警信息隐藏 2 miesięcy temu
  liuwei da7651a696 大屏优化 2 miesięcy temu
  sunxianglong 1d2ade0e58 滚筒线接口,FSW接口优化,订单绑定优化 2 miesięcy temu
  sunxianglong b7ab98d5be 滚筒线接口,FSW接口优化,订单绑定优化 2 miesięcy temu
  sunxianglong 88b566ca31 滚筒线接口,FSW接口优化,订单绑定优化 2 miesięcy temu
  sunxianglong acb4aa240c Merge branch 'master' of http://121.36.46.135:3000/mes-ljz/mescloud 2 miesięcy temu
  sunxianglong 9ef089c330 绝缘耐压列表数据,绑定逻辑优化 2 miesięcy temu
  sunxianglong 9757e3be29 Merge branch 'master' of http://121.36.46.135:3000/mes-ljz/mescloud 2 miesięcy temu
  sunxianglong ece4805294 Merge branch 'master' of http://121.36.46.135:3000/mes-ljz/mescloud 2 miesięcy temu
  sunxianglong 6e14d97dd1 对接搅拌焊,机加工件绑定,优化整形逻辑 2 miesięcy temu
  sunxianglong a3fc0dd18f 友智搅拌焊,华程锁付,cnc详情优化,订单和工件绑定加上NG不能入库 2 miesięcy temu
  sunxianglong ac153c1514 Merge branch 'master' of http://121.36.46.135:3000/mes-ljz/mescloud 2 miesięcy temu
  sunxianglong 6001900334 绝缘耐压,ccd 2 miesięcy temu
  sunxianglong 20e2194306 绝缘耐压,ccd 2 miesięcy temu
  sunxianglong 056225176e Merge branch 'master' of http://121.36.46.135:3000/mes-ljz/mescloud 2 miesięcy temu
  sunxianglong 494b856c56 报废功能,pda对接测试 2 miesięcy temu
  liuwei d283abfe31 Merge remote-tracking branch 'origin/master' 2 miesięcy temu
  liuwei 22dcf8bb35 pda接口优化 2 miesięcy temu
  liuwei c24a9d84c5 pda优化 2 miesięcy temu
  liuwei 7e0127d629 来料报检单生成pdf初始化 2 miesięcy temu
  sunxianglong 80befcd7dd Merge branch 'master' of http://121.36.46.135:3000/mes-ljz/mescloud 2 miesięcy temu
  sunxianglong 8339aa1aac 密度测量优化,报废导出 2 miesięcy temu
  sunxianglong 0029bcab56 Merge branch 'master' of http://121.36.46.135:3000/mes-ljz/mescloud 3 miesięcy temu
  sunxianglong fb82006a71 密度测量,销售出货单 3 miesięcy temu
  sunxianglong 91be9ea049 Merge branch 'master' of http://121.36.46.135:3000/mes-ljz/mescloud 3 miesięcy temu
  sunxianglong b61e7b0f0a erp销售出货单,优化探伤记录 3 miesięcy temu
  sunxianglong 4e5dc8cd7d cnc参数展示,优化来料报检小数问题 3 miesięcy temu
  sunxianglong 98a604851b 优化,订单工件绑定 3 miesięcy temu
  sunxianglong b945c5de0b 硬度优化,设备模具工件绑定接口 3 miesięcy temu
  sunxianglong b828c40a2c 硬度模块,短信新增模版,订单优化,工序优化 3 miesięcy temu
  dkk dc258ef03e Merge remote-tracking branch 'origin/master' 3 miesięcy temu
  dkk f669229258 新增硬度检测菜单,新增剩余批次码预警功能 3 miesięcy temu
  dkk eb5beba2cd 新增模具维保项,模具维保计划表,实现模具批次生产数的记录 3 miesięcy temu
  sunxianglong 9972ec542a 发送短信和pda模块优化 3 miesięcy temu
  dkk 5479353540 新增设备实时属性列表 3 miesięcy temu
  sunxianglong 914c6448ce Merge branch 'master' of http://121.36.46.135:3000/mes-ljz/mescloud 4 miesięcy temu
  sunxianglong 504b65c7b0 来料检查优化 4 miesięcy temu
  sunxianglong 375154f349 光谱仪数据修改,完工报告接口 4 miesięcy temu
  dkk 07252624a4 优化 4 miesięcy temu
  dkk e3995f28d9 新增设备和模具维保的导出excel表的功能 4 miesięcy temu
  sunxianglong 11510ec905 生产领料,退料,订单列表详情 4 miesięcy temu
  sunxianglong 3e06449100 模具,返修,检查项优化,生产订单 4 miesięcy temu
  sunxianglong 9ffcf199b8 优化 4 miesięcy temu
  sunxianglong 49e7827157 Merge branch 'master' of http://121.36.46.135:3000/mes-ljz/mescloud 4 miesięcy temu
  sunxianglong 9a746d9f00 模具维修记录和ERP完工报告 4 miesięcy temu
  sunxianglong 35c79eaa8b Merge branch 'master' of http://121.36.46.135:3000/mes-ljz/mescloud 4 miesięcy temu
  sunxianglong f0808cb152 生产订单和优化 4 miesięcy temu
  sunxianglong a34ba954f2 生产订单和优化 4 miesięcy temu
  dkk 96fafa4a66 添加设备保养,模具保养,保养记录,设备工位四个列表 4 miesięcy temu
  sunxianglong 0dde876159 erp和080工位修改 4 miesięcy temu
  sunxianglong dae995f366 OP080和erp对接 4 miesięcy temu
  zhanghe a987d38255 多数据源配置 4 miesięcy temu
  zhanghe 84de22b42e 锯切实体类更改 4 miesięcy temu
  zhanghe 775586231d 点位测试 4 miesięcy temu
  zhanghe 1f263242ea 锯切设备定时获取 4 miesięcy temu
  zhanghe 3781844e60 不良品处理优化 4 miesięcy temu
  zhanghe 43d83d47e4 绑定水冷版 4 miesięcy temu
  zhanghe 743f22a78a 大屏优化 4 miesięcy temu
  zhanghe 32ed2e8e3f 报警类型更新状态 4 miesięcy temu
  zhanghe da3aca0307 底护板验证取消 4 miesięcy temu
  zhanghe 7e31e216d1 FSW数据获取 4 miesięcy temu
  zhanghe d0a37c11b2 拆包扫码PDA接口 4 miesięcy temu
  zhanghe f6dd965e8b 维修 4 miesięcy temu
  zhanghe 328714e8d6 报废处理 4 miesięcy temu
  zhanghe 456f261c16 数据看板 4 miesięcy temu
  zhanghe 7d6118f94c 点检提交 4 miesięcy temu
  zhanghe 626568deab 拆包记录 4 miesięcy temu
  zhanghe d32a94fdcb 定时任务时间优化 4 miesięcy temu
  zhanghe 5cdb3e1a55 热处理参数获取 4 miesięcy temu
  zhanghe db656cd239 铸造参数获取 4 miesięcy temu
  zhanghe 7cb2b1c596 铸造参数获取 4 miesięcy temu
  zhanghe 7fc85a2a98 大屏数据调整 5 miesięcy temu
  zhanghe 2e048b83ef 大屏生产计划 5 miesięcy temu
  zhanghe 5a68d4624a Merge remote-tracking branch 'origin/master' 5 miesięcy temu
  zhanghe d250328871 大屏生产计划 5 miesięcy temu
  zhanghe 17fc75cd49 入库优化 5 miesięcy temu
  zhanghe 2dbe2ec8a4 送检流程 5 miesięcy temu
  zhanghe d1f1ac3837 送检、测量上传、结果判定 5 miesięcy temu
  zhanghe ff19baddd6 半成品、成品入库 5 miesięcy temu
  zhanghe 421643383d 添加上传附件、查看附件功能 5 miesięcy temu
  zhanghe 78151c41ac 光谱仪 5 miesięcy temu
  zhanghe 8c995c7b8f 优化 5 miesięcy temu
  zhanghe 7cb72279fd 优化 5 miesięcy temu
  zhanghe 74be111e44 抽检 5 miesięcy temu
  zhanghe 5a6cdd2bdf Merge remote-tracking branch 'origin/master' 5 miesięcy temu
  zhanghe 085aca6e94 优化 5 miesięcy temu
  zhanghe e24b6dcaf3 更改路径 5 miesięcy temu
  zhanghe e978689688 优化 5 miesięcy temu
  zhanghe d7709c363e 优化 5 miesięcy temu
  day01-init 3aec7bbc4c 打印功能和出库单管理页面 5 miesięcy temu
  zhanghe ef9cbcd85a 修改工位结果优化 5 miesięcy temu
  zhanghe a8b0b438fa 生产订单优化 5 miesięcy temu
  zhanghe 63f6cfd72b 适配多条产线优化 5 miesięcy temu
  zhanghe edc88e9202 生产领料单优化 5 miesięcy temu
  zhanghe 4145ca1137 Merge remote-tracking branch 'origin/master' 5 miesięcy temu
  zhanghe 5de3f919e8 模板优化 5 miesięcy temu
  zhanghe b18d73ce90 优化 5 miesięcy temu
  zhanghe 8c8f3d58a9 入库记录 5 miesięcy temu
  zhanghe b873e85329 优化 5 miesięcy temu
  zhanghe fdc6600441 登录界面ui修改 5 miesięcy temu
  zhanghe f145bb0e8d Merge remote-tracking branch 'origin/master' 5 miesięcy temu
  zhanghe 8fb50aa8e7 生产领料单 5 miesięcy temu
  zhanghe b5da1e8b76 生产订单 5 miesięcy temu
  zhanghe f4a1320fe5 大屏2 5 miesięcy temu
  zhanghe f6ed5f9ef1 物料 5 miesięcy temu
  zhanghe 87483681ca mes辅助优化 5 miesięcy temu
  zhanghe fb77b05b80 生产记录创建模板优化 5 miesięcy temu
  zhanghe bad4ee9317 初始化 5 miesięcy temu

+ 11 - 0
db/menu_dump.txt

@@ -0,0 +1,11 @@
+lineTitle	lineSn	oprno	title	pid	outputCount
+XT	XT	OP060A	切割打磨	2066721003667562496	680
+XT	XT	OP070A	X光探伤	2066721120843833344	225
+XT	XT	OP080A	热处理T5	2066721310644477952	644
+XT	XT	OP090A	检验&整形	2066721479188389888	598
+XT	XT	OP100A	毛坯入库	2066757943422406656	588
+XT	XT	OP110A	机加工一序	2077639186612449280	118
+XT	XT	OP110B	机加工一序	2077639186612449280	119
+XT	XT	OP120A	氩弧焊中间横梁	2077639740747116544	239
+XT	XT	OP130A	机加工二序	2077640264024289280	135
+XT	XT	OP130B	机加工二序	2077640264024289280	127

+ 39 - 0
src/main/java/com/jeesite/modules/mes/dao/MesLineCapacityDao.java

@@ -0,0 +1,39 @@
+package com.jeesite.modules.mes.dao;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import com.jeesite.common.mybatis.annotation.MyBatisDao;
+import org.apache.ibatis.annotations.Param;
+
+/**
+ * 产线产能管理DAO接口
+ * @author mes
+ * @version 2026-10-30
+ */
+@MyBatisDao
+public interface MesLineCapacityDao {
+
+	/**
+	 * 按工位汇总指定时间段内的产量
+	 */
+	List<Map<String, Object>> findCapacityList(
+			@Param("lineId") String lineId,
+			@Param("lineSn") String lineSn,
+			@Param("oprno") String oprno,
+			@Param("title") String title,
+			@Param("startTime") Date startTime,
+			@Param("endTime") Date endTime,
+			@Param("offset") int offset,
+			@Param("limit") int limit);
+
+	/**
+	 * 统计符合条件的工位数量
+	 */
+	long findCapacityCount(
+			@Param("lineId") String lineId,
+			@Param("lineSn") String lineSn,
+			@Param("oprno") String oprno,
+			@Param("title") String title);
+}

+ 100 - 0
src/main/java/com/jeesite/modules/mes/entity/MesLineCapacity.java

@@ -0,0 +1,100 @@
+package com.jeesite.modules.mes.entity;
+
+/**
+ * 产线产能管理查询对象(按工位汇总生产记录)
+ * @author mes
+ * @version 2026-10-30
+ */
+public class MesLineCapacity {
+
+	private String lineId;			// 生产线id
+	private String lineSn;			// 产线编号
+	private String lineTitle;		// 生产线名称
+	private String oprno;			// 工位号
+	private String title;			// 工位名称
+	private String pid;				// 父级工位id
+	private Integer sorts;			// 工位排序
+	private Long outputCount;		// 产量
+	private String startDate;		// 统计开始时间
+	private String endDate;			// 统计结束时间
+
+	public String getLineId() {
+		return lineId;
+	}
+
+	public void setLineId(String lineId) {
+		this.lineId = lineId;
+	}
+
+	public String getLineSn() {
+		return lineSn;
+	}
+
+	public void setLineSn(String lineSn) {
+		this.lineSn = lineSn;
+	}
+
+	public String getLineTitle() {
+		return lineTitle;
+	}
+
+	public void setLineTitle(String lineTitle) {
+		this.lineTitle = lineTitle;
+	}
+
+	public String getOprno() {
+		return oprno;
+	}
+
+	public void setOprno(String oprno) {
+		this.oprno = oprno;
+	}
+
+	public String getTitle() {
+		return title;
+	}
+
+	public void setTitle(String title) {
+		this.title = title;
+	}
+
+	public String getPid() {
+		return pid;
+	}
+
+	public void setPid(String pid) {
+		this.pid = pid;
+	}
+
+	public Integer getSorts() {
+		return sorts;
+	}
+
+	public void setSorts(Integer sorts) {
+		this.sorts = sorts;
+	}
+
+	public Long getOutputCount() {
+		return outputCount;
+	}
+
+	public void setOutputCount(Long outputCount) {
+		this.outputCount = outputCount;
+	}
+
+	public String getStartDate() {
+		return startDate;
+	}
+
+	public void setStartDate(String startDate) {
+		this.startDate = startDate;
+	}
+
+	public String getEndDate() {
+		return endDate;
+	}
+
+	public void setEndDate(String endDate) {
+		this.endDate = endDate;
+	}
+}

+ 31 - 0
src/main/java/com/jeesite/modules/mes/service/MesLineCapacityService.java

@@ -0,0 +1,31 @@
+package com.jeesite.modules.mes.service;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.jeesite.modules.mes.dao.MesLineCapacityDao;
+
+/**
+ * 产线产能管理Service
+ * @author mes
+ * @version 2026-10-30
+ */
+@Service
+public class MesLineCapacityService {
+
+	@Autowired
+	private MesLineCapacityDao mesLineCapacityDao;
+
+	public List<Map<String, Object>> findCapacityList(String lineId, String lineSn, String oprno, String title,
+			Date startTime, Date endTime, int offset, int limit) {
+		return mesLineCapacityDao.findCapacityList(lineId, lineSn, oprno, title, startTime, endTime, offset, limit);
+	}
+
+	public long findCapacityCount(String lineId, String lineSn, String oprno, String title) {
+		return mesLineCapacityDao.findCapacityCount(lineId, lineSn, oprno, title);
+	}
+}

+ 161 - 0
src/main/java/com/jeesite/modules/mes/web/MesLineCapacityController.java

@@ -0,0 +1,161 @@
+package com.jeesite.modules.mes.web;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.jeesite.common.entity.Page;
+import com.jeesite.common.lang.StringUtils;
+import com.jeesite.common.web.BaseController;
+import com.jeesite.modules.mes.entity.MesLine;
+import com.jeesite.modules.mes.entity.MesLineCapacity;
+import com.jeesite.modules.mes.req.MesSearchDateReq;
+import com.jeesite.modules.mes.service.MesLineCapacityService;
+import com.jeesite.modules.mes.service.MesLineService;
+import com.jeesite.modules.mes.util.CommonUitl;
+
+/**
+ * 产线产能管理Controller
+ * @author mes
+ * @version 2026-10-30
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/mes/mesLineCapacity")
+public class MesLineCapacityController extends BaseController {
+
+	private static final String DATETIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
+	private static final String MINUTE_PATTERN = "yyyy-MM-dd HH:mm";
+	private static final String DATE_PATTERN = "yyyy-MM-dd";
+
+	@Autowired
+	private MesLineCapacityService mesLineCapacityService;
+
+	@Autowired
+	private MesLineService mesLineService;
+
+	/**
+	 * 查询列表(默认统计最近 7 天,与生产记录管理等页面的默认查询区间一致)
+	 */
+	@RequiresPermissions("mes:mesLineCapacity:view")
+	@RequestMapping(value = {"list", ""})
+	public String list(MesLineCapacity mesLineCapacity, Model model) {
+		if (StringUtils.isBlank(mesLineCapacity.getStartDate()) && StringUtils.isBlank(mesLineCapacity.getEndDate())) {
+			Date[] defaultRange = getDefaultDateRange();
+			SimpleDateFormat sdf = new SimpleDateFormat(MINUTE_PATTERN);
+			mesLineCapacity.setStartDate(sdf.format(defaultRange[0]));
+			mesLineCapacity.setEndDate(sdf.format(defaultRange[1]));
+		}
+		model.addAttribute("mesLineCapacity", mesLineCapacity);
+		model.addAttribute("lineList", mesLineService.findList(new MesLine()));
+		return "modules/mes/mesLineCapacityList";
+	}
+
+	/**
+	 * 查询列表数据
+	 */
+	@RequiresPermissions("mes:mesLineCapacity:view")
+	@RequestMapping(value = "listData")
+	@ResponseBody
+	public Page<Map<String, Object>> listData(MesLineCapacity mesLineCapacity, HttpServletRequest request,
+			HttpServletResponse response) {
+		Page<Map<String, Object>> page = new Page<>(request, response);
+
+		Date startTime = parseDate(mesLineCapacity.getStartDate(), false);
+		Date endTime = parseDate(mesLineCapacity.getEndDate(), true);
+		if (startTime == null && endTime == null) {
+			Date[] defaultRange = getDefaultDateRange();
+			startTime = defaultRange[0];
+			endTime = defaultRange[1];
+		} else if (startTime == null) {
+			Calendar calendar = Calendar.getInstance();
+			calendar.setTime(endTime);
+			calendar.add(Calendar.DAY_OF_MONTH, -1);
+			startTime = calendar.getTime();
+		} else if (endTime == null) {
+			Calendar calendar = Calendar.getInstance();
+			calendar.setTime(startTime);
+			calendar.add(Calendar.DAY_OF_MONTH, 1);
+			endTime = calendar.getTime();
+		}
+		if (!endTime.after(startTime)) {
+			Calendar calendar = Calendar.getInstance();
+			calendar.setTime(startTime);
+			calendar.add(Calendar.DAY_OF_MONTH, 1);
+			endTime = calendar.getTime();
+		}
+
+		int pageNo = page.getPageNo() < 1 ? 1 : page.getPageNo();
+		int pageSize = page.getPageSize() < 1 ? 20 : page.getPageSize();
+		int offset = (pageNo - 1) * pageSize;
+
+		List<Map<String, Object>> list = mesLineCapacityService.findCapacityList(
+				StringUtils.trimToEmpty(mesLineCapacity.getLineId()),
+				StringUtils.trimToEmpty(mesLineCapacity.getLineSn()),
+				StringUtils.trimToEmpty(mesLineCapacity.getOprno()),
+				StringUtils.trimToEmpty(mesLineCapacity.getTitle()),
+				startTime, endTime, offset, pageSize);
+		long count = mesLineCapacityService.findCapacityCount(
+				StringUtils.trimToEmpty(mesLineCapacity.getLineId()),
+				StringUtils.trimToEmpty(mesLineCapacity.getLineSn()),
+				StringUtils.trimToEmpty(mesLineCapacity.getOprno()),
+				StringUtils.trimToEmpty(mesLineCapacity.getTitle()));
+
+		page.setCount((int) count);
+		page.setList(list);
+		return page;
+	}
+
+	/**
+	 * 默认统计区间:最近 N 天(N 由配置 mes.search.days 控制,默认 7)
+	 * 与生产记录管理、探伤记录等页面的默认查询区间保持一致
+	 */
+	private Date[] getDefaultDateRange() {
+		MesSearchDateReq dateMap = CommonUitl.getSearchDate();
+		Calendar calendar = Calendar.getInstance();
+		calendar.setTime(dateMap.getEndtDate());
+		calendar.set(Calendar.SECOND, 59);
+		calendar.set(Calendar.MILLISECOND, 0);
+		return new Date[] { dateMap.getStartDate(), calendar.getTime() };
+	}
+
+	/**
+	 * 解析查询时间,支持 yyyy-MM-dd HH:mm:ss、yyyy-MM-dd HH:mm、yyyy-MM-dd
+	 */
+	private Date parseDate(String value, boolean isEnd) {
+		if (StringUtils.isBlank(value)) {
+			return null;
+		}
+		String text = value.trim();
+		String[] patterns = new String[] {DATETIME_PATTERN, MINUTE_PATTERN, DATE_PATTERN};
+		for (String pattern : patterns) {
+			try {
+				SimpleDateFormat sdf = new SimpleDateFormat(pattern);
+				sdf.setLenient(false);
+				Date date = sdf.parse(text);
+				if (isEnd && DATE_PATTERN.equals(pattern)) {
+					Calendar calendar = Calendar.getInstance();
+					calendar.setTime(date);
+					calendar.add(Calendar.DAY_OF_MONTH, 1);
+					return calendar.getTime();
+				}
+				return date;
+			} catch (ParseException e) {
+				// 尝试下一种格式
+			}
+		}
+		return null;
+	}
+}

+ 36 - 0
src/main/java/com/jeesite/modules/mes/web/MesMaterialCheckRecordController.java

@@ -98,11 +98,23 @@ public class MesMaterialCheckRecordController extends BaseController {
 	@RequestMapping(value = "listData")
 	@ResponseBody
 	public Page<MesMaterialCheckRecord> listData(MesMaterialCheckRecord mesMaterialCheckRecord, HttpServletRequest request, HttpServletResponse response) {
+		applySnLikeQuery(mesMaterialCheckRecord);
 		mesMaterialCheckRecord.setPage(new Page<>(request, response));
 		Page<MesMaterialCheckRecord> page = mesMaterialCheckRecordService.findPage(mesMaterialCheckRecord);
 		return page;
 	}
 
+	/**
+	 * 来料码改为模糊查询(仅用于列表查询/导出,PDA 扫码入库走 findInfo 精确匹配,不受影响)
+	 */
+	private void applySnLikeQuery(MesMaterialCheckRecord mesMaterialCheckRecord) {
+		String sn = mesMaterialCheckRecord.getSn();
+		if (StringUtils.isNotBlank(sn)) {
+			mesMaterialCheckRecord.setSn(null);
+			mesMaterialCheckRecord.getSqlMap().getWhere().and("a.sn", QueryType.LIKE, sn);
+		}
+	}
+
 
 	/**
 	 * 导出数据
@@ -110,6 +122,7 @@ public class MesMaterialCheckRecordController extends BaseController {
 	@RequiresPermissions("mes:mesMaterialCheckRecord:view")
 	@RequestMapping(value = "exportData")
 	public void exportData(MesMaterialCheckRecord mesMaterialCheckRecord, HttpServletResponse response) {
+		applySnLikeQuery(mesMaterialCheckRecord);
 		List<MesMaterialCheckRecord> list = mesMaterialCheckRecordService.findList(mesMaterialCheckRecord);
 		String fileName = "来料检查记录" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx";
 		try (ExcelExport ee = new ExcelExport("来料检查记录", MesMaterialCheckRecord.class)) {
@@ -315,6 +328,29 @@ public class MesMaterialCheckRecordController extends BaseController {
 		map.put("result", result);
 		map.put("info", ma);
 		map.put("mitList", mitList);
+
+		// 取工件码第4段(物料编码)到“来料检查记录”做模糊查询,按检查日期取最新一条,
+		// 不合格数量为0显示“合格”,否则显示“不合格”
+		MesMaterialCheckRecord latestCheckRecord = null;
+		if (StringUtils.isNotBlank(result[3])) {
+			MesMaterialCheckRecord historyQuery = new MesMaterialCheckRecord();
+			historyQuery.setStatus(MesMaterialCheckRecord.STATUS_NORMAL);
+			historyQuery.getSqlMap().getWhere().and("a.sn", QueryType.LIKE, result[3].trim());
+			historyQuery.getSqlMap().getOrder().setOrderBy("a.create_date DESC");
+			latestCheckRecord = mesMaterialCheckRecordService.findInfo(historyQuery);
+		}
+		String inspectLevel = "";
+		if (latestCheckRecord != null) {
+			double bhgQtyValue = 0D;
+			try {
+				bhgQtyValue = Double.parseDouble(StringUtils.defaultIfBlank(latestCheckRecord.getBhgQty(), "0").trim());
+			} catch (NumberFormatException e) {
+				bhgQtyValue = 0D;
+			}
+			inspectLevel = bhgQtyValue == 0D ? "合格" : "不合格";
+		}
+		map.put("inspectLevel", inspectLevel);
+
 		resp.setData(map);
 		resp.setResult(Global.TRUE);
 		return resp;

+ 14 - 0
src/main/java/com/jeesite/modules/mes/web/MesMaterialReportController.java

@@ -25,6 +25,7 @@ import com.jeesite.common.config.Global;
 import com.jeesite.common.collect.ListUtils;
 import com.jeesite.common.entity.Page;
 import com.jeesite.common.lang.DateUtils;
+import com.jeesite.common.mybatis.mapper.query.QueryType;
 import com.jeesite.common.utils.excel.ExcelExport;
 import com.jeesite.common.utils.excel.annotation.ExcelField.Type;
 import org.springframework.web.multipart.MultipartFile;
@@ -89,12 +90,24 @@ public class MesMaterialReportController extends BaseController {
 	@RequestMapping(value = "listData")
 	@ResponseBody
 	public Page<MesMaterialReport> listData(MesMaterialReport mesMaterialReport, HttpServletRequest request, HttpServletResponse response) {
+		applySnLikeQuery(mesMaterialReport);
 		mesMaterialReport.setPage(new Page<>(request, response));
 		Page<MesMaterialReport> page = mesMaterialReportService.findPage(mesMaterialReport);
 		return page;
 	}
 
 	/**
+	 * 来料码改为模糊查询(仅用于列表查询/导出,PDA 扫码相关逻辑仍走精确匹配,不受影响)
+	 */
+	private void applySnLikeQuery(MesMaterialReport mesMaterialReport) {
+		String sn = mesMaterialReport.getSn();
+		if (StringUtils.isNotBlank(sn)) {
+			mesMaterialReport.setSn(null);
+			mesMaterialReport.getSqlMap().getWhere().and("a.sn", QueryType.LIKE, sn);
+		}
+	}
+
+	/**
 	 * 查看编辑表单
 	 */
 	@RequiresPermissions("mes:mesMaterialReport:view")
@@ -121,6 +134,7 @@ public class MesMaterialReportController extends BaseController {
 	@RequiresPermissions("mes:mesMaterialReport:view")
 	@RequestMapping(value = "exportData")
 	public void exportData(MesMaterialReport mesMaterialReport, HttpServletResponse response) {
+		applySnLikeQuery(mesMaterialReport);
 		List<MesMaterialReport> list = mesMaterialReportService.findList(mesMaterialReport);
 		String fileName = "来料报检" + DateUtils.getDate("yyyyMMddHHmmss") + ".xlsx";
 		try(ExcelExport ee = new ExcelExport("来料报检", MesMaterialReport.class)){

+ 60 - 0
src/main/resources/mappings/modules/mes/MesLineCapacityDao.xml

@@ -0,0 +1,60 @@
+<?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.jeesite.modules.mes.dao.MesLineCapacityDao">
+
+    <!-- 主工位(pid 为空的为工位,pid 不为空的是其子工位)基础条件 -->
+    <sql id="capacityWhere">
+        WHERE lp.status = '0'
+          AND ml.status = '0'
+          AND lp.pid IS NULL
+        <if test="lineId != null and lineId != ''">
+            AND ml.id = #{lineId}
+        </if>
+        <if test="lineSn != null and lineSn != ''">
+            AND ml.sn = #{lineSn}
+        </if>
+        <if test="oprno != null and oprno != ''">
+            AND lp.oprno LIKE CONCAT('%', #{oprno}, '%')
+        </if>
+        <if test="title != null and title != ''">
+            AND lp.title LIKE CONCAT('%', #{title}, '%')
+        </if>
+    </sql>
+
+    <!--
+        按主工位统计产量:口径与产线大屏“实际产能”一致(工艺号 100000 且结果不为 UDF)。
+        生产记录的工位号可能带子工位后缀(如 OP060A、OP110B),统一按前 5 位(OPxxx)归并到主工位,
+        避免主工位、子工位重复统计。
+    -->
+    <select id="findCapacityList" resultType="java.util.LinkedHashMap">
+        SELECT
+            ml.title AS lineTitle,
+            ml.sn AS lineSn,
+            lp.oprno AS oprno,
+            lp.title AS title,
+            lp.sorts AS sorts,
+            IFNULL(t.outputCount, 0) AS outputCount
+        FROM mes_line_process lp
+        INNER JOIN mes_line ml ON ml.id = lp.line_id
+        LEFT JOIN (
+            SELECT pr.line_sn AS lineSn, LEFT(pr.oprno, 5) AS oprno, COUNT(1) AS outputCount
+            FROM mes_product_record pr
+            WHERE pr.update_date <![CDATA[ >= ]]> #{startTime}
+              AND pr.update_date <![CDATA[ < ]]> #{endTime}
+              AND pr.craft = '100000'
+              AND UPPER(TRIM(IFNULL(pr.content, ''))) <![CDATA[ <> ]]> 'UDF'
+            GROUP BY pr.line_sn, LEFT(pr.oprno, 5)
+        ) t ON t.lineSn = ml.sn AND t.oprno = lp.oprno
+        <include refid="capacityWhere"/>
+        ORDER BY ml.sn ASC, IFNULL(lp.sorts, 0) ASC, lp.oprno ASC
+        LIMIT #{offset}, #{limit}
+    </select>
+
+    <select id="findCapacityCount" resultType="java.lang.Long">
+        SELECT COUNT(1)
+        FROM mes_line_process lp
+        INNER JOIN mes_line ml ON ml.id = lp.line_id
+        <include refid="capacityWhere"/>
+    </select>
+
+</mapper>

+ 77 - 0
src/main/resources/views/modules/mes/mesLineCapacityList.html

@@ -0,0 +1,77 @@
+<% layout('/layouts/default.html', {title: '产线产能管理', libs: ['dataGrid']}){ %>
+<div class="main-content">
+	<div class="box box-main">
+		<div class="box-header">
+			<div class="box-title">
+				<i class="fa icon-notebook"></i> ${text('产线产能管理')}
+			</div>
+			<div class="box-tools pull-right">
+				<a href="#" class="btn btn-default" id="btnSearch" title="${text('查询')}"><i class="fa fa-filter"></i> ${text('查询')}</a>
+				<a href="#" class="btn btn-default" id="btnSetting" title="${text('设置')}"><i class="fa fa-navicon"></i></a>
+			</div>
+		</div>
+		<div class="box-body">
+			<#form:form id="searchForm" model="${mesLineCapacity}" action="${ctx}/mes/mesLineCapacity/listData" method="post" class="form-inline hide"
+					data-page-no="${parameter.pageNo}" data-page-size="${parameter.pageSize}" data-order-by="${parameter.orderBy}">
+				<div class="form-group">
+					<label class="control-label">${text('生产线')}:</label>
+					<div class="control-inline width-120">
+						<#form:select path="lineId" items="${lineList}" itemLabel="title" itemValue="id" blankOption="true" class="form-control width-120" />
+					</div>
+				</div>
+				<div class="form-group">
+					<label class="control-label">${text('工位号')}:</label>
+					<div class="control-inline">
+						<#form:input path="oprno" maxlength="20" class="form-control width-120"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<label class="control-label">${text('工位名称')}:</label>
+					<div class="control-inline">
+						<#form:input path="title" maxlength="100" class="form-control width-120"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<label class="control-label">${text('统计时间')}:</label>
+					<div class="control-inline">
+						<#form:input path="startDate" readonly="true" maxlength="20" class="form-control laydate width-datetime"
+							data-type="datetime" data-format="yyyy-MM-dd HH:mm" data-done="endDate.click()"/>
+						&nbsp;-&nbsp;
+						<#form:input path="endDate" readonly="true" maxlength="20" class="form-control laydate width-datetime"
+							data-type="datetime" data-format="yyyy-MM-dd HH:mm"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<button type="submit" class="btn btn-primary btn-sm">${text('查询')}</button>
+					<button type="reset" class="btn btn-default btn-sm">${text('重置')}</button>
+				</div>
+			</#form:form>
+			<table id="dataGrid"></table>
+			<div id="dataGridPage"></div>
+			<p class="help-block" style="margin:10px 0 0 5px;">
+				${text('统计口径:按主工位统计生产记录(工艺号 100000 且结果不为 UDF)的完成数量,子工位(如 OP110A/OP110B)的产量并入所属主工位,产量单位为“件”。默认统计最近 7 天(可在 mes.search.days 配置)。')}
+			</p>
+		</div>
+	</div>
+</div>
+<% } %>
+<script>
+// 初始化DataGrid对象
+$('#dataGrid').dataGrid({
+	searchForm: $("#searchForm"),
+	pageSize: 50,
+	columnModel: [
+		{header:'${text("生产线")}', name:'lineTitle', index:'ml.title', width:180, align:"center", frozen:true},
+		{header:'${text("产线编号")}', name:'lineSn', index:'ml.sn', width:100, align:"center", frozen:true},
+		{header:'${text("工位号")}', name:'oprno', index:'lp.oprno', width:120, align:"center", frozen:true},
+		{header:'${text("工位名称")}', name:'title', index:'lp.title', width:220, align:"center"},
+		{header:'${text("产量(件)")}', name:'outputCount', index:'outputCount', width:120, align:"right", formatter: function(val, obj, row, act){
+			return '<strong>' + (Number(val) || 0) + '</strong>';
+		}}
+	],
+	frozenCols: true,
+	// 加载成功后执行事件
+	ajaxSuccess: function(data){
+	}
+});
+</script>

+ 6 - 0
src/main/resources/views/modules/mes/mesMaterialCheckRecordForm.html

@@ -32,6 +32,9 @@
 					</div>
 				<input type="hidden" name="checkList" id="checkList">
 				<div v-if="is_show">
+					<div class="form-unit" v-if="inspectLevel">
+						${text('加严检验')}:{{inspectLevel}}
+					</div>
 					<div class="form-unit">${text('物料信息')}</div>
 					<div class="col-xs-12">
 						<div class="form-group">
@@ -239,6 +242,7 @@ var vm = new Vue({
 		faNums:0,
 		hgQty:"",
 		bhgQty:"",
+		inspectLevel:"",
 		state:"1",
 		options:[]
 	},
@@ -406,6 +410,7 @@ var vm = new Vue({
 					that.faNums=0;
 					that.hgQty="";
 					that.bhgQty="";
+					that.inspectLevel="";
 					that.options=[];
 					that.formatData();
 				}else {
@@ -418,6 +423,7 @@ var vm = new Vue({
 					that.faNums=res.data.faNums || snFields.faNums;
 					that.hgQty=that.faNums;
 					that.bhgQty=0;
+					that.inspectLevel=res.data.inspectLevel || "";
 					that.options=res.data.mitList;
 
 					for (let o in that.options){