瀏覽代碼

cnc参数展示,优化来料报检小数问题

sunxianglong 3 月之前
父節點
當前提交
4e5dc8cd7d

+ 15 - 0
src/main/java/com/jeesite/modules/mes/dao/MesProductCncParamDao.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.MesProductCncParam;
+
+/**
+ * CNC过程参数记录表DAO接口
+ * @author sxl
+ * @version 2026-07-24
+ */
+@MyBatisDao
+public interface MesProductCncParamDao extends CrudDao<MesProductCncParam> {
+	
+}

+ 15 - 0
src/main/java/com/jeesite/modules/mes/dao/MesSnColdDao.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.MesSnCold;
+
+/**
+ * 工件水冷板绑定DAO接口
+ * @author sxl
+ * @version 2026-07-22
+ */
+@MyBatisDao
+public interface MesSnColdDao extends CrudDao<MesSnCold> {
+	
+}

+ 6 - 6
src/main/java/com/jeesite/modules/mes/entity/MesMaterialReport.java

@@ -59,8 +59,8 @@ public class MesMaterialReport extends DataEntity<MesMaterialReport> {
 	private String materialId;		// 物料id
 	private String sn;		// 来料码
 	private String faDate;		// 发货日期
-	private Long faNums;		// 发货数量
-	private Long nums;		// 实际数量
+	private String faNums;		// 发货数量
+	private String nums;		// 实际数量
 	private String hgQty;   //合格数量
 	private String bhgQty;  //不合格数量
 	private String state;		// 状态
@@ -141,19 +141,19 @@ public class MesMaterialReport extends DataEntity<MesMaterialReport> {
 		this.faDate = faDate;
 	}
 
-	public Long getFaNums() {
+	public String getFaNums() {
 		return faNums;
 	}
 
-	public void setFaNums(Long faNums) {
+	public void setFaNums(String faNums) {
 		this.faNums = faNums;
 	}
 
-	public Long getNums() {
+	public String getNums() {
 		return nums;
 	}
 
-	public void setNums(Long nums) {
+	public void setNums(String nums) {
 		this.nums = nums;
 	}
 

+ 86 - 0
src/main/java/com/jeesite/modules/mes/entity/MesProductCncParam.java

@@ -0,0 +1,86 @@
+package com.jeesite.modules.mes.entity;
+
+import javax.validation.constraints.Size;
+
+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;
+
+/**
+ * CNC过程参数记录表Entity
+ * @author sxl
+ * @version 2026-07-24
+ */
+@Table(name="mes_product_cnc_param", alias="a", label="CNC过程参数记录表信息", columns={
+		@Column(name="id", attrName="id", label="主键ID", isPK=true),
+		@Column(name="sn", attrName="sn", label="工件码/二维码"),
+		@Column(name="oprno", attrName="oprno", label="工位号"),
+		@Column(name="line_sn", attrName="lineSn", label="产线编号"),
+		@Column(name="device_code", attrName="deviceCode", label="设备编号"),
+		@Column(name="content", attrName="content", label="CNC参数内容", comment="CNC参数内容(JSON数组)"),
+		@Column(name="create_date", attrName="createDate", label="创建时间", isUpdate=false, isQuery=false, isUpdateForce=true),
+	}, orderBy="a.id DESC"
+)
+public class MesProductCncParam extends DataEntity<MesProductCncParam> {
+	
+	private static final long serialVersionUID = 1L;
+	private String sn;		// 工件码/二维码
+	private String oprno;		// 工位号
+	private String lineSn;		// 产线编号
+	private String deviceCode;		// 设备编号
+	private String content;		// CNC参数内容(JSON数组)
+
+	public MesProductCncParam() {
+		this(null);
+	}
+	
+	public MesProductCncParam(String id){
+		super(id);
+	}
+	
+	@Size(min=0, max=100, message="工件码/二维码长度不能超过 100 个字符")
+	public String getSn() {
+		return sn;
+	}
+
+	public void setSn(String sn) {
+		this.sn = sn;
+	}
+	
+	@Size(min=0, max=20, message="工位号长度不能超过 20 个字符")
+	public String getOprno() {
+		return oprno;
+	}
+
+	public void setOprno(String oprno) {
+		this.oprno = oprno;
+	}
+	
+	@Size(min=0, max=10, message="产线编号长度不能超过 10 个字符")
+	public String getLineSn() {
+		return lineSn;
+	}
+
+	public void setLineSn(String lineSn) {
+		this.lineSn = lineSn;
+	}
+	
+	@Size(min=0, max=50, message="设备编号长度不能超过 50 个字符")
+	public String getDeviceCode() {
+		return deviceCode;
+	}
+
+	public void setDeviceCode(String deviceCode) {
+		this.deviceCode = deviceCode;
+	}
+	
+	public String getContent() {
+		return content;
+	}
+
+	public void setContent(String content) {
+		this.content = content;
+	}
+	
+}

+ 81 - 0
src/main/java/com/jeesite/modules/mes/entity/MesSnCold.java

@@ -0,0 +1,81 @@
+package com.jeesite.modules.mes.entity;
+
+import javax.validation.constraints.Size;
+import java.util.Date;
+import com.jeesite.common.mybatis.annotation.JoinTable;
+import com.jeesite.common.mybatis.annotation.JoinTable.Type;
+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
+ * @author sxl
+ * @version 2026-07-22
+ */
+@Table(name="mes_sn_cold", alias="a", label="工件水冷板绑定信息", columns={
+		@Column(name="id", attrName="id", label="id", isPK=true),
+		@Column(name="sn", attrName="sn", label="工件码"),
+		@Column(name="cold_sn", attrName="coldSn", label="水冷板码"),
+		@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_time", attrName="updateTime", label="更新时间", isUpdateForce=true),
+	}, orderBy="a.id DESC"
+)
+public class MesSnCold extends DataEntity<MesSnCold> {
+	
+	private static final long serialVersionUID = 1L;
+	private String sn;		// 工件码
+	private String coldSn;		// 水冷板码
+	private Date updateTime;		// 更新时间
+	
+	private String oprno;     //工位号
+
+	public String getOprno() {
+		return oprno;
+	}
+
+	public void setOprno(String oprno) {
+		this.oprno = oprno;
+	}
+
+	public MesSnCold() {
+		this(null);
+	}
+	
+	public MesSnCold(String id){
+		super(id);
+	}
+	
+	@Size(min=0, max=64, message="工件码长度不能超过 64 个字符")
+	public String getSn() {
+		return sn;
+	}
+
+	public void setSn(String sn) {
+		this.sn = sn;
+	}
+	
+	@Size(min=0, max=64, message="水冷板码长度不能超过 64 个字符")
+	public String getColdSn() {
+		return coldSn;
+	}
+
+	public void setColdSn(String coldSn) {
+		this.coldSn = coldSn;
+	}
+	
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	public Date getUpdateTime() {
+		return updateTime;
+	}
+
+	public void setUpdateTime(Date updateTime) {
+		this.updateTime = updateTime;
+	}
+	
+}

+ 81 - 0
src/main/java/com/jeesite/modules/mes/service/MesProductCncParamService.java

@@ -0,0 +1,81 @@
+package com.jeesite.modules.mes.service;
+
+import java.util.List;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeesite.common.entity.Page;
+import com.jeesite.common.service.CrudService;
+import com.jeesite.modules.mes.entity.MesProductCncParam;
+import com.jeesite.modules.mes.dao.MesProductCncParamDao;
+
+/**
+ * CNC过程参数记录表Service
+ * @author sxl
+ * @version 2026-07-24
+ */
+@Service
+public class MesProductCncParamService extends CrudService<MesProductCncParamDao, MesProductCncParam> {
+	
+	/**
+	 * 获取单条数据
+	 * @param mesProductCncParam
+	 * @return
+	 */
+	@Override
+	public MesProductCncParam get(MesProductCncParam mesProductCncParam) {
+		return super.get(mesProductCncParam);
+	}
+	
+	/**
+	 * 查询分页数据
+	 * @param mesProductCncParam 查询条件
+	 * @param mesProductCncParam.page 分页对象
+	 * @return
+	 */
+	@Override
+	public Page<MesProductCncParam> findPage(MesProductCncParam mesProductCncParam) {
+		return super.findPage(mesProductCncParam);
+	}
+	
+	/**
+	 * 查询列表数据
+	 * @param mesProductCncParam
+	 * @return
+	 */
+	@Override
+	public List<MesProductCncParam> findList(MesProductCncParam mesProductCncParam) {
+		return super.findList(mesProductCncParam);
+	}
+	
+	/**
+	 * 保存数据(插入或更新)
+	 * @param mesProductCncParam
+	 */
+	@Override
+	@Transactional
+	public void save(MesProductCncParam mesProductCncParam) {
+		super.save(mesProductCncParam);
+	}
+	
+	/**
+	 * 更新状态
+	 * @param mesProductCncParam
+	 */
+	@Override
+	@Transactional
+	public void updateStatus(MesProductCncParam mesProductCncParam) {
+		super.updateStatus(mesProductCncParam);
+	}
+	
+	/**
+	 * 删除数据
+	 * @param mesProductCncParam
+	 */
+	@Override
+	@Transactional
+	public void delete(MesProductCncParam mesProductCncParam) {
+		super.delete(mesProductCncParam);
+	}
+	
+}

+ 81 - 0
src/main/java/com/jeesite/modules/mes/service/MesSnColdService.java

@@ -0,0 +1,81 @@
+package com.jeesite.modules.mes.service;
+
+import java.util.List;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.jeesite.common.entity.Page;
+import com.jeesite.common.service.CrudService;
+import com.jeesite.modules.mes.entity.MesSnCold;
+import com.jeesite.modules.mes.dao.MesSnColdDao;
+
+/**
+ * 工件水冷板绑定Service
+ * @author sxl
+ * @version 2026-07-22
+ */
+@Service
+public class MesSnColdService extends CrudService<MesSnColdDao, MesSnCold> {
+	
+	/**
+	 * 获取单条数据
+	 * @param mesSnCold
+	 * @return
+	 */
+	@Override
+	public MesSnCold get(MesSnCold mesSnCold) {
+		return super.get(mesSnCold);
+	}
+	
+	/**
+	 * 查询分页数据
+	 * @param mesSnCold 查询条件
+	 * @param mesSnCold.page 分页对象
+	 * @return
+	 */
+	@Override
+	public Page<MesSnCold> findPage(MesSnCold mesSnCold) {
+		return super.findPage(mesSnCold);
+	}
+	
+	/**
+	 * 查询列表数据
+	 * @param mesSnCold
+	 * @return
+	 */
+	@Override
+	public List<MesSnCold> findList(MesSnCold mesSnCold) {
+		return super.findList(mesSnCold);
+	}
+	
+	/**
+	 * 保存数据(插入或更新)
+	 * @param mesSnCold
+	 */
+	@Override
+	@Transactional
+	public void save(MesSnCold mesSnCold) {
+		super.save(mesSnCold);
+	}
+	
+	/**
+	 * 更新状态
+	 * @param mesSnCold
+	 */
+	@Override
+	@Transactional
+	public void updateStatus(MesSnCold mesSnCold) {
+		super.updateStatus(mesSnCold);
+	}
+	
+	/**
+	 * 删除数据
+	 * @param mesSnCold
+	 */
+	@Override
+	@Transactional
+	public void delete(MesSnCold mesSnCold) {
+		super.delete(mesSnCold);
+	}
+	
+}

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

@@ -68,7 +68,7 @@ public class MesMaterialReportController extends BaseController {
 		}
 		return report;
 	}
-	
+
 	/**
 	 * 查询列表
 	 */
@@ -78,7 +78,7 @@ public class MesMaterialReportController extends BaseController {
 		model.addAttribute("mesMaterialReport", mesMaterialReport);
 		return "modules/mes/mesMaterialReportList";
 	}
-	
+
 	/**
 	 * 查询列表数据
 	 */
@@ -153,7 +153,7 @@ public class MesMaterialReportController extends BaseController {
 			return renderResult(Global.FALSE, "posfull:"+ex.getMessage());
 		}
 	}
-	
+
 	/**
 	 * 删除数据
 	 */
@@ -284,11 +284,11 @@ public class MesMaterialReportController extends BaseController {
 		mesMaterialReport1.setSn(materialCode);
 		mesMaterialReport1.setMaterialId(material.getId());
 		mesMaterialReport1.setFaDate(DateUtils.getDate("yyyy-MM-dd HH:mm:ss"));
-		mesMaterialReport1.setFaNums(Long.valueOf(faNums));
+		mesMaterialReport1.setFaNums(faNums);
 		mesMaterialReport1.setState("0");
 		mesMaterialReport1.setStatus("0");
 		mesMaterialReport1.setRemark(remark);
-		mesMaterialReport1.setNums(Long.valueOf(nums));
+		mesMaterialReport1.setNums(nums);
 		mesMaterialReportService.save(mesMaterialReport1);
 		resp.setResult(Global.TRUE);
 		return resp;
@@ -323,4 +323,4 @@ public class MesMaterialReportController extends BaseController {
 		return resp;
 	}
 
-}
+}

+ 367 - 0
src/main/java/com/jeesite/modules/mes/web/MesProductCncParamController.java

@@ -0,0 +1,367 @@
+package com.jeesite.modules.mes.web;
+
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jeesite.common.lang.StringUtils;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.transaction.annotation.Transactional;
+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.web.BaseController;
+import com.jeesite.modules.mes.entity.MesProductCncParam;
+import com.jeesite.modules.mes.service.MesProductCncParamService;
+
+/**
+ * CNC过程参数记录表Controller
+ * @author sxl
+ * @version 2026-07-24
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/mes/mesProductCncParam")
+public class MesProductCncParamController extends BaseController {
+
+	@Autowired
+	private MesProductCncParamService mesProductCncParamService;
+
+	/**
+	 * 获取数据
+	 */
+	@ModelAttribute
+	public MesProductCncParam get(String id, boolean isNewRecord) {
+		return mesProductCncParamService.get(id, isNewRecord);
+	}
+
+	/**
+	 * 查询列表
+	 */
+	@RequiresPermissions("mes:mesProductCncParam:view")
+	@RequestMapping(value = {"list", ""})
+	public String list(MesProductCncParam mesProductCncParam, Model model) {
+		model.addAttribute("mesProductCncParam", mesProductCncParam);
+		return "modules/mes/mesProductCncParamList";
+	}
+
+	/**
+	 * 查询列表数据
+	 */
+	@RequiresPermissions("mes:mesProductCncParam:view")
+	@RequestMapping(value = "listData")
+	@ResponseBody
+	public Page<MesProductCncParam> listData(MesProductCncParam mesProductCncParam, HttpServletRequest request, HttpServletResponse response) {
+		mesProductCncParam.setPage(new Page<>(request, response));
+		Page<MesProductCncParam> page = mesProductCncParamService.findPage(mesProductCncParam);
+		return page;
+	}
+
+	/**
+	 * 查看编辑表单
+	 */
+	@RequiresPermissions("mes:mesProductCncParam:view")
+	@RequestMapping(value = "form")
+	public String form(MesProductCncParam mesProductCncParam, Model model) {
+		model.addAttribute("mesProductCncParam", mesProductCncParam);
+		return "modules/mes/mesProductCncParamForm";
+	}
+
+	/**
+	 * 查看详情(解析CNC参数内容)
+	 */
+	@RequiresPermissions("mes:mesProductCncParam:view")
+	@RequestMapping(value = "detail")
+	public String detail(MesProductCncParam mesProductCncParam, Model model) {
+		model.addAttribute("mesProductCncParam", mesProductCncParam);
+		List<JSONObject> paramRows = parseCncContent(mesProductCncParam.getContent());
+		normalizeAliasKeys(paramRows);
+		model.addAttribute("paramRows", paramRows);
+		model.addAttribute("paramLabels", CNC_PARAM_LABELS);
+		model.addAttribute("paramCodes", new ArrayList<>(CNC_PARAM_LABELS.keySet()));
+		model.addAttribute("paramItems", buildParamItems(paramRows));
+		return "modules/mes/mesProductCncParamDetail";
+	}
+
+	/** CNC参数代码与中文名称映射(展示用主代码 = 实际字段名) */
+	private static final Map<String, String> CNC_PARAM_LABELS = new LinkedHashMap<>();
+	/** 同一参数的别名(旧字段名 → 主代码),用于取值兼容 */
+	private static final Map<String, String> CNC_PARAM_ALIASES = new LinkedHashMap<>();
+	static {
+		CNC_PARAM_LABELS.put("spindleActSpeed", "主轴转速");
+		CNC_PARAM_LABELS.put("machineX", "X轴机械坐标");
+		CNC_PARAM_LABELS.put("machineY", "Y轴机械坐标");
+		CNC_PARAM_LABELS.put("machineZ", "Z轴机械坐标");
+		CNC_PARAM_LABELS.put("actPressure", "实际压力值");
+		CNC_PARAM_LABELS.put("aaOffValZ", "Z轴叠加总量");
+		CNC_PARAM_LABELS.put("cutActSpeedX", "X轴进给率实际值");
+		CNC_PARAM_LABELS.put("cutActSpeedY", "Y轴进给率实际值");
+		CNC_PARAM_LABELS.put("cutActSpeedZ", "Z轴进给率实际值");
+		CNC_PARAM_LABELS.put("r210", "参数R210-恒压力开启延时");
+		CNC_PARAM_LABELS.put("r211", "参数R211-设定压力值");
+		CNC_PARAM_LABELS.put("r212", "参数R212-调整下限值");
+		CNC_PARAM_LABELS.put("r213", "参数R213-调整速度");
+		CNC_PARAM_LABELS.put("r214", "参数R214-叠加极限值");
+		CNC_PARAM_LABELS.put("r215", "参数R215-压力波动值");
+		CNC_PARAM_LABELS.put("r216", "参数R216-采集取样次数");
+		CNC_PARAM_LABELS.put("r217", "参数R217-手动调整值");
+		CNC_PARAM_LABELS.put("r218", "参数R218-暂停再启动延时");
+		CNC_PARAM_LABELS.put("r999", "参数R999-投影半径");
+
+		// 旧字段名兼容
+		CNC_PARAM_ALIASES.put("SP_SPEED", "spindleActSpeed");
+		CNC_PARAM_ALIASES.put("X_MCS", "machineX");
+		CNC_PARAM_ALIASES.put("Y_MCS", "machineY");
+		CNC_PARAM_ALIASES.put("Z_MCS", "machineZ");
+		CNC_PARAM_ALIASES.put("Actual_Pressure", "actPressure");
+		CNC_PARAM_ALIASES.put("AA_OFF_VAL_Z", "aaOffValZ");
+		CNC_PARAM_ALIASES.put("X_Feed", "cutActSpeedX");
+		CNC_PARAM_ALIASES.put("Y_Feed", "cutActSpeedY");
+		CNC_PARAM_ALIASES.put("Z_Feed", "cutActSpeedZ");
+		CNC_PARAM_ALIASES.put("R210", "r210");
+		CNC_PARAM_ALIASES.put("R211", "r211");
+		CNC_PARAM_ALIASES.put("R212", "r212");
+		CNC_PARAM_ALIASES.put("R213", "r213");
+		CNC_PARAM_ALIASES.put("R214", "r214");
+		CNC_PARAM_ALIASES.put("R215", "r215");
+		CNC_PARAM_ALIASES.put("R216", "r216");
+		CNC_PARAM_ALIASES.put("R217", "r217");
+		CNC_PARAM_ALIASES.put("R218", "r218");
+		CNC_PARAM_ALIASES.put("R999", "r999");
+	}
+
+	/**
+	 * 单条记录时,构建参数代码/名称/值列表(含未映射字段)
+	 */
+	private List<Map<String, Object>> buildParamItems(List<JSONObject> paramRows) {
+		List<Map<String, Object>> items = new ArrayList<>();
+		if (paramRows == null || paramRows.size() != 1) {
+			return items;
+		}
+		JSONObject row = paramRows.get(0);
+		for (Map.Entry<String, String> labelEntry : CNC_PARAM_LABELS.entrySet()) {
+			Map<String, Object> item = new LinkedHashMap<>();
+			item.put("code", labelEntry.getKey());
+			item.put("label", labelEntry.getValue());
+			Object val = getParamValue(row, labelEntry.getKey());
+			item.put("value", val != null ? val : "-");
+			items.add(item);
+		}
+		for (Map.Entry<String, Object> entry : row.entrySet()) {
+			String key = entry.getKey();
+			if (CNC_PARAM_LABELS.containsKey(key) || CNC_PARAM_ALIASES.containsKey(key)) {
+				continue;
+			}
+			Map<String, Object> item = new LinkedHashMap<>();
+			item.put("code", key);
+			item.put("label", key);
+			item.put("value", entry.getValue());
+			items.add(item);
+		}
+		return items;
+	}
+
+	/**
+	 * 按主代码取值,同时兼容别名字段
+	 */
+	private Object getParamValue(JSONObject row, String code) {
+		if (row == null || StringUtils.isBlank(code)) {
+			return null;
+		}
+		Object val = row.get(code);
+		if (val != null) {
+			return val;
+		}
+		for (Map.Entry<String, String> alias : CNC_PARAM_ALIASES.entrySet()) {
+			if (code.equals(alias.getValue()) && row.get(alias.getKey()) != null) {
+				return row.get(alias.getKey());
+			}
+		}
+		return null;
+	}
+
+	/**
+	 * 将别名字段归一到主代码,避免重复展示
+	 */
+	private void normalizeAliasKeys(List<JSONObject> paramRows) {
+		if (paramRows == null) {
+			return;
+		}
+		for (JSONObject row : paramRows) {
+			for (Map.Entry<String, String> alias : CNC_PARAM_ALIASES.entrySet()) {
+				String aliasKey = alias.getKey();
+				String primaryKey = alias.getValue();
+				if (row.get(primaryKey) == null && row.get(aliasKey) != null) {
+					row.put(primaryKey, row.get(aliasKey));
+				}
+				row.remove(aliasKey);
+			}
+		}
+	}
+
+	/**
+	 * 解析CNC参数内容为对象列表(支持JSON对象、JSON数组、键值对数组)
+	 */
+	private List<JSONObject> parseCncContent(String content) {
+		List<JSONObject> rows = new ArrayList<>();
+		if (StringUtils.isBlank(content)) {
+			return rows;
+		}
+		String text = content.trim();
+		try {
+			Object parsed = JSON.parse(text);
+			if (parsed instanceof JSONObject) {
+				rows.add(normalizeParamObject((JSONObject) parsed));
+			} else if (parsed instanceof JSONArray) {
+				JSONArray arr = (JSONArray) parsed;
+				for (int i = 0; i < arr.size(); i++) {
+					Object item = arr.get(i);
+					if (item instanceof JSONObject) {
+						JSONObject obj = (JSONObject) item;
+						// 键值对形式:{"name":"SP_SPEED","value":100} / {"key":"..."} / {"code":"..."}
+						if (isKeyValuePair(obj)) {
+							JSONObject merged = rows.isEmpty() ? new JSONObject(true) : rows.get(0);
+							if (rows.isEmpty()) {
+								rows.add(merged);
+							}
+							String code = firstNonBlank(obj.getString("name"), obj.getString("key"), obj.getString("code"));
+							merged.put(code, obj.get("value"));
+						} else {
+							rows.add(normalizeParamObject(obj));
+						}
+					} else if (item != null) {
+						// 兼容 "SP_SPEED:100|X_MCS:1.2" 或纯字符串
+						JSONObject fromStr = parseParamString(String.valueOf(item));
+						if (!fromStr.isEmpty()) {
+							rows.add(fromStr);
+						}
+					}
+				}
+			}
+		} catch (Exception e) {
+			// 非标准JSON时,尝试按分隔符解析
+			JSONObject fromStr = parseParamString(text);
+			if (!fromStr.isEmpty()) {
+				rows.add(fromStr);
+			}
+		}
+		return rows;
+	}
+
+	private boolean isKeyValuePair(JSONObject obj) {
+		boolean hasCode = StringUtils.isNotBlank(obj.getString("name"))
+				|| StringUtils.isNotBlank(obj.getString("key"))
+				|| StringUtils.isNotBlank(obj.getString("code"));
+		return hasCode && obj.containsKey("value") && obj.size() <= 4;
+	}
+
+	private JSONObject normalizeParamObject(JSONObject src) {
+		JSONObject dest = new JSONObject(true);
+		for (Map.Entry<String, Object> entry : src.entrySet()) {
+			dest.put(entry.getKey(), entry.getValue());
+		}
+		return dest;
+	}
+
+	private JSONObject parseParamString(String text) {
+		JSONObject obj = new JSONObject(true);
+		if (StringUtils.isBlank(text)) {
+			return obj;
+		}
+		String[] parts = text.split("[,;|\\n]");
+		for (String part : parts) {
+			String p = part.trim();
+			if (p.isEmpty()) {
+				continue;
+			}
+			int idx = p.indexOf(':');
+			if (idx < 0) {
+				idx = p.indexOf('=');
+			}
+			if (idx > 0) {
+				String key = p.substring(0, idx).trim();
+				String val = p.substring(idx + 1).trim();
+				obj.put(key, val);
+			}
+		}
+		return obj;
+	}
+
+	private String firstNonBlank(String... values) {
+		for (String v : values) {
+			if (StringUtils.isNotBlank(v)) {
+				return v;
+			}
+		}
+		return "";
+	}
+
+	/**
+	 * 保存数据
+	 */
+	@RequiresPermissions("mes:mesProductCncParam:edit")
+	@PostMapping(value = "save")
+	@ResponseBody
+	public String save(@Validated MesProductCncParam mesProductCncParam) {
+		mesProductCncParamService.save(mesProductCncParam);
+		return renderResult(Global.TRUE, text("保存CNC过程参数记录表成功!"));
+	}
+
+	/**
+	 * 删除数据
+	 */
+	@RequiresPermissions("mes:mesProductCncParam:edit")
+	@RequestMapping(value = "delete")
+	@ResponseBody
+	public String delete(MesProductCncParam mesProductCncParam) {
+		mesProductCncParamService.delete(mesProductCncParam);
+		return renderResult(Global.TRUE, text("删除CNC过程参数记录表成功!"));
+	}
+	/**
+	 * 接口批量保存数据(供客户端调用)
+	 * 参考CMT的batchsave接口
+	 */
+	@PostMapping(value = "batchsave")
+	@ResponseBody
+	@Transactional
+	public String batchsave(HttpServletRequest request) {
+		String params = request.getParameter("params");
+		if(StringUtils.isEmpty(params)){
+			return renderResult(Global.FALSE, text("参数错误!"));
+		}
+
+		JSONArray jsonArr = JSON.parseArray(params);
+		if(jsonArr.size() <= 0){
+			return renderResult(Global.FALSE, text("参数错误!"));
+		}
+
+		for (int i=0; i<jsonArr.size(); i++) {
+			JSONObject obj = jsonArr.getJSONObject(i);
+
+			MesProductCncParam mesProductCncParam = new MesProductCncParam();
+			mesProductCncParam.setSn(obj.getString("sn"));
+			mesProductCncParam.setOprno(obj.getString("oprno"));
+			mesProductCncParam.setLineSn(obj.getString("lineSn"));
+			mesProductCncParam.setDeviceCode(obj.getString("deviceCode"));
+			mesProductCncParam.setContent(obj.getString("content"));
+
+			mesProductCncParamService.save(mesProductCncParam);
+		}
+
+		return renderResult(Global.TRUE, text("操作成功!"));
+	}
+
+}

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

@@ -1295,7 +1295,7 @@ public class MesProductRecordController extends BaseController {
 	}
 
 	// 查询质量公共部分
-	private String checkQualityCommon(String oldOprno,String sn,String lineSn,String userCode){
+	public String checkQualityCommon(String oldOprno,String sn,String lineSn,String userCode){
 		String oprno = CommonUitl.formatOprno(oldOprno);
 		String ret = checkQualityResult(oldOprno,sn,lineSn,userCode);
 		String res = ret.substring(3,5);

+ 232 - 0
src/main/java/com/jeesite/modules/mes/web/MesSnColdController.java

@@ -0,0 +1,232 @@
+package com.jeesite.modules.mes.web;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.jeesite.common.lang.ObjectUtils;
+import com.jeesite.common.lang.StringUtils;
+import com.jeesite.modules.mes.entity.MesLine;
+import com.jeesite.modules.mes.entity.MesProduct;
+import com.jeesite.modules.mes.resp.BindMaterialResp;
+import com.jeesite.modules.mes.resp.CommonResp;
+import com.jeesite.modules.mes.resp.ParamsResp;
+import com.jeesite.modules.mes.service.MesLineProcessMaterialService;
+import com.jeesite.modules.mes.service.MesLineService;
+import com.jeesite.modules.mes.service.MesProductRecordService;
+import com.jeesite.modules.mes.service.MesProductService;
+import com.jeesite.modules.sys.entity.User;
+import com.jeesite.modules.sys.utils.UserUtils;
+import com.jeesite.modules.utils.ErrorMsg;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Controller;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+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.web.BaseController;
+import com.jeesite.modules.mes.entity.MesSnCold;
+import com.jeesite.modules.mes.service.MesSnColdService;
+
+/**
+ * 工件水冷板绑定Controller
+ * @author sxl
+ * @version 2026-07-22
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/mes/mesSnCold")
+public class MesSnColdController extends BaseController {
+
+	@Autowired
+	private MesSnColdService mesSnColdService;
+
+	@Autowired
+	private MesProductService mesProductService;
+
+	@Autowired
+	private MesLineService mesLineService;
+
+	@Autowired
+	private MesProductRecordService mesProductRecordService;
+
+	@Autowired
+	private MesLineProcessMaterialService mesLineProcessMaterialService;
+
+	@Lazy
+	@Autowired
+	private MesProductRecordController mesProductRecordController;
+
+	/**
+	 * 获取数据
+	 */
+	@ModelAttribute
+	public MesSnCold get(String id, boolean isNewRecord) {
+		return mesSnColdService.get(id, isNewRecord);
+	}
+
+	/**
+	 * 查询列表
+	 */
+	@RequiresPermissions("mes:mesSnCold:view")
+	@RequestMapping(value = {"list", ""})
+	public String list(MesSnCold mesSnCold, Model model) {
+		model.addAttribute("mesSnCold", mesSnCold);
+		return "modules/mes/mesSnColdList";
+	}
+
+	/**
+	 * 查询列表数据
+	 */
+	@RequiresPermissions("mes:mesSnCold:view")
+	@RequestMapping(value = "listData")
+	@ResponseBody
+	public Page<MesSnCold> listData(MesSnCold mesSnCold, HttpServletRequest request, HttpServletResponse response) {
+		mesSnCold.setPage(new Page<>(request, response));
+		Page<MesSnCold> page = mesSnColdService.findPage(mesSnCold);
+		return page;
+	}
+
+	/**
+	 * 查看编辑表单
+	 */
+	@RequiresPermissions("mes:mesSnCold:view")
+	@RequestMapping(value = "form")
+	public String form(MesSnCold mesSnCold, Model model) {
+		model.addAttribute("mesSnCold", mesSnCold);
+		return "modules/mes/mesSnColdForm";
+	}
+
+	/**
+	 * 保存数据
+	 */
+	@RequiresPermissions("mes:mesSnCold:edit")
+	@PostMapping(value = "save")
+	@ResponseBody
+	public String save(@Validated MesSnCold mesSnCold) {
+		mesSnColdService.save(mesSnCold);
+		return renderResult(Global.TRUE, text("保存工件水冷板绑定成功!"));
+	}
+
+	/**
+	 * 删除数据
+	 */
+	@RequiresPermissions("mes:mesSnCold:edit")
+	@RequestMapping(value = "delete")
+	@ResponseBody
+	public String delete(MesSnCold mesSnCold) {
+		mesSnColdService.delete(mesSnCold);
+		return renderResult(Global.TRUE, text("删除工件水冷板绑定成功!"));
+	}
+
+	/**
+	 *水冷板工件绑定列表
+	 * @param mesSnCold
+	 * @return
+	 */
+	@RequestMapping(value = "coldList")
+	@ResponseBody
+	public CommonResp coldList(MesSnCold mesSnCold) {
+		CommonResp<List<MesSnCold>> resp = new CommonResp<>();
+		List<MesSnCold> list = mesSnColdService.findList(mesSnCold);
+		resp.setData(list);
+		resp.setResult(Global.TRUE);
+		resp.setMessage("操作成功!");
+		return resp;
+	}
+
+	/**
+	 * 水冷板工件绑定提交
+	 * 传 sn、coldSn、oprno:校验工件存在 → 质量检验 → 可加工则写入绑定表,并提交该工位结果为 OK
+	 * @param mesSnCold
+	 * @return
+	 */
+	@RequestMapping(value = "coldSubmit")
+	@ResponseBody
+	@Transactional
+	public CommonResp coldSubmit(MesSnCold mesSnCold) {
+		CommonResp<String> resp = new CommonResp<>();
+		String sn = mesSnCold.getSn();
+		String coldSn = mesSnCold.getColdSn();
+		String oprno = mesSnCold.getOprno();
+
+		if (StringUtils.isEmpty(sn) || StringUtils.isEmpty(coldSn) || StringUtils.isEmpty(oprno)) {
+			resp.setResult(Global.FALSE);
+			resp.setMessage("参数错误");
+			return resp;
+		}
+
+		// 1. 判定工件码是否在数据库中
+		MesProduct mesProduct = mesProductService.findBySn(sn);
+		if (ObjectUtils.isEmpty(mesProduct)) {
+			resp.setResult(Global.FALSE);
+			resp.setMessage("工件不存在");
+			return resp;
+		}
+
+		// 根据工件类型解析产线编号(质量检验需要 lineSn)
+		MesLine mesLine = new MesLine();
+		mesLine.setProductCate(mesProduct.getCate());
+		mesLine.setStatus("0");
+		MesLine lineInfo = mesLineService.findInfo(mesLine);
+		if (ObjectUtils.isEmpty(lineInfo) || StringUtils.isEmpty(lineInfo.getSn())) {
+			resp.setResult(Global.FALSE);
+			resp.setMessage("产线信息不存在");
+			return resp;
+		}
+		String lineSn = lineInfo.getSn();
+
+		// 2. 质量检验
+		String oldOprno = oprno;
+		if (oldOprno.length() == 5) {
+			oldOprno += "A";
+		}
+		String userCode = "";
+		User user = UserUtils.getUser();
+		if (user != null && StringUtils.isNotEmpty(user.getUserCode())) {
+			userCode = user.getUserCode();
+		}
+
+		String ret = mesProductRecordController.checkQualityCommon(oldOprno, sn, lineSn, userCode);
+		String checkret = ret.substring(3, 5);
+		if (!"UD".equals(checkret)) {
+			String lx = ret.substring(0, 3);
+			resp.setResult(Global.FALSE);
+			resp.setMessage(ErrorMsg.getErrorMsg(checkret, lx));
+			resp.setData(checkret);
+			return resp;
+		}
+
+		// 3. 可以加工:写入绑定表,并将该工位总结果提交为 OK
+		try {
+			mesSnCold.setUpdateTime(new Date());
+			mesSnColdService.save(mesSnCold);
+
+			List<ParamsResp> params = new ArrayList<>();
+			List<BindMaterialResp> bmlists = mesLineProcessMaterialService.getBindMaterial(oldOprno, lineSn);
+			mesProductRecordService.updateRecordResult(sn, oldOprno, "100000", coldSn, "OK",
+					userCode, params, lineSn, true, bmlists, null);
+		} catch (Exception e) {
+			TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+			resp.setResult(Global.FALSE);
+			resp.setMessage(StringUtils.isNotEmpty(e.getMessage()) ? e.getMessage() : "操作失败!");
+			return resp;
+		}
+
+		resp.setResult(Global.TRUE);
+		resp.setMessage("操作成功!");
+		resp.setData(checkret);
+		return resp;
+	}
+
+}

+ 15 - 0
src/main/resources/mappings/modules/mes/MesProductCncParamDao.xml

@@ -0,0 +1,15 @@
+<?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.MesProductCncParamDao">
+	
+	<!-- 查询数据
+	<select id="findList" resultType="MesProductCncParam">
+		SELECT ${sqlMap.column.toSql()}
+		FROM ${sqlMap.table.toSql()}
+		<where>
+			${sqlMap.where.toSql()}
+		</where>
+		ORDER BY ${sqlMap.order.toSql()}
+	</select> -->
+	
+</mapper>

+ 15 - 0
src/main/resources/mappings/modules/mes/MesSnColdDao.xml

@@ -0,0 +1,15 @@
+<?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.MesSnColdDao">
+	
+	<!-- 查询数据
+	<select id="findList" resultType="MesSnCold">
+		SELECT ${sqlMap.column.toSql()}
+		FROM ${sqlMap.table.toSql()}
+		<where>
+			${sqlMap.where.toSql()}
+		</where>
+		ORDER BY ${sqlMap.order.toSql()}
+	</select> -->
+	
+</mapper>

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

@@ -0,0 +1,96 @@
+<% layout('/layouts/default.html', {title: 'CNC过程参数记录详情', libs: []}){ %>
+<style>
+	.table.table-bordered th.mpc-header { width: 140px; background: #f9f9f9; }
+	.param-table th { white-space: nowrap; background: #f5f5f5; text-align: center; }
+	.param-table td { text-align: center; word-break: break-all; }
+	.param-kv th { background: #f5f5f5; text-align: center; }
+	.param-kv td { text-align: center; }
+</style>
+<div class="main-content">
+	<div class="box box-main">
+		<div class="box-header with-border">
+			<div class="box-title">
+				<i class="fa icon-eye"></i> ${text('CNC过程参数记录详情')}
+			</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>
+		<div class="box-body">
+			<div class="form-unit">${text('基本信息')}</div>
+			<table class="table table-bordered">
+				<tr>
+					<th class="mpc-header">${text('工件码/二维码')}</th>
+					<td>${mesProductCncParam.sn}</td>
+					<th class="mpc-header">${text('工位号')}</th>
+					<td>${mesProductCncParam.oprno}</td>
+				</tr>
+				<tr>
+					<th class="mpc-header">${text('产线编号')}</th>
+					<td>${mesProductCncParam.lineSn}</td>
+					<th class="mpc-header">${text('设备编号')}</th>
+					<td>${mesProductCncParam.deviceCode}</td>
+				</tr>
+				<tr>
+					<th class="mpc-header">${text('创建时间')}</th>
+					<td colspan="3">${@DateUtils.formatDateTime(mesProductCncParam.createDate)}</td>
+				</tr>
+			</table>
+
+			<div class="form-unit">${text('CNC参数内容')}</div>
+			<% if(paramRows == null || paramRows.~size == 0){ %>
+				<div class="alert alert-info" style="margin:0;">暂无参数数据</div>
+			<% } else if(paramRows.~size == 1){ %>
+				<table class="table table-bordered param-kv">
+					<thead>
+						<tr>
+							<th style="width:180px;">${text('参数代码')}</th>
+							<th style="width:260px;">${text('参数名称')}</th>
+							<th>${text('参数值')}</th>
+						</tr>
+					</thead>
+					<tbody>
+						<% for(var item in paramItems){ %>
+						<tr>
+							<td>${item.code}</td>
+							<td>${item.label}</td>
+							<td>${item.value}</td>
+						</tr>
+						<% } %>
+					</tbody>
+				</table>
+			<% } else { %>
+				<div style="overflow-x:auto;">
+					<table class="table table-bordered param-table">
+						<thead>
+							<tr>
+								<th>${text('序号')}</th>
+								<% for(var code in paramCodes){ %>
+								<th title="${code}">${paramLabels[code]}</th>
+								<% } %>
+							</tr>
+						</thead>
+						<tbody>
+							<% for(var row in paramRows){ %>
+							<tr>
+								<td>${rowLP.index}</td>
+								<% for(var code in paramCodes){ %>
+								<td>${row[code] != null ? row[code] : '-'}</td>
+								<% } %>
+							</tr>
+							<% } %>
+						</tbody>
+					</table>
+				</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>
+	</div>
+</div>
+<% } %>

+ 93 - 0
src/main/resources/views/modules/mes/mesProductCncParamForm.html

@@ -0,0 +1,93 @@
+<% layout('/layouts/default.html', {title: 'CNC过程参数记录表管理', 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(mesProductCncParam.isNewRecord ? '新增CNC过程参数记录表' : '编辑CNC过程参数记录表')}
+			</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="${mesProductCncParam}" action="${ctx}/mes/mesProductCncParam/save" method="post" class="form-horizontal">
+			<div class="box-body">
+				<div class="form-unit">${text('基本信息')}</div>
+				<#form:hidden path="id"/>
+				<div class="row">
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4" title="">
+								<span class="required hide">*</span> ${text('工件码/二维码')}:<i class="fa icon-question hide"></i></label>
+							<div class="col-sm-8">
+								<#form:input path="sn" maxlength="100" class="form-control"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4" title="">
+								<span class="required hide">*</span> ${text('工位号')}:<i class="fa icon-question hide"></i></label>
+							<div class="col-sm-8">
+								<#form:input path="oprno" maxlength="20" class="form-control"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4" title="">
+								<span class="required hide">*</span> ${text('产线编号')}:<i class="fa icon-question hide"></i></label>
+							<div class="col-sm-8">
+								<#form:input path="lineSn" maxlength="10" class="form-control"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4" title="">
+								<span class="required hide">*</span> ${text('设备编号')}:<i class="fa icon-question hide"></i></label>
+							<div class="col-sm-8">
+								<#form:input path="deviceCode" maxlength="50" class="form-control"/>
+							</div>
+						</div>
+					</div>
+				</div>
+				<div class="row">
+					<div class="col-xs-12">
+						<div class="form-group">
+							<label class="control-label col-sm-2" title="">
+								<span class="required hide">*</span> ${text('CNC参数内容')}:<i class="fa icon-question hide"></i></label>
+							<div class="col-sm-10">
+								<#form:textarea path="content" rows="4" class="form-control"/>
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
+			<div class="box-footer">
+				<div class="row">
+					<div class="col-sm-offset-2 col-sm-10">
+						<% if (hasPermi('mes:mesProductCncParam:edit')){ %>
+							<button type="submit" class="btn btn-sm btn-primary" id="btnSubmit"><i class="fa fa-check"></i> ${text('保 存')}</button>&nbsp;
+						<% } %>
+						<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>
+<% } %>
+<script>
+$("#inputForm").validate({
+	submitHandler: function(form){
+		js.ajaxSubmitForm($(form), function(data){
+			js.showMessage(data.message);
+			if(data.result == Global.TRUE){
+				js.closeCurrentTabPage(function(contentWindow){
+					contentWindow.page();
+				});
+			}
+		}, "json");
+    }
+});
+</script>

+ 87 - 0
src/main/resources/views/modules/mes/mesProductCncParamList.html

@@ -0,0 +1,87 @@
+<% layout('/layouts/default.html', {title: 'CNC过程参数记录表管理', 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('CNC过程参数记录表管理')}
+			</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>
+				<% if(hasPermi('mes:mesProductCncParam:edit')){ %>
+					<a href="${ctx}/mes/mesProductCncParam/form" class="btn btn-default btnTool" title="${text('新增CNC过程参数记录表')}"><i class="fa fa-plus"></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="${mesProductCncParam}" action="${ctx}/mes/mesProductCncParam/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="sn" 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="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="lineSn" maxlength="10" class="form-control width-120"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<label class="control-label">${text('设备编号')}:</label>
+					<div class="control-inline">
+						<#form:input path="deviceCode" maxlength="50" class="form-control width-120"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<label class="control-label">${text('CNC参数内容')}:</label>
+					<div class="control-inline">
+						<#form:input path="content" class="form-control width-120"/>
+					</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').dataGrid({
+	searchForm: $("#searchForm"),
+	columnModel: [
+		{header:'${text("工件码/二维码")}', name:'sn', index:'a.sn', width:150, align:"left", frozen:true, formatter: function(val, obj, row, act){
+			return '<a href="${ctx}/mes/mesProductCncParam/detail?id='+row.id+'" class="btnList" data-title="${text("CNC过程参数记录详情")}">'+(val||row.id)+'</a>';
+		}},
+		{header:'${text("工位号")}', name:'oprno', index:'a.oprno', width:150, align:"left"},
+		{header:'${text("产线编号")}', name:'lineSn', index:'a.line_sn', width:150, align:"left"},
+		{header:'${text("设备编号")}', name:'deviceCode', index:'a.device_code', width:150, align:"left"},
+		{header:'${text("CNC参数内容")}', name:'content', index:'a.content', width:150, align:"left"},
+		{header:'${text("操作")}', name:'actions', width:120, formatter: function(val, obj, row, act){
+			var actions = [];
+			actions.push('<a href="${ctx}/mes/mesProductCncParam/detail?id='+row.id+'" class="btnList" title="${text("详情")}"><i class="fa fa-fw fa-eye"></i></a>&nbsp;');
+			//<% if(hasPermi('mes:mesProductCncParam:edit')){ %>
+				actions.push('<a href="${ctx}/mes/mesProductCncParam/form?id='+row.id+'" class="btnList" title="${text("编辑CNC过程参数记录表")}"><i class="fa fa-pencil"></i></a>&nbsp;');
+				actions.push('<a href="${ctx}/mes/mesProductCncParam/delete?id='+row.id+'" class="btnList" title="${text("删除CNC过程参数记录表")}" data-confirm="${text("确认要删除该CNC过程参数记录表吗?")}"><i class="fa fa-trash-o"></i></a>&nbsp;');
+			//<% } %>
+			return actions.join('');
+		}}
+	],
+	// 加载成功后执行事件
+	ajaxSuccess: function(data){
+		
+	}
+});
+</script>

+ 74 - 0
src/main/resources/views/modules/mes/mesSnColdForm.html

@@ -0,0 +1,74 @@
+<% 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(mesSnCold.isNewRecord ? '新增工件水冷板绑定' : '编辑工件水冷板绑定')}
+			</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="${mesSnCold}" action="${ctx}/mes/mesSnCold/save" method="post" class="form-horizontal">
+			<div class="box-body">
+				<div class="form-unit">${text('基本信息')}</div>
+				<#form:hidden path="id"/>
+				<div class="row">
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4" title="">
+								<span class="required hide">*</span> ${text('工件码')}:<i class="fa icon-question hide"></i></label>
+							<div class="col-sm-8">
+								<#form:input path="sn" maxlength="64" class="form-control"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4" title="">
+								<span class="required hide">*</span> ${text('水冷板码')}:<i class="fa icon-question hide"></i></label>
+							<div class="col-sm-8">
+								<#form:input path="coldSn" maxlength="64" class="form-control"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4" title="">
+								<span class="required hide">*</span> ${text('更新时间')}:<i class="fa icon-question hide"></i></label>
+							<div class="col-sm-8">
+								<#form:input path="updateTime" readonly="true" maxlength="20" class="form-control laydate"
+									dataFormat="datetime" data-type="datetime" data-format="yyyy-MM-dd HH:mm"/>
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
+			<div class="box-footer">
+				<div class="row">
+					<div class="col-sm-offset-2 col-sm-10">
+						<% if (hasPermi('mes:mesSnCold:edit')){ %>
+							<button type="submit" class="btn btn-sm btn-primary" id="btnSubmit"><i class="fa fa-check"></i> ${text('保 存')}</button>&nbsp;
+						<% } %>
+						<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>
+<% } %>
+<script>
+$("#inputForm").validate({
+	submitHandler: function(form){
+		js.ajaxSubmitForm($(form), function(data){
+			js.showMessage(data.message);
+			if(data.result == Global.TRUE){
+				js.closeCurrentTabPage(function(contentWindow){
+					contentWindow.page();
+				});
+			}
+		}, "json");
+    }
+});
+</script>

+ 73 - 0
src/main/resources/views/modules/mes/mesSnColdList.html

@@ -0,0 +1,73 @@
+<% 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>
+				<% if(hasPermi('mes:mesSnCold:edit')){ %>
+					<a href="${ctx}/mes/mesSnCold/form" class="btn btn-default btnTool" title="${text('新增工件水冷板绑定')}"><i class="fa fa-plus"></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="${mesSnCold}" action="${ctx}/mes/mesSnCold/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="sn" 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="coldSn" 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="updateTime" 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').dataGrid({
+	searchForm: $("#searchForm"),
+	columnModel: [
+		{header:'${text("工件码")}', name:'sn', index:'a.sn', width:150, align:"left", frozen:true, formatter: function(val, obj, row, act){
+			return '<a href="${ctx}/mes/mesSnCold/form?id='+row.id+'" class="btnList" data-title="${text("编辑工件水冷板绑定")}">'+(val||row.id)+'</a>';
+		}},
+		{header:'${text("水冷板码")}', name:'coldSn', index:'a.cold_sn', width:150, align:"left"},
+		{header:'${text("更新时间")}', name:'updateTime', index:'a.update_time', width:150, align:"center"},
+		{header:'${text("操作")}', name:'actions', width:120, formatter: function(val, obj, row, act){
+			var actions = [];
+			//<% if(hasPermi('mes:mesSnCold:edit')){ %>
+				actions.push('<a href="${ctx}/mes/mesSnCold/form?id='+row.id+'" class="btnList" title="${text("编辑工件水冷板绑定")}"><i class="fa fa-pencil"></i></a>&nbsp;');
+				actions.push('<a href="${ctx}/mes/mesSnCold/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>