Bläddra i källkod

优化产品生产记录页面等

jingbo 3 månader sedan
förälder
incheckning
1935f62602

+ 15 - 0
src/main/java/com/jeesite/modules/mes/dao/MesWelderParamRecordDao.java

@@ -0,0 +1,15 @@
+package com.jeesite.modules.mes.dao;
+
+import com.jeesite.common.dao.CrudDao;
+import com.jeesite.common.mybatis.annotation.MyBatisDao;
+import com.jeesite.modules.mes.entity.MesWelderParamRecord;
+
+/**
+ * 凸焊数据(焊机参数)DAO接口
+ * @author mes
+ * @version 2026-07-20
+ */
+@MyBatisDao
+public interface MesWelderParamRecordDao extends CrudDao<MesWelderParamRecord> {
+
+}

+ 2 - 2
src/main/java/com/jeesite/modules/mes/entity/MesProductQm.java

@@ -34,7 +34,7 @@ import com.jeesite.common.utils.excel.annotation.ExcelFields;
 		@Column(name="leak_rate_unit", attrName="leakRateUnit", label="泄漏率单位"),
 		@Column(name="test_result", attrName="testResult", label="测试结果"),
 		@Column(name="test_pace", attrName="testPace", label="测试节拍"),
-		@Column(name="product_cate", attrName="productCate", label="产品类型"),
+		@Column(name="product_cate", attrName="productCate", label="产线编号", queryType=QueryType.LIKE),
 		@Column(name="oprno", attrName="oprno", label="工位号", queryType=QueryType.LIKE),
 		@Column(name="line_sn", attrName="lineSn", label="产线编号", queryType=QueryType.LIKE),
 		@Column(name="cq_duration", attrName="cqDuration", label="充气时间"),
@@ -90,7 +90,7 @@ public class MesProductQm extends DataEntity<MesProductQm> {
 		@ExcelField(title="泄露率单位", attrName="laekRateUnit", align=Align.CENTER, sort=92),
 		@ExcelField(title="测试结果", attrName="testResult", align=Align.CENTER, sort=100),
 		@ExcelField(title="测试节拍", attrName="testPace", align=Align.CENTER, sort=110),
-		@ExcelField(title="产品类型", attrName="productCate", align=Align.CENTER, sort=120),
+		@ExcelField(title="产线编号", attrName="productCate", align=Align.CENTER, sort=120),
 		@ExcelField(title="工位号", attrName="oprno", align=Align.CENTER, sort=130),
 		@ExcelField(title="检测设备", attrName="deviceType", align=Align.CENTER, sort=140),
 	})

+ 341 - 0
src/main/java/com/jeesite/modules/mes/entity/MesWelderParamRecord.java

@@ -0,0 +1,341 @@
+package com.jeesite.modules.mes.entity;
+
+import java.util.Date;
+
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.jeesite.common.entity.DataEntity;
+import com.jeesite.common.mybatis.annotation.Column;
+import com.jeesite.common.mybatis.annotation.Table;
+import com.jeesite.common.mybatis.mapper.query.QueryType;
+
+/**
+ * 凸焊数据(焊机参数)Entity
+ * 说明:本工位无二维码/条码,不含 sn、lineSn
+ * @author mes
+ * @version 2026-07-20
+ */
+@Table(name="mes_welder_param_record", alias="a", label="凸焊数据信息", columns={
+		@Column(name="id", attrName="id", label="编号", isPK=true),
+		@Column(name="oprno", attrName="oprno", label="工序号", queryType=QueryType.LIKE),
+		@Column(name="ucode", attrName="ucode", label="操作员", queryType=QueryType.LIKE),
+		@Column(name="weld_count", attrName="weldCount", label="焊接计数", isUpdateForce=true),
+		@Column(name="spec_no", attrName="specNo", label="规范号", isUpdateForce=true),
+		@Column(name="work_mode", attrName="workMode", label="工作模式", queryType=QueryType.LIKE),
+		@Column(name="run_state", attrName="runState", label="运行状态", queryType=QueryType.LIKE),
+		@Column(name="tooling_state", attrName="toolingState", label="修模状态", queryType=QueryType.LIKE),
+		@Column(name="alarm_text", attrName="alarmText", label="报警信息", queryType=QueryType.LIKE),
+		@Column(name="cap_voltage", attrName="capVoltage", label="电容电压", isUpdateForce=true),
+		@Column(name="pre_press_time", attrName="prePressTime", label="预压时间", isUpdateForce=true),
+		@Column(name="press_time", attrName="pressTime", label="加压时间", isUpdateForce=true),
+		@Column(name="spec_preheat_voltage", attrName="specPreheatVoltage", label="规范预热电压", isUpdateForce=true),
+		@Column(name="spec_preheat_current", attrName="specPreheatCurrent", label="规范预热电流", isUpdateForce=true),
+		@Column(name="spec_preheat_time", attrName="specPreheatTime", label="规范预热时间", isUpdateForce=true),
+		@Column(name="spec_weld_voltage", attrName="specWeldVoltage", label="规范焊接电压", isUpdateForce=true),
+		@Column(name="spec_weld_current", attrName="specWeldCurrent", label="规范焊接电流", isUpdateForce=true),
+		@Column(name="spec_weld_time", attrName="specWeldTime", label="规范焊接时间", isUpdateForce=true),
+		@Column(name="spec_temper_voltage", attrName="specTemperVoltage", label="规范回火电压", isUpdateForce=true),
+		@Column(name="spec_temper_current", attrName="specTemperCurrent", label="规范回火电流", isUpdateForce=true),
+		@Column(name="spec_temper_time", attrName="specTemperTime", label="规范回火时间", isUpdateForce=true),
+		@Column(name="preheat_voltage", attrName="preheatVoltage", label="结果预热电压", isUpdateForce=true),
+		@Column(name="weld_voltage", attrName="weldVoltage", label="结果焊接电压", isUpdateForce=true),
+		@Column(name="temper_voltage", attrName="temperVoltage", label="结果回火电压", isUpdateForce=true),
+		@Column(name="preheat_peak_current", attrName="preheatPeakCurrent", label="预热峰值电流"),
+		@Column(name="weld_peak_current", attrName="weldPeakCurrent", label="焊接峰值电流"),
+		@Column(name="temper_peak_current", attrName="temperPeakCurrent", label="回火峰值电流"),
+		@Column(name="record_time", attrName="recordTime", label="采集时间", isUpdateForce=true),
+		@Column(name="remarks", attrName="remarks", label="备注", queryType=QueryType.LIKE),
+		@Column(name="status", attrName="status", label="状态", comment="状态(0正常 1删除 2停用)", isUpdate=false),
+		@Column(name="create_by", attrName="createBy", label="创建者", isUpdate=false, isQuery=false),
+		@Column(name="create_date", attrName="createDate", label="创建时间", isUpdate=false, isQuery=false, isUpdateForce=true),
+		@Column(name="update_by", attrName="updateBy", label="更新者", isQuery=false),
+		@Column(name="update_date", attrName="updateDate", label="更新时间", isQuery=false, isUpdateForce=true),
+	}, orderBy="a.record_time DESC, a.id DESC"
+)
+public class MesWelderParamRecord extends DataEntity<MesWelderParamRecord> {
+
+	private static final long serialVersionUID = 1L;
+
+	private String oprno;				// 工序号
+	private String ucode;				// 操作员
+	private Integer weldCount;			// 焊接计数
+	private Integer specNo;				// 规范号
+	private String workMode;			// 工作模式
+	private String runState;			// 运行状态
+	private String toolingState;		// 修模状态
+	private String alarmText;			// 报警信息
+	private Integer capVoltage;			// 电容电压
+	private Integer prePressTime;		// 预压时间
+	private Integer pressTime;			// 加压时间
+	private Integer specPreheatVoltage;	// 规范预热电压
+	private Integer specPreheatCurrent;	// 规范预热电流
+	private Integer specPreheatTime;	// 规范预热时间
+	private Integer specWeldVoltage;	// 规范焊接电压
+	private Integer specWeldCurrent;	// 规范焊接电流
+	private Integer specWeldTime;		// 规范焊接时间
+	private Integer specTemperVoltage;	// 规范回火电压
+	private Integer specTemperCurrent;	// 规范回火电流
+	private Integer specTemperTime;		// 规范回火时间
+	private Integer preheatVoltage;		// 结果预热电压
+	private Integer weldVoltage;		// 结果焊接电压
+	private Integer temperVoltage;		// 结果回火电压
+	private String preheatPeakCurrent;	// 预热峰值电流
+	private String weldPeakCurrent;		// 焊接峰值电流
+	private String temperPeakCurrent;	// 回火峰值电流
+	private Date recordTime;			// 采集时间
+
+	public MesWelderParamRecord() {
+		this(null);
+	}
+
+	public MesWelderParamRecord(String id) {
+		super(id);
+	}
+
+	@Size(min=0, max=32, message="工序号长度不能超过 32 个字符")
+	public String getOprno() {
+		return oprno;
+	}
+
+	public void setOprno(String oprno) {
+		this.oprno = oprno;
+	}
+
+	@Size(min=0, max=64, message="操作员长度不能超过 64 个字符")
+	public String getUcode() {
+		return ucode;
+	}
+
+	public void setUcode(String ucode) {
+		this.ucode = ucode;
+	}
+
+	@NotNull(message="焊接计数不能为空")
+	public Integer getWeldCount() {
+		return weldCount;
+	}
+
+	public void setWeldCount(Integer weldCount) {
+		this.weldCount = weldCount;
+	}
+
+	public Integer getSpecNo() {
+		return specNo;
+	}
+
+	public void setSpecNo(Integer specNo) {
+		this.specNo = specNo;
+	}
+
+	@Size(min=0, max=32, message="工作模式长度不能超过 32 个字符")
+	public String getWorkMode() {
+		return workMode;
+	}
+
+	public void setWorkMode(String workMode) {
+		this.workMode = workMode;
+	}
+
+	@Size(min=0, max=32, message="运行状态长度不能超过 32 个字符")
+	public String getRunState() {
+		return runState;
+	}
+
+	public void setRunState(String runState) {
+		this.runState = runState;
+	}
+
+	@Size(min=0, max=32, message="修模状态长度不能超过 32 个字符")
+	public String getToolingState() {
+		return toolingState;
+	}
+
+	public void setToolingState(String toolingState) {
+		this.toolingState = toolingState;
+	}
+
+	@Size(min=0, max=64, message="报警信息长度不能超过 64 个字符")
+	public String getAlarmText() {
+		return alarmText;
+	}
+
+	public void setAlarmText(String alarmText) {
+		this.alarmText = alarmText;
+	}
+
+	public Integer getCapVoltage() {
+		return capVoltage;
+	}
+
+	public void setCapVoltage(Integer capVoltage) {
+		this.capVoltage = capVoltage;
+	}
+
+	public Integer getPrePressTime() {
+		return prePressTime;
+	}
+
+	public void setPrePressTime(Integer prePressTime) {
+		this.prePressTime = prePressTime;
+	}
+
+	public Integer getPressTime() {
+		return pressTime;
+	}
+
+	public void setPressTime(Integer pressTime) {
+		this.pressTime = pressTime;
+	}
+
+	public Integer getSpecPreheatVoltage() {
+		return specPreheatVoltage;
+	}
+
+	public void setSpecPreheatVoltage(Integer specPreheatVoltage) {
+		this.specPreheatVoltage = specPreheatVoltage;
+	}
+
+	public Integer getSpecPreheatCurrent() {
+		return specPreheatCurrent;
+	}
+
+	public void setSpecPreheatCurrent(Integer specPreheatCurrent) {
+		this.specPreheatCurrent = specPreheatCurrent;
+	}
+
+	public Integer getSpecPreheatTime() {
+		return specPreheatTime;
+	}
+
+	public void setSpecPreheatTime(Integer specPreheatTime) {
+		this.specPreheatTime = specPreheatTime;
+	}
+
+	public Integer getSpecWeldVoltage() {
+		return specWeldVoltage;
+	}
+
+	public void setSpecWeldVoltage(Integer specWeldVoltage) {
+		this.specWeldVoltage = specWeldVoltage;
+	}
+
+	public Integer getSpecWeldCurrent() {
+		return specWeldCurrent;
+	}
+
+	public void setSpecWeldCurrent(Integer specWeldCurrent) {
+		this.specWeldCurrent = specWeldCurrent;
+	}
+
+	public Integer getSpecWeldTime() {
+		return specWeldTime;
+	}
+
+	public void setSpecWeldTime(Integer specWeldTime) {
+		this.specWeldTime = specWeldTime;
+	}
+
+	public Integer getSpecTemperVoltage() {
+		return specTemperVoltage;
+	}
+
+	public void setSpecTemperVoltage(Integer specTemperVoltage) {
+		this.specTemperVoltage = specTemperVoltage;
+	}
+
+	public Integer getSpecTemperCurrent() {
+		return specTemperCurrent;
+	}
+
+	public void setSpecTemperCurrent(Integer specTemperCurrent) {
+		this.specTemperCurrent = specTemperCurrent;
+	}
+
+	public Integer getSpecTemperTime() {
+		return specTemperTime;
+	}
+
+	public void setSpecTemperTime(Integer specTemperTime) {
+		this.specTemperTime = specTemperTime;
+	}
+
+	public Integer getPreheatVoltage() {
+		return preheatVoltage;
+	}
+
+	public void setPreheatVoltage(Integer preheatVoltage) {
+		this.preheatVoltage = preheatVoltage;
+	}
+
+	public Integer getWeldVoltage() {
+		return weldVoltage;
+	}
+
+	public void setWeldVoltage(Integer weldVoltage) {
+		this.weldVoltage = weldVoltage;
+	}
+
+	public Integer getTemperVoltage() {
+		return temperVoltage;
+	}
+
+	public void setTemperVoltage(Integer temperVoltage) {
+		this.temperVoltage = temperVoltage;
+	}
+
+	@Size(min=0, max=32, message="预热峰值电流长度不能超过 32 个字符")
+	public String getPreheatPeakCurrent() {
+		return preheatPeakCurrent;
+	}
+
+	public void setPreheatPeakCurrent(String preheatPeakCurrent) {
+		this.preheatPeakCurrent = preheatPeakCurrent;
+	}
+
+	@Size(min=0, max=32, message="焊接峰值电流长度不能超过 32 个字符")
+	public String getWeldPeakCurrent() {
+		return weldPeakCurrent;
+	}
+
+	public void setWeldPeakCurrent(String weldPeakCurrent) {
+		this.weldPeakCurrent = weldPeakCurrent;
+	}
+
+	@Size(min=0, max=32, message="回火峰值电流长度不能超过 32 个字符")
+	public String getTemperPeakCurrent() {
+		return temperPeakCurrent;
+	}
+
+	public void setTemperPeakCurrent(String temperPeakCurrent) {
+		this.temperPeakCurrent = temperPeakCurrent;
+	}
+
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@NotNull(message="采集时间不能为空")
+	public Date getRecordTime() {
+		return recordTime;
+	}
+
+	public void setRecordTime(Date recordTime) {
+		this.recordTime = recordTime;
+	}
+
+	public Date getRecordTime_gte() {
+		return sqlMap.getWhere().getValue("record_time", QueryType.GTE);
+	}
+
+	public void setRecordTime_gte(Date recordTime) {
+		sqlMap.getWhere().and("record_time", QueryType.GTE, recordTime);
+	}
+
+	public Date getRecordTime_lte() {
+		return sqlMap.getWhere().getValue("record_time", QueryType.LTE);
+	}
+
+	public void setRecordTime_lte(Date recordTime) {
+		sqlMap.getWhere().and("record_time", QueryType.LTE, recordTime);
+	}
+
+}

+ 95 - 0
src/main/java/com/jeesite/modules/mes/service/MesWelderParamRecordService.java

@@ -0,0 +1,95 @@
+package com.jeesite.modules.mes.service;
+
+import java.util.List;
+
+import org.springframework.dao.DataIntegrityViolationException;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeesite.common.entity.Page;
+import com.jeesite.common.lang.StringUtils;
+import com.jeesite.common.mybatis.mapper.query.QueryType;
+import com.jeesite.common.service.CrudService;
+import com.jeesite.modules.mes.dao.MesWelderParamRecordDao;
+import com.jeesite.modules.mes.entity.MesWelderParamRecord;
+
+/**
+ * 凸焊数据(焊机参数)Service
+ * @author mes
+ * @version 2026-07-20
+ */
+@Service
+public class MesWelderParamRecordService extends CrudService<MesWelderParamRecordDao, MesWelderParamRecord> {
+
+	@Override
+	public MesWelderParamRecord get(MesWelderParamRecord mesWelderParamRecord) {
+		return super.get(mesWelderParamRecord);
+	}
+
+	@Override
+	public Page<MesWelderParamRecord> findPage(MesWelderParamRecord mesWelderParamRecord) {
+		return super.findPage(mesWelderParamRecord);
+	}
+
+	@Override
+	public List<MesWelderParamRecord> findList(MesWelderParamRecord mesWelderParamRecord) {
+		return super.findList(mesWelderParamRecord);
+	}
+
+	@Override
+	@Transactional
+	public void save(MesWelderParamRecord mesWelderParamRecord) {
+		super.save(mesWelderParamRecord);
+	}
+
+	@Override
+	@Transactional
+	public void updateStatus(MesWelderParamRecord mesWelderParamRecord) {
+		super.updateStatus(mesWelderParamRecord);
+	}
+
+	@Override
+	@Transactional
+	public void delete(MesWelderParamRecord mesWelderParamRecord) {
+		super.delete(mesWelderParamRecord);
+	}
+
+	/**
+	 * 按工序号 + 焊接计数精确查询(幂等判重)
+	 */
+	public MesWelderParamRecord findByOprnoAndWeldCount(String oprno, Integer weldCount) {
+		if (StringUtils.isBlank(oprno) || weldCount == null) {
+			return null;
+		}
+		MesWelderParamRecord query = new MesWelderParamRecord();
+		query.setStatus(MesWelderParamRecord.STATUS_NORMAL);
+		// 判重必须精确匹配,避免 oprno 字段 LIKE 查询误命中
+		query.getSqlMap().getWhere().and("oprno", QueryType.EQ, oprno);
+		query.getSqlMap().getWhere().and("weld_count", QueryType.EQ, weldCount);
+		List<MesWelderParamRecord> list = findList(query);
+		return (list == null || list.isEmpty()) ? null : list.get(0);
+	}
+
+	/**
+	 * 客户端上传:同一 oprno + weldCount 已存在则直接返回已有记录(幂等)
+	 */
+	@Transactional
+	public MesWelderParamRecord uploadIdempotent(MesWelderParamRecord record) {
+		MesWelderParamRecord exists = findByOprnoAndWeldCount(record.getOprno(), record.getWeldCount());
+		if (exists != null) {
+			return exists;
+		}
+		try {
+			save(record);
+			return record;
+		} catch (DataIntegrityViolationException e) {
+			// 并发重复上传:再查一次并视为成功
+			MesWelderParamRecord again = findByOprnoAndWeldCount(record.getOprno(), record.getWeldCount());
+			if (again != null) {
+				return again;
+			}
+			throw e;
+		}
+	}
+
+}

+ 1 - 0
src/main/java/com/jeesite/modules/mes/web/MesProductCheckTestController.java

@@ -192,6 +192,7 @@ public class MesProductCheckTestController extends BaseController {
 		mesProductQm.setOprno(oprno);
 		mesProductQm.setComponentNum(sn);
 		mesProductQm.setProductCate(lineSn);
+		mesProductQm.setLineSn(lineSn);
 		mesProductQm.setWorkNum(userCode);
 		mesProductQm.setDeviceType("1");
 		mesProductQm.setLeakVal(leakVal);

+ 49 - 5
src/main/java/com/jeesite/modules/mes/web/MesProductController.java

@@ -103,6 +103,8 @@ public class MesProductController extends BaseController {
 	private MesQualityService mesQualityService;
 	@Autowired
 	private MesBatchSnService mesBatchSnService;
+	@Autowired
+	private MesMaterialCheckRecordService mesMaterialCheckRecordService;
 
 	@Autowired
 	private MesDeviceOeeStatsService mesDeviceOeeStatsService;
@@ -1170,12 +1172,35 @@ public class MesProductController extends BaseController {
 		data.put("hourTimes", hourTimes);
 		data.put("perHourData", perHourData);
 
+		// IQC检测合格率:近七日来料检查记录(mes_material_check_record),state=2 为不合格,其余为合格
 		List<Long> quality1 = new ArrayList<>();
 		List<Long> quality2 = new ArrayList<>();
-		for (int i = 0; i < outputList.size(); i++) {
-			Long dayOutput = outputList.get(i);
-			Long goodCount = dayOutput - (long)(dayOutput * 0.05);
-			Long badCount = dayOutput - goodCount;
+		for (int i = 6; i >= 0; i--) {
+			Calendar dayCal = (Calendar) calendar.clone();
+			dayCal.add(Calendar.DATE, -i);
+			Calendar dayStartCal = (Calendar) dayCal.clone();
+			dayStartCal.set(Calendar.HOUR_OF_DAY, 0);
+			dayStartCal.set(Calendar.MINUTE, 0);
+			dayStartCal.set(Calendar.SECOND, 0);
+			dayStartCal.set(Calendar.MILLISECOND, 0);
+			Calendar dayEndCal = (Calendar) dayStartCal.clone();
+			dayEndCal.add(Calendar.DATE, 1);
+
+			MesMaterialCheckRecord dayCheckQuery = new MesMaterialCheckRecord();
+			dayCheckQuery.setCreateDate_gte(dayStartCal.getTime());
+			dayCheckQuery.setCreateDate_lte(dayEndCal.getTime());
+			List<MesMaterialCheckRecord> dayCheckList = mesMaterialCheckRecordService.findList(dayCheckQuery);
+			long goodCount = 0L;
+			long badCount = 0L;
+			if (dayCheckList != null) {
+				for (MesMaterialCheckRecord checkRecord : dayCheckList) {
+					if ("2".equals(checkRecord.getState())) {
+						badCount++;
+					} else {
+						goodCount++;
+					}
+				}
+			}
 			quality1.add(goodCount);
 			quality2.add(badCount);
 		}
@@ -1448,8 +1473,27 @@ public class MesProductController extends BaseController {
 			record12h.setUpdateDate_gte(before12h.getTime());
 
 			long count12h = mesProductRecordService.findCount(record12h);
+
+			// 小时产能:当前整点小时内,该产线+工位的实际产量(mes_product_record)
+			MesProductRecord recordHour = new MesProductRecord();
+			recordHour.setOprno(x.getOprno());
+			recordHour.setCraft("100000");
+			recordHour.setContent("OK");
+			if (StringUtils.isNotEmpty(lineSn)) {
+				recordHour.setLineSn(lineSn);
+			}
+			Calendar hourStart = Calendar.getInstance();
+			hourStart.set(Calendar.MINUTE, 0);
+			hourStart.set(Calendar.SECOND, 0);
+			hourStart.set(Calendar.MILLISECOND, 0);
+			Calendar hourEnd = (Calendar) hourStart.clone();
+			hourEnd.add(Calendar.HOUR_OF_DAY, 1);
+			hourEnd.add(Calendar.MILLISECOND, -1);
+			recordHour.setUpdateDate_gte(hourStart.getTime());
+			recordHour.setUpdateDate_lte(hourEnd.getTime());
+			long hourCapacity = mesProductRecordService.findCount(recordHour);
+
 			int planCapacity = resolveLiuanPlanCapacity(x.getLineSn(), linePlanMap);
-			int hourCapacity = planCapacity > 0 ? (int)Math.ceil(planCapacity / 12.0) : 0;
 			row.add(planCapacity);
 			row.add(hourCapacity);
 			row.add(count);

+ 3 - 0
src/main/java/com/jeesite/modules/mes/web/MesProductRecordController.java

@@ -3337,6 +3337,8 @@ public class MesProductRecordController extends BaseController {
 			mesProductQm.setWorkNum(mesProductQmReq.getWorkNum());
 			mesProductQm.setComponentNum(sn);
 			mesProductQm.setProductCate(lineSn);
+			// 产线编号历史写入 product_cate,同步写入 line_sn 便于列表/查询
+			mesProductQm.setLineSn(lineSn);
 			mesProductQm.setWorkNum(userCode);
 			mesProductQm.setDeviceType(deviceType);
 			mesProductQm.setLeakVal(leakVal);
@@ -4698,6 +4700,7 @@ public class MesProductRecordController extends BaseController {
 				MesProcessProduct mesProcessProduct = mesProcessProductService.findByCateAndOprno(lineSn, oprno);
 				mesProcessProduct.setSn(sn);
 				mesProcessProductService.update(mesProcessProduct);
+				// 新增表 工件码 工位号 ucode
 				resp.setResult(Global.TRUE);
 				resp.setMessage("扫码成功");
 				return resp;

+ 10 - 4
src/main/java/com/jeesite/modules/mes/web/MesQualityController.java

@@ -141,10 +141,16 @@ public class MesQualityController extends BaseController {
 	@RequiresPermissions("mes:mesQuality:view")
 	@RequestMapping(value = "detail")
 	public String detail(MesQuality mesQuality, Model model) {
-		String[] itemId = mesQuality.getItems().split(",");
-		MesRepairItems mesRepairItems = new MesRepairItems();
-		mesRepairItems.getSqlMap().getWhere().and("id", QueryType.IN,itemId);
-		List<MesRepairItems> lists = mesRepairItemsService.findList(mesRepairItems);
+		List<MesRepairItems> lists = ListUtils.newArrayList();
+		// 问题清单为空时(如合格抽检未勾选问题项)直接展示详情,避免 NPE
+		if (StringUtils.isNotBlank(mesQuality.getItems())) {
+			String[] itemId = mesQuality.getItems().split(",");
+			if (itemId.length > 0 && StringUtils.isNotBlank(itemId[0])) {
+				MesRepairItems mesRepairItems = new MesRepairItems();
+				mesRepairItems.getSqlMap().getWhere().and("id", QueryType.IN, itemId);
+				lists = mesRepairItemsService.findList(mesRepairItems);
+			}
+		}
 		mesQuality.setMesRepairItemsList(lists);
 		model.addAttribute("mesQuality", mesQuality);
 		return "modules/mes/mesQualityInfo";

+ 203 - 0
src/main/java/com/jeesite/modules/mes/web/MesWelderParamRecordController.java

@@ -0,0 +1,203 @@
+package com.jeesite.modules.mes.web;
+
+import java.util.Date;
+import java.util.HashMap;
+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.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.ModelAttribute;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import com.jeesite.common.config.Global;
+import com.jeesite.common.entity.Page;
+import com.jeesite.common.lang.DateUtils;
+import com.jeesite.common.lang.StringUtils;
+import com.jeesite.common.web.BaseController;
+import com.jeesite.modules.mes.entity.MesWelderParamRecord;
+import com.jeesite.modules.mes.req.MesSearchDateReq;
+import com.jeesite.modules.mes.service.MesLogService;
+import com.jeesite.modules.mes.service.MesWelderParamRecordService;
+import com.jeesite.modules.mes.util.CommonUitl;
+
+/**
+ * 凸焊数据(焊机参数)Controller
+ * @author mes
+ * @version 2026-07-20
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/mes/mesWelderParamRecord")
+public class MesWelderParamRecordController extends BaseController {
+
+	@Autowired
+	private MesWelderParamRecordService mesWelderParamRecordService;
+
+	@Autowired
+	private MesLogService mesLogService;
+
+	@ModelAttribute
+	public MesWelderParamRecord get(String id, boolean isNewRecord) {
+		return mesWelderParamRecordService.get(id, isNewRecord);
+	}
+
+	/**
+	 * 凸焊数据列表
+	 */
+	@RequiresPermissions("mes:mesWelderParamRecord:view")
+	@RequestMapping(value = {"list", ""})
+	public String list(MesWelderParamRecord mesWelderParamRecord, Model model) {
+		applyDefaultRecordTime(mesWelderParamRecord);
+		model.addAttribute("mesWelderParamRecord", mesWelderParamRecord);
+		return "modules/mes/mesWelderParamRecordList";
+	}
+
+	/**
+	 * 列表数据
+	 */
+	@RequiresPermissions("mes:mesWelderParamRecord:view")
+	@RequestMapping(value = "listData")
+	@ResponseBody
+	public Page<MesWelderParamRecord> listData(MesWelderParamRecord mesWelderParamRecord,
+			HttpServletRequest request, HttpServletResponse response) {
+		mesWelderParamRecord.setPage(new Page<>(request, response));
+		return mesWelderParamRecordService.findPage(mesWelderParamRecord);
+	}
+
+	/**
+	 * 查看表单
+	 */
+	@RequiresPermissions("mes:mesWelderParamRecord:view")
+	@RequestMapping(value = "form")
+	public String form(MesWelderParamRecord mesWelderParamRecord, Model model) {
+		model.addAttribute("mesWelderParamRecord", mesWelderParamRecord);
+		return "modules/mes/mesWelderParamRecordForm";
+	}
+
+	/**
+	 * 保存
+	 */
+	@RequiresPermissions("mes:mesWelderParamRecord:edit")
+	@PostMapping(value = "save")
+	@ResponseBody
+	public String save(@Validated MesWelderParamRecord mesWelderParamRecord) {
+		mesWelderParamRecordService.save(mesWelderParamRecord);
+		return renderResult(Global.TRUE, text("保存凸焊数据成功!"));
+	}
+
+	/**
+	 * 删除
+	 */
+	@RequiresPermissions("mes:mesWelderParamRecord:edit")
+	@RequestMapping(value = "delete")
+	@ResponseBody
+	public String delete(MesWelderParamRecord mesWelderParamRecord) {
+		mesWelderParamRecordService.delete(mesWelderParamRecord);
+		return renderResult(Global.TRUE, text("删除凸焊数据成功!"));
+	}
+
+	/**
+	 * 客户端焊机参数上传(焊接计数增加时上报)
+	 * 风格对齐 mesProductRecord/pcresult;支持 __ajax=json + __sid
+	 * 幂等:同一 oprno + weldCount 重复上传直接返回成功,不重复插入
+	 */
+	@PostMapping(value = "upload")
+	@ResponseBody
+	public String upload(HttpServletRequest request) {
+		mesLogService.apisave(request);
+
+		String oprno = request.getParameter("oprno");
+		String ucode = request.getParameter("ucode");
+		String weldCountStr = request.getParameter("weldCount");
+		String recordTimeStr = request.getParameter("recordTime");
+
+		if (StringUtils.isBlank(oprno)) {
+			return renderResult(Global.FALSE, text("工序号不能为空"));
+		}
+		if (StringUtils.isBlank(weldCountStr)) {
+			return renderResult(Global.FALSE, text("焊接计数不能为空"));
+		}
+		if (StringUtils.isBlank(recordTimeStr)) {
+			return renderResult(Global.FALSE, text("采集时间不能为空"));
+		}
+
+		Integer weldCount = parseInteger(weldCountStr);
+		if (weldCount == null) {
+			return renderResult(Global.FALSE, text("焊接计数格式错误"));
+		}
+
+		Date recordTime = DateUtils.parseDate(recordTimeStr);
+		if (recordTime == null) {
+			return renderResult(Global.FALSE, text("采集时间格式错误,应为 yyyy-MM-dd HH:mm:ss"));
+		}
+
+		try {
+			MesWelderParamRecord record = new MesWelderParamRecord();
+			record.setOprno(oprno.trim());
+			record.setUcode(ucode);
+			record.setWeldCount(weldCount);
+			record.setSpecNo(parseInteger(request.getParameter("specNo")));
+			record.setWorkMode(request.getParameter("workMode"));
+			record.setRunState(request.getParameter("runState"));
+			record.setToolingState(request.getParameter("toolingState"));
+			record.setAlarmText(request.getParameter("alarmText"));
+			record.setCapVoltage(parseInteger(request.getParameter("capVoltage")));
+			record.setPrePressTime(parseInteger(request.getParameter("prePressTime")));
+			record.setPressTime(parseInteger(request.getParameter("pressTime")));
+			record.setSpecPreheatVoltage(parseInteger(request.getParameter("specPreheatVoltage")));
+			record.setSpecPreheatCurrent(parseInteger(request.getParameter("specPreheatCurrent")));
+			record.setSpecPreheatTime(parseInteger(request.getParameter("specPreheatTime")));
+			record.setSpecWeldVoltage(parseInteger(request.getParameter("specWeldVoltage")));
+			record.setSpecWeldCurrent(parseInteger(request.getParameter("specWeldCurrent")));
+			record.setSpecWeldTime(parseInteger(request.getParameter("specWeldTime")));
+			record.setSpecTemperVoltage(parseInteger(request.getParameter("specTemperVoltage")));
+			record.setSpecTemperCurrent(parseInteger(request.getParameter("specTemperCurrent")));
+			record.setSpecTemperTime(parseInteger(request.getParameter("specTemperTime")));
+			record.setPreheatVoltage(parseInteger(request.getParameter("preheatVoltage")));
+			record.setWeldVoltage(parseInteger(request.getParameter("weldVoltage")));
+			record.setTemperVoltage(parseInteger(request.getParameter("temperVoltage")));
+			record.setPreheatPeakCurrent(request.getParameter("preheatPeakCurrent"));
+			record.setWeldPeakCurrent(request.getParameter("weldPeakCurrent"));
+			record.setTemperPeakCurrent(request.getParameter("temperPeakCurrent"));
+			record.setRecordTime(recordTime);
+
+			MesWelderParamRecord saved = mesWelderParamRecordService.uploadIdempotent(record);
+			Map<String, Object> data = new HashMap<>();
+			data.put("id", saved.getId());
+			return renderResult(Global.TRUE, text("成功"), data);
+		} catch (Exception e) {
+			logger.error("焊机参数上传失败", e);
+			return renderResult(Global.FALSE, text("失败:" + (StringUtils.isNotBlank(e.getMessage()) ? e.getMessage() : "系统异常")));
+		}
+	}
+
+	/** 默认带上采集时间查询范围 */
+	private void applyDefaultRecordTime(MesWelderParamRecord mesWelderParamRecord) {
+		MesSearchDateReq dateMap = CommonUitl.getSearchDate();
+		if (mesWelderParamRecord.getRecordTime_gte() == null) {
+			mesWelderParamRecord.setRecordTime_gte(dateMap.getStartDate());
+		}
+		if (mesWelderParamRecord.getRecordTime_lte() == null) {
+			mesWelderParamRecord.setRecordTime_lte(dateMap.getEndtDate());
+		}
+	}
+
+	private Integer parseInteger(String value) {
+		if (StringUtils.isBlank(value)) {
+			return null;
+		}
+		try {
+			return Integer.valueOf(value.trim());
+		} catch (NumberFormatException e) {
+			return null;
+		}
+	}
+
+}

+ 13 - 2
src/main/resources/mappings/modules/mes/MesProductQmDao.xml

@@ -2,12 +2,23 @@
 <!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.MesProductQmDao">
 
+	<!-- 白件/总成按名称或工位号区分:OP190=白件/半成品气密,OP220=总成气密 -->
 	<sql id="qmCategoryWhere">
 		<if test="qmCategory != null and qmCategory == 'whitePart'">
-			AND (a.title LIKE '%白件%' OR a.title LIKE '%边框%')
+			AND (
+				a.oprno LIKE 'OP190%'
+				OR a.title LIKE '%白件%'
+				OR a.title LIKE '%边框%'
+				OR a.title LIKE '%半成品%'
+			)
+			AND IFNULL(a.oprno, '') NOT LIKE 'OP220%'
+			AND IFNULL(a.title, '') NOT LIKE '%总成%'
 		</if>
 		<if test="qmCategory != null and qmCategory == 'assembly'">
-			AND a.title LIKE '%总成%'
+			AND (
+				a.oprno LIKE 'OP220%'
+				OR a.title LIKE '%总成%'
+			)
 		</if>
 	</sql>
 

+ 6 - 2
src/main/resources/mappings/modules/mes/MesProductRecordDao.xml

@@ -50,7 +50,9 @@
         where sn = #{sn} and oprno = #{oprno} and line_sn = #{lineSn} and craft = #{craft}
     </update>
 
-	<!-- 列表聚合:按工件码分组(虚拟 id 用 SN_ 前缀;勿用 #/: ,jqGrid 会改写行 id) -->
+	<!-- 列表聚合:按工件码分组(虚拟 id 用 SN_ 前缀;勿用 #/: ,jqGrid 会改写行 id)
+	     筛选条件(如更新日期)只决定哪些工件出现在列表;
+	     serial 统计该工件明细条数(与弹层一致,排除 OP050 工位)。 -->
 	<select id="findSnGroupList" resultType="com.jeesite.modules.mes.entity.MesProductRecord">
 		SELECT
 			CONCAT('SN_', a.sn) AS "id",
@@ -59,7 +61,9 @@
 			MAX(a.line_sn) AS "lineSn",
 			MAX(a.update_date) AS "updateDate",
 			MAX(a.update_by) AS "updateBy",
-			COUNT(1) AS "serial",
+			(SELECT COUNT(1) FROM mes_product_record c
+				WHERE c.sn = a.sn
+				AND IFNULL(c.oprno, '') NOT LIKE 'OP050%') AS "serial",
 			'0' AS "parentCode",
 			'0' AS "treeLeaf"
 		FROM mes_product_record a

+ 5 - 0
src/main/resources/mappings/modules/mes/MesWelderParamRecordDao.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jeesite.modules.mes.dao.MesWelderParamRecordDao">
+
+</mapper>

+ 2 - 2
src/main/resources/views/modules/mes/mesProductQmList.html

@@ -46,7 +46,7 @@
 				<div class="form-group">
 					<label class="control-label">${text('产线编号')}:</label>
 					<div class="control-inline">
-						<#form:input path="lineSn" maxlength="10" class="form-control width-120"/>
+						<#form:input path="productCate" maxlength="10" class="form-control width-120"/>
 					</div>
 				</div>
 				<div class="form-group">
@@ -71,7 +71,7 @@ $('#dataGrid').dataGrid({
 	searchForm: $("#searchForm"),
 	columnModel: [
 		{header:'${text("工件号")}', name:'componentNum', index:'a.component_num', width:280, align:"center", frozen:true},
-		{header:'${text("产线编号")}', name:'lineSn', index:'a.line_sn', width:100, align:"center"},
+		{header:'${text("产线编号")}', name:'productCate', index:'a.product_cate', width:100, align:"center"},
 		{header:'${text("工位号")}', name:'oprno', index:'a.oprno', width:100, align:"center"},
 		{header:'${text("名称")}', name:'title', index:'a.title', width:150, align:"center"},
 		{header:'${text("创建人员")}', name:'workNum', index:'a.work_num', width:150, align:"center"},

+ 2 - 2
src/main/resources/views/modules/mes/mesProductQmWhiteList.html

@@ -46,7 +46,7 @@
 				<div class="form-group">
 					<label class="control-label">${text('产线编号')}:</label>
 					<div class="control-inline">
-						<#form:input path="lineSn" maxlength="10" class="form-control width-120"/>
+						<#form:input path="productCate" maxlength="10" class="form-control width-120"/>
 					</div>
 				</div>
 				<div class="form-group">
@@ -71,7 +71,7 @@ $('#dataGrid').dataGrid({
 	searchForm: $("#searchForm"),
 	columnModel: [
 		{header:'${text("工件号")}', name:'componentNum', index:'a.component_num', width:280, align:"center", frozen:true},
-		{header:'${text("产线编号")}', name:'lineSn', index:'a.line_sn', width:100, align:"center"},
+		{header:'${text("产线编号")}', name:'productCate', index:'a.product_cate', width:100, align:"center"},
 		{header:'${text("工位号")}', name:'oprno', index:'a.oprno', width:100, align:"center"},
 		{header:'${text("名称")}', name:'title', index:'a.title', width:150, align:"center"},
 		{header:'${text("创建人员")}', name:'workNum', index:'a.work_num', width:150, align:"center"},

+ 259 - 0
src/main/resources/views/modules/mes/mesWelderParamRecordForm.html

@@ -0,0 +1,259 @@
+<% layout('/layouts/default.html', {title: '凸焊数据详情', libs: ['validate']}){ %>
+<div class="main-content">
+	<div class="box box-main">
+		<div class="box-header with-border">
+			<div class="box-title">
+				<i class="fa icon-note"></i> ${text('凸焊数据详情')}
+			</div>
+			<div class="box-tools pull-right">
+				<button type="button" class="btn btn-box-tool" data-widget="collapse"><i class="fa fa-minus"></i></button>
+			</div>
+		</div>
+		<#form:form id="inputForm" model="${mesWelderParamRecord}" action="${ctx}/mes/mesWelderParamRecord/save" method="post" class="form-horizontal">
+			<div class="box-body">
+				<#form:hidden path="id"/>
+
+				<div class="form-unit">${text('基本信息')}</div>
+				<div class="row">
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4">${text('工序号')}:</label>
+							<div class="col-sm-8">
+								<#form:input path="oprno" maxlength="32" class="form-control" readonly="true"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4">${text('操作员')}:</label>
+							<div class="col-sm-8">
+								<#form:input path="ucode" maxlength="64" class="form-control" readonly="true"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4">${text('焊接计数')}:</label>
+							<div class="col-sm-8">
+								<#form:input path="weldCount" class="form-control" readonly="true"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4">${text('规范号')}:</label>
+							<div class="col-sm-8">
+								<#form:input path="specNo" class="form-control" readonly="true"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4">${text('工作模式')}:</label>
+							<div class="col-sm-8">
+								<#form:input path="workMode" maxlength="32" class="form-control" readonly="true"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4">${text('运行状态')}:</label>
+							<div class="col-sm-8">
+								<#form:input path="runState" maxlength="32" class="form-control" readonly="true"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4">${text('修模状态')}:</label>
+							<div class="col-sm-8">
+								<#form:input path="toolingState" maxlength="32" class="form-control" readonly="true"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4">${text('报警信息')}:</label>
+							<div class="col-sm-8">
+								<#form:input path="alarmText" maxlength="64" class="form-control" readonly="true"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4">${text('采集时间')}:</label>
+							<div class="col-sm-8">
+								<#form:input path="recordTime" readonly="true" maxlength="20" class="form-control"
+									dataFormat="datetime"/>
+							</div>
+						</div>
+					</div>
+				</div>
+
+				<div class="form-unit">${text('压力/电压')}</div>
+				<div class="row">
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4">${text('电容电压(V)')}:</label>
+							<div class="col-sm-8">
+								<#form:input path="capVoltage" class="form-control" readonly="true"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4">${text('预压时间')}:</label>
+							<div class="col-sm-8">
+								<#form:input path="prePressTime" class="form-control" readonly="true"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4">${text('加压时间')}:</label>
+							<div class="col-sm-8">
+								<#form:input path="pressTime" class="form-control" readonly="true"/>
+							</div>
+						</div>
+					</div>
+				</div>
+
+				<div class="form-unit">${text('规范参数')}</div>
+				<div class="row">
+					<div class="col-xs-4">
+						<div class="form-group">
+							<label class="control-label col-sm-5">${text('预热电压')}:</label>
+							<div class="col-sm-7">
+								<#form:input path="specPreheatVoltage" class="form-control" readonly="true"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-4">
+						<div class="form-group">
+							<label class="control-label col-sm-5">${text('预热电流')}:</label>
+							<div class="col-sm-7">
+								<#form:input path="specPreheatCurrent" class="form-control" readonly="true"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-4">
+						<div class="form-group">
+							<label class="control-label col-sm-5">${text('预热时间')}:</label>
+							<div class="col-sm-7">
+								<#form:input path="specPreheatTime" class="form-control" readonly="true"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-4">
+						<div class="form-group">
+							<label class="control-label col-sm-5">${text('焊接电压')}:</label>
+							<div class="col-sm-7">
+								<#form:input path="specWeldVoltage" class="form-control" readonly="true"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-4">
+						<div class="form-group">
+							<label class="control-label col-sm-5">${text('焊接电流')}:</label>
+							<div class="col-sm-7">
+								<#form:input path="specWeldCurrent" class="form-control" readonly="true"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-4">
+						<div class="form-group">
+							<label class="control-label col-sm-5">${text('焊接时间')}:</label>
+							<div class="col-sm-7">
+								<#form:input path="specWeldTime" class="form-control" readonly="true"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-4">
+						<div class="form-group">
+							<label class="control-label col-sm-5">${text('回火电压')}:</label>
+							<div class="col-sm-7">
+								<#form:input path="specTemperVoltage" class="form-control" readonly="true"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-4">
+						<div class="form-group">
+							<label class="control-label col-sm-5">${text('回火电流')}:</label>
+							<div class="col-sm-7">
+								<#form:input path="specTemperCurrent" class="form-control" readonly="true"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-4">
+						<div class="form-group">
+							<label class="control-label col-sm-5">${text('回火时间')}:</label>
+							<div class="col-sm-7">
+								<#form:input path="specTemperTime" class="form-control" readonly="true"/>
+							</div>
+						</div>
+					</div>
+				</div>
+
+				<div class="form-unit">${text('结果参数')}</div>
+				<div class="row">
+					<div class="col-xs-4">
+						<div class="form-group">
+							<label class="control-label col-sm-5">${text('预热电压')}:</label>
+							<div class="col-sm-7">
+								<#form:input path="preheatVoltage" class="form-control" readonly="true"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-4">
+						<div class="form-group">
+							<label class="control-label col-sm-5">${text('焊接电压')}:</label>
+							<div class="col-sm-7">
+								<#form:input path="weldVoltage" class="form-control" readonly="true"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-4">
+						<div class="form-group">
+							<label class="control-label col-sm-5">${text('回火电压')}:</label>
+							<div class="col-sm-7">
+								<#form:input path="temperVoltage" class="form-control" readonly="true"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-4">
+						<div class="form-group">
+							<label class="control-label col-sm-5">${text('预热峰值电流')}:</label>
+							<div class="col-sm-7">
+								<#form:input path="preheatPeakCurrent" maxlength="32" class="form-control" readonly="true"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-4">
+						<div class="form-group">
+							<label class="control-label col-sm-5">${text('焊接峰值电流')}:</label>
+							<div class="col-sm-7">
+								<#form:input path="weldPeakCurrent" maxlength="32" class="form-control" readonly="true"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-4">
+						<div class="form-group">
+							<label class="control-label col-sm-5">${text('回火峰值电流')}:</label>
+							<div class="col-sm-7">
+								<#form:input path="temperPeakCurrent" maxlength="32" class="form-control" readonly="true"/>
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
+			<div class="box-footer">
+				<div class="row">
+					<div class="col-sm-offset-2 col-sm-10">
+						<button type="button" class="btn btn-sm btn-default" id="btnCancel" onclick="js.closeCurrentTabPage()"><i class="fa fa-reply-all"></i> ${text('关 闭')}</button>
+					</div>
+				</div>
+			</div>
+		</#form:form>
+	</div>
+</div>
+<% } %>

+ 96 - 0
src/main/resources/views/modules/mes/mesWelderParamRecordList.html

@@ -0,0 +1,96 @@
+<% 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="${mesWelderParamRecord}" action="${ctx}/mes/mesWelderParamRecord/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">
+						<#form:input path="oprno" maxlength="32" class="form-control width-120"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<label class="control-label">${text('操作员')}:</label>
+					<div class="control-inline">
+						<#form:input path="ucode" maxlength="64" class="form-control width-120"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<label class="control-label">${text('焊接计数')}:</label>
+					<div class="control-inline">
+						<#form:input path="weldCount" maxlength="10" class="form-control width-100"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<label class="control-label">${text('工作模式')}:</label>
+					<div class="control-inline">
+						<#form:input path="workMode" maxlength="32" class="form-control width-100"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<label class="control-label">${text('运行状态')}:</label>
+					<div class="control-inline">
+						<#form:input path="runState" maxlength="32" class="form-control width-100"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<label class="control-label">${text('采集时间')}:</label>
+					<div class="control-inline">
+						<#form:input path="recordTime_gte" readonly="true" maxlength="20" class="form-control laydate width-datetime"
+							dataFormat="datetime" data-type="datetime" data-format="yyyy-MM-dd HH:mm" data-done="recordTime_lte.click()"/>
+						&nbsp;-&nbsp;
+						<#form:input path="recordTime_lte" readonly="true" maxlength="20" class="form-control laydate width-datetime"
+							dataFormat="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>
+		</div>
+	</div>
+</div>
+<% } %>
+<script>
+$('#dataGrid').dataGrid({
+	searchForm: $("#searchForm"),
+	columnModel: [
+		{header:'${text("工序号")}', name:'oprno', index:'a.oprno', width:100, align:"center"},
+		{header:'${text("焊接计数")}', name:'weldCount', index:'a.weld_count', width:90, align:"center"},
+		{header:'${text("规范号")}', name:'specNo', index:'a.spec_no', width:80, align:"center"},
+		{header:'${text("工作模式")}', name:'workMode', index:'a.work_mode', width:90, align:"center"},
+		{header:'${text("运行状态")}', name:'runState', index:'a.run_state', width:90, align:"center"},
+		{header:'${text("修模状态")}', name:'toolingState', index:'a.tooling_state', width:90, align:"center"},
+		{header:'${text("报警信息")}', name:'alarmText', index:'a.alarm_text', width:100, align:"center"},
+		{header:'${text("电容电压")}', name:'capVoltage', index:'a.cap_voltage', width:90, align:"center"},
+		{header:'${text("规范焊接电压")}', name:'specWeldVoltage', index:'a.spec_weld_voltage', width:110, align:"center"},
+		{header:'${text("规范焊接时间")}', name:'specWeldTime', index:'a.spec_weld_time', width:110, align:"center"},
+		{header:'${text("焊接峰值电流")}', name:'weldPeakCurrent', index:'a.weld_peak_current', width:120, align:"center"},
+		{header:'${text("操作员")}', name:'ucode', index:'a.ucode', width:100, align:"center"},
+		{header:'${text("采集时间")}', name:'recordTime', index:'a.record_time', width:160, align:"center"},
+		{header:'${text("操作")}', name:'actions', width:80, align:"center", formatter: function(val, obj, row, act){
+			var actions = [];
+			actions.push('<a href="${ctx}/mes/mesWelderParamRecord/form?id='+row.id+'" class="btnList" title="${text("详情")}"><i class="fa fa-fw fa-eye"></i></a>&nbsp;');
+			//<% if(hasPermi('mes:mesWelderParamRecord:edit')){ %>
+			actions.push('<a href="${ctx}/mes/mesWelderParamRecord/delete?id='+row.id+'" class="btnList" title="${text("删除")}" data-confirm="${text("确认要删除该凸焊数据吗?")}"><i class="fa fa-trash-o"></i></a>&nbsp;');
+			//<% } %>
+			return actions.join('');
+		}}
+	],
+	ajaxSuccess: function(data){
+	}
+});
+</script>