Selaa lähdekoodia

新增模具维保项,模具维保计划表,实现模具批次生产数的记录

dkk 3 kuukautta sitten
vanhempi
commit
eb5beba2cd

+ 15 - 0
src/main/java/com/jeesite/modules/mes/dao/MesMoldMaintenanceItemDao.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.MesMoldMaintenanceItem;
+
+/**
+ * 模具维保项DAO接口
+ * @author mes
+ * @version 2026-07-10
+ */
+@MyBatisDao
+public interface MesMoldMaintenanceItemDao extends CrudDao<MesMoldMaintenanceItem> {
+
+}

+ 15 - 0
src/main/java/com/jeesite/modules/mes/dao/MesMoldMaintenancePlanDao.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.MesMoldMaintenancePlan;
+
+/**
+ * 模具维保计划DAO接口
+ * @author mes
+ * @version 2026-07-10
+ */
+@MyBatisDao
+public interface MesMoldMaintenancePlanDao extends CrudDao<MesMoldMaintenancePlan> {
+
+}

+ 74 - 0
src/main/java/com/jeesite/modules/mes/entity/MesMoldMaintenanceItem.java

@@ -0,0 +1,74 @@
+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;
+
+/**
+ * 模具维保项Entity
+ * @author mes
+ * @version 2026-07-10
+ */
+@Table(name="mes_mold_maintenance_item", alias="a", label="模具维保项信息", columns={
+		@Column(name="id", attrName="id", label="id", isPK=true),
+		@Column(name="maintenance_type", attrName="maintenanceType", label="维保类型", isQuery=true),
+		@Column(name="maintenance_level", attrName="maintenanceLevel", label="维保等级", isQuery=true),
+		@Column(name="maintenance_content", attrName="maintenanceContent", label="维保内容", isQuery=true),
+		@Column(name="batch_production_num", attrName="batchProductionNum", label="批次生产数"),
+		@Column(name="create_by", attrName="createBy", label="create_by", isUpdate=false, isQuery=false),
+		@Column(name="create_date", attrName="createDate", label="create_date", isUpdate=false, isQuery=false, isUpdateForce=true),
+		@Column(name="update_by", attrName="updateBy", label="update_by", isQuery=false),
+		@Column(name="update_date", attrName="updateDate", label="update_date", isQuery=false, isUpdateForce=true),
+}, orderBy="a.update_date DESC"
+)
+public class MesMoldMaintenanceItem extends DataEntity<MesMoldMaintenanceItem> {
+
+	private static final long serialVersionUID = 1L;
+	private String maintenanceType;		// 维保类型
+	private String maintenanceLevel;	// 维保等级
+	private String maintenanceContent;	// 维保内容
+	private Integer batchProductionNum;	// 批次生产数
+
+	public MesMoldMaintenanceItem() {
+		this(null);
+	}
+
+	public MesMoldMaintenanceItem(String id){
+		super(id);
+	}
+
+	public String getMaintenanceType() {
+		return maintenanceType;
+	}
+
+	public void setMaintenanceType(String maintenanceType) {
+		this.maintenanceType = maintenanceType;
+	}
+
+	@Size(min=0, max=100, message="维保等级长度不能超过 100 个字符")
+	public String getMaintenanceLevel() {
+		return maintenanceLevel;
+	}
+
+	public void setMaintenanceLevel(String maintenanceLevel) {
+		this.maintenanceLevel = maintenanceLevel;
+	}
+
+	public String getMaintenanceContent() {
+		return maintenanceContent;
+	}
+
+	public void setMaintenanceContent(String maintenanceContent) {
+		this.maintenanceContent = maintenanceContent;
+	}
+
+	public Integer getBatchProductionNum() {
+		return batchProductionNum;
+	}
+
+	public void setBatchProductionNum(Integer batchProductionNum) {
+		this.batchProductionNum = batchProductionNum;
+	}
+}

+ 171 - 0
src/main/java/com/jeesite/modules/mes/entity/MesMoldMaintenancePlan.java

@@ -0,0 +1,171 @@
+package com.jeesite.modules.mes.entity;
+
+import java.util.Date;
+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;
+
+/**
+ * 模具维保计划Entity
+ * @author mes
+ * @version 2026-07-10
+ */
+@Table(name="mes_mold_maintenance_plan", alias="a", label="模具维保计划信息", columns={
+		@Column(name="id", attrName="id", label="id", isPK=true),
+		@Column(name="dept", attrName="dept", label="部门", isQuery=true),
+		@Column(name="section", attrName="section", label="工段", isQuery=true),
+		@Column(name="part_name", attrName="partName", label="零件名称", isQuery=true),
+		@Column(name="part_no", attrName="partNo", label="零件号", isQuery=true),
+		@Column(name="mold_code", attrName="moldCode", label="模具号", isQuery=true),
+		@Column(name="maintenance_item_id", attrName="maintenanceItemId", label="模具维保项ID"),
+		@Column(name="last_maintenance_type", attrName="lastMaintenanceType", label="上次维保类型", isQuery=true),
+		@Column(name="last_maintenance_level", attrName="lastMaintenanceLevel", label="上次维保等级"),
+		@Column(name="last_maintenance_content", attrName="lastMaintenanceContent", label="上次维保内容"),
+		@Column(name="remain_batch_production_num", attrName="remainBatchProductionNum", label="剩余批次生产数"),
+		@Column(name="last_maintenance_finish_qty", attrName="lastMaintenanceFinishQty", label="上次保养生产完成数"),
+		@Column(name="last_maintenance_date", attrName="lastMaintenanceDate", label="上次维保时间", isQuery=true),
+		@Column(name="create_by", attrName="createBy", label="create_by", isUpdate=false, isQuery=false),
+		@Column(name="create_date", attrName="createDate", label="create_date", isUpdate=false, isQuery=false, isUpdateForce=true),
+		@Column(name="update_by", attrName="updateBy", label="update_by", isQuery=false),
+		@Column(name="update_date", attrName="updateDate", label="update_date", isQuery=false, isUpdateForce=true),
+}, orderBy="a.update_date DESC"
+)
+public class MesMoldMaintenancePlan extends DataEntity<MesMoldMaintenancePlan> {
+
+	private static final long serialVersionUID = 1L;
+	private String dept;					// 部门
+	private String section;					// 工段
+	private String partName;				// 零件名称
+	private String partNo;					// 零件号
+	private String moldCode;				// 模具号
+	private String maintenanceItemId;		// 模具维保项ID
+	private String lastMaintenanceType;		// 上次维保类型
+	private String lastMaintenanceLevel;	// 上次维保等级
+	private String lastMaintenanceContent;	// 上次维保内容
+	private Integer remainBatchProductionNum;	// 剩余批次生产数
+	private Integer lastMaintenanceFinishQty;	// 上次保养生产完成数
+	private Integer batchCompleteNum;		// 批次完成数(实时计算,不持久化)
+	private Date lastMaintenanceDate;		// 上次维保时间
+
+	public MesMoldMaintenancePlan() {
+		this(null);
+	}
+
+	public MesMoldMaintenancePlan(String id){
+		super(id);
+	}
+
+	@Size(min=0, max=100, message="部门长度不能超过 100 个字符")
+	public String getDept() {
+		return dept;
+	}
+
+	public void setDept(String dept) {
+		this.dept = dept;
+	}
+
+	@Size(min=0, max=100, message="工段长度不能超过 100 个字符")
+	public String getSection() {
+		return section;
+	}
+
+	public void setSection(String section) {
+		this.section = section;
+	}
+
+	@Size(min=0, max=255, message="零件名称长度不能超过 255 个字符")
+	public String getPartName() {
+		return partName;
+	}
+
+	public void setPartName(String partName) {
+		this.partName = partName;
+	}
+
+	@Size(min=0, max=100, message="零件号长度不能超过 100 个字符")
+	public String getPartNo() {
+		return partNo;
+	}
+
+	public void setPartNo(String partNo) {
+		this.partNo = partNo;
+	}
+
+	@Size(min=0, max=100, message="模具号长度不能超过 100 个字符")
+	public String getMoldCode() {
+		return moldCode;
+	}
+
+	public void setMoldCode(String moldCode) {
+		this.moldCode = moldCode;
+	}
+
+	public String getMaintenanceItemId() {
+		return maintenanceItemId;
+	}
+
+	public void setMaintenanceItemId(String maintenanceItemId) {
+		this.maintenanceItemId = maintenanceItemId;
+	}
+
+	public String getLastMaintenanceType() {
+		return lastMaintenanceType;
+	}
+
+	public void setLastMaintenanceType(String lastMaintenanceType) {
+		this.lastMaintenanceType = lastMaintenanceType;
+	}
+
+	@Size(min=0, max=100, message="上次维保等级长度不能超过 100 个字符")
+	public String getLastMaintenanceLevel() {
+		return lastMaintenanceLevel;
+	}
+
+	public void setLastMaintenanceLevel(String lastMaintenanceLevel) {
+		this.lastMaintenanceLevel = lastMaintenanceLevel;
+	}
+
+	public String getLastMaintenanceContent() {
+		return lastMaintenanceContent;
+	}
+
+	public void setLastMaintenanceContent(String lastMaintenanceContent) {
+		this.lastMaintenanceContent = lastMaintenanceContent;
+	}
+
+	public Integer getRemainBatchProductionNum() {
+		return remainBatchProductionNum;
+	}
+
+	public void setRemainBatchProductionNum(Integer remainBatchProductionNum) {
+		this.remainBatchProductionNum = remainBatchProductionNum;
+	}
+
+	public Integer getLastMaintenanceFinishQty() {
+		return lastMaintenanceFinishQty;
+	}
+
+	public void setLastMaintenanceFinishQty(Integer lastMaintenanceFinishQty) {
+		this.lastMaintenanceFinishQty = lastMaintenanceFinishQty;
+	}
+
+	public Integer getBatchCompleteNum() {
+		return batchCompleteNum;
+	}
+
+	public void setBatchCompleteNum(Integer batchCompleteNum) {
+		this.batchCompleteNum = batchCompleteNum;
+	}
+
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	public Date getLastMaintenanceDate() {
+		return lastMaintenanceDate;
+	}
+
+	public void setLastMaintenanceDate(Date lastMaintenanceDate) {
+		this.lastMaintenanceDate = lastMaintenanceDate;
+	}
+}

+ 62 - 0
src/main/java/com/jeesite/modules/mes/service/MesMoldMaintenanceItemService.java

@@ -0,0 +1,62 @@
+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.MesMoldMaintenanceItem;
+import com.jeesite.modules.mes.dao.MesMoldMaintenanceItemDao;
+
+/**
+ * 模具维保项Service
+ * @author mes
+ * @version 2026-07-10
+ */
+@Service
+public class MesMoldMaintenanceItemService extends CrudService<MesMoldMaintenanceItemDao, MesMoldMaintenanceItem> {
+
+	/**
+	 * 获取单条数据
+	 */
+	@Override
+	public MesMoldMaintenanceItem get(MesMoldMaintenanceItem mesMoldMaintenanceItem) {
+		return super.get(mesMoldMaintenanceItem);
+	}
+
+	/**
+	 * 查询分页数据
+	 */
+	@Override
+	public Page<MesMoldMaintenanceItem> findPage(MesMoldMaintenanceItem mesMoldMaintenanceItem) {
+		return super.findPage(mesMoldMaintenanceItem);
+	}
+
+	/**
+	 * 查询列表数据
+	 */
+	@Override
+	public List<MesMoldMaintenanceItem> findList(MesMoldMaintenanceItem mesMoldMaintenanceItem) {
+		return super.findList(mesMoldMaintenanceItem);
+	}
+
+	/**
+	 * 保存数据(插入或更新)
+	 */
+	@Override
+	@Transactional
+	public void save(MesMoldMaintenanceItem mesMoldMaintenanceItem) {
+		super.save(mesMoldMaintenanceItem);
+	}
+
+	/**
+	 * 删除数据
+	 */
+	@Override
+	@Transactional
+	public void delete(MesMoldMaintenanceItem mesMoldMaintenanceItem) {
+		super.delete(mesMoldMaintenanceItem);
+	}
+
+}

+ 154 - 0
src/main/java/com/jeesite/modules/mes/service/MesMoldMaintenancePlanService.java

@@ -0,0 +1,154 @@
+package com.jeesite.modules.mes.service;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.springframework.beans.factory.annotation.Autowired;
+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.MesMoldMaintenanceItem;
+import com.jeesite.modules.mes.entity.MesMoldMaintenancePlan;
+import com.jeesite.modules.mes.dao.MesMoldMaintenanceItemDao;
+import com.jeesite.modules.mes.dao.MesMoldMaintenancePlanDao;
+import com.jeesite.modules.tianHong.dao.RptProductionSummaryDao;
+
+/**
+ * 模具维保计划Service
+ * @author mes
+ * @version 2026-07-10
+ */
+@Service
+public class MesMoldMaintenancePlanService extends CrudService<MesMoldMaintenancePlanDao, MesMoldMaintenancePlan> {
+
+	@Autowired
+	private MesMoldMaintenanceItemDao mesMoldMaintenanceItemDao;
+
+	@Autowired
+	private RptProductionSummaryDao rptProductionSummaryDao;
+
+	/**
+	 * 获取单条数据
+	 */
+	@Override
+	public MesMoldMaintenancePlan get(MesMoldMaintenancePlan mesMoldMaintenancePlan) {
+		return super.get(mesMoldMaintenancePlan);
+	}
+
+	/**
+	 * 查询分页数据
+	 * 查询后实时计算批次完成数和剩余批次生产数:
+	 * 批次完成数 = bzh库FinishQTY - 上次保养生产完成数
+	 * 剩余批次生产数 = 数据库中的remainBatchProductionNum - 批次完成数
+	 */
+	@Override
+	public Page<MesMoldMaintenancePlan> findPage(MesMoldMaintenancePlan mesMoldMaintenancePlan) {
+		Page<MesMoldMaintenancePlan> page = super.findPage(mesMoldMaintenancePlan);
+		List<MesMoldMaintenancePlan> list = page.getList();
+		if (list != null && !list.isEmpty()) {
+			// 收集所有非空moldCode
+			List<String> moldCodes = new ArrayList<>();
+			for (MesMoldMaintenancePlan plan : list) {
+				if (plan.getMoldCode() != null && !plan.getMoldCode().isEmpty()) {
+					moldCodes.add(plan.getMoldCode());
+				}
+			}
+			// 批量查询bzh库FinishQTY
+			Map<String, Integer> finishQtyMap = new HashMap<>();
+			if (!moldCodes.isEmpty()) {
+				List<Map<String, Object>> finishQtyList = rptProductionSummaryDao.getFinishQtyByEqpIds(moldCodes);
+				if (finishQtyList != null) {
+					for (Map<String, Object> item : finishQtyList) {
+						String eqpId = (String) item.get("eqpId");
+						Integer finishQty = ((Number) item.get("finishQty")).intValue();
+						finishQtyMap.put(eqpId, finishQty);
+					}
+				}
+			}
+			// 计算批次完成数和剩余批次生产数
+			for (MesMoldMaintenancePlan plan : list) {
+				Integer finishQty = finishQtyMap.get(plan.getMoldCode());
+				if (finishQty == null) {
+					finishQty = 0;
+				}
+				Integer lastFinishQty = plan.getLastMaintenanceFinishQty();
+				if (lastFinishQty == null) {
+					lastFinishQty = 0;
+				}
+				// 批次完成数 = FinishQTY - 上次保养生产完成数
+				int batchCompleteNum = finishQty - lastFinishQty;
+				if (batchCompleteNum < 0) {
+					batchCompleteNum = 0;
+				}
+				plan.setBatchCompleteNum(batchCompleteNum);
+				// 剩余批次生产数 = 当前值 - 批次完成数
+				Integer remainNum = plan.getRemainBatchProductionNum();
+				if (remainNum == null) {
+					remainNum = 0;
+				}
+				int displayRemainNum = remainNum - batchCompleteNum;
+				if (displayRemainNum < 0) {
+					displayRemainNum = 0;
+				}
+				plan.setRemainBatchProductionNum(displayRemainNum);
+			}
+		}
+		return page;
+	}
+
+	/**
+	 * 查询列表数据
+	 */
+	@Override
+	public List<MesMoldMaintenancePlan> findList(MesMoldMaintenancePlan mesMoldMaintenancePlan) {
+		return super.findList(mesMoldMaintenancePlan);
+	}
+
+	/**
+	 * 保存数据(插入或更新)
+	 */
+	@Override
+	@Transactional
+	public void save(MesMoldMaintenancePlan mesMoldMaintenancePlan) {
+		super.save(mesMoldMaintenancePlan);
+	}
+
+	/**
+	 * 删除数据
+	 */
+	@Override
+	@Transactional
+	public void delete(MesMoldMaintenancePlan mesMoldMaintenancePlan) {
+		super.delete(mesMoldMaintenancePlan);
+	}
+
+	/**
+	 * 执行保养:根据选中的保养项更新维保计划
+	 * 保养时记录bzh库当前FinishQTY作为上次保养生产完成数
+	 */
+	@Transactional
+	public void doUpkeep(MesMoldMaintenancePlan mesMoldMaintenancePlan, String itemId) {
+		MesMoldMaintenanceItem item = new MesMoldMaintenanceItem();
+		item.setId(itemId);
+		item = mesMoldMaintenanceItemDao.get(item);
+		if (item != null) {
+			mesMoldMaintenancePlan.setMaintenanceItemId(item.getId());
+			mesMoldMaintenancePlan.setRemainBatchProductionNum(item.getBatchProductionNum());
+			mesMoldMaintenancePlan.setLastMaintenanceLevel(item.getMaintenanceLevel());
+			mesMoldMaintenancePlan.setLastMaintenanceContent(item.getMaintenanceContent());
+			mesMoldMaintenancePlan.setLastMaintenanceDate(new Date());
+			// 查询bzh库当前FinishQTY,保存为上次保养生产完成数
+			Integer finishQty = rptProductionSummaryDao.getFinishQtyByEqpId(mesMoldMaintenancePlan.getMoldCode());
+			if (finishQty == null) {
+				finishQty = 0;
+			}
+			mesMoldMaintenancePlan.setLastMaintenanceFinishQty(finishQty);
+		}
+		super.save(mesMoldMaintenancePlan);
+	}
+
+}

+ 96 - 0
src/main/java/com/jeesite/modules/mes/web/MesMoldMaintenanceItemController.java

@@ -0,0 +1,96 @@
+package com.jeesite.modules.mes.web;
+
+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.web.BaseController;
+import com.jeesite.modules.mes.entity.MesMoldMaintenanceItem;
+import com.jeesite.modules.mes.service.MesMoldMaintenanceItemService;
+
+/**
+ * 模具维保项Controller
+ * @author mes
+ * @version 2026-07-10
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/mes/mesMoldMaintenanceItem")
+public class MesMoldMaintenanceItemController extends BaseController {
+
+	@Autowired
+	private MesMoldMaintenanceItemService mesMoldMaintenanceItemService;
+
+	/**
+	 * 获取数据
+	 */
+	@ModelAttribute
+	public MesMoldMaintenanceItem get(String id, boolean isNewRecord) {
+		return mesMoldMaintenanceItemService.get(id, isNewRecord);
+	}
+
+	/**
+	 * 查询列表
+	 */
+	@RequiresPermissions("mes:mesMoldMaintenanceItem:view")
+	@RequestMapping(value = {"list", ""})
+	public String list(MesMoldMaintenanceItem mesMoldMaintenanceItem, Model model) {
+		model.addAttribute("mesMoldMaintenanceItem", mesMoldMaintenanceItem);
+		return "modules/mes/mesMoldMaintenanceItemList";
+	}
+
+	/**
+	 * 查询列表数据
+	 */
+	@RequiresPermissions("mes:mesMoldMaintenanceItem:view")
+	@RequestMapping(value = "listData")
+	@ResponseBody
+	public Page<MesMoldMaintenanceItem> listData(MesMoldMaintenanceItem mesMoldMaintenanceItem, HttpServletRequest request, HttpServletResponse response) {
+		mesMoldMaintenanceItem.setPage(new Page<>(request, response));
+		Page<MesMoldMaintenanceItem> page = mesMoldMaintenanceItemService.findPage(mesMoldMaintenanceItem);
+		return page;
+	}
+
+	/**
+	 * 查看编辑表单
+	 */
+	@RequiresPermissions("mes:mesMoldMaintenanceItem:view")
+	@RequestMapping(value = "form")
+	public String form(MesMoldMaintenanceItem mesMoldMaintenanceItem, Model model) {
+		model.addAttribute("mesMoldMaintenanceItem", mesMoldMaintenanceItem);
+		return "modules/mes/mesMoldMaintenanceItemForm";
+	}
+
+	/**
+	 * 保存数据
+	 */
+	@RequiresPermissions("mes:mesMoldMaintenanceItem:edit")
+	@PostMapping(value = "save")
+	@ResponseBody
+	public String save(@Validated MesMoldMaintenanceItem mesMoldMaintenanceItem) {
+		mesMoldMaintenanceItemService.save(mesMoldMaintenanceItem);
+		return renderResult(Global.TRUE, text("保存模具维保项成功!"));
+	}
+
+	/**
+	 * 删除数据
+	 */
+	@RequiresPermissions("mes:mesMoldMaintenanceItem:edit")
+	@RequestMapping(value = "delete")
+	@ResponseBody
+	public String delete(MesMoldMaintenanceItem mesMoldMaintenanceItem) {
+		mesMoldMaintenanceItemService.delete(mesMoldMaintenanceItem);
+		return renderResult(Global.TRUE, text("删除模具维保项成功!"));
+	}
+
+}

+ 118 - 0
src/main/java/com/jeesite/modules/mes/web/MesMoldMaintenancePlanController.java

@@ -0,0 +1,118 @@
+package com.jeesite.modules.mes.web;
+
+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.web.BaseController;
+import com.jeesite.modules.mes.entity.MesMoldMaintenanceItem;
+import com.jeesite.modules.mes.entity.MesMoldMaintenancePlan;
+import com.jeesite.modules.mes.service.MesMoldMaintenancePlanService;
+
+/**
+ * 模具维保计划Controller
+ * @author mes
+ * @version 2026-07-10
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/mes/mesMoldMaintenancePlan")
+public class MesMoldMaintenancePlanController extends BaseController {
+
+	@Autowired
+	private MesMoldMaintenancePlanService mesMoldMaintenancePlanService;
+
+	/**
+	 * 获取数据
+	 */
+	@ModelAttribute
+	public MesMoldMaintenancePlan get(String id, boolean isNewRecord) {
+		return mesMoldMaintenancePlanService.get(id, isNewRecord);
+	}
+
+	/**
+	 * 查询列表
+	 */
+	@RequiresPermissions("mes:mesMoldMaintenancePlan:view")
+	@RequestMapping(value = {"list", ""})
+	public String list(MesMoldMaintenancePlan mesMoldMaintenancePlan, Model model) {
+		model.addAttribute("mesMoldMaintenancePlan", mesMoldMaintenancePlan);
+		return "modules/mes/mesMoldMaintenancePlanList";
+	}
+
+	/**
+	 * 查询列表数据
+	 */
+	@RequiresPermissions("mes:mesMoldMaintenancePlan:view")
+	@RequestMapping(value = "listData")
+	@ResponseBody
+	public Page<MesMoldMaintenancePlan> listData(MesMoldMaintenancePlan mesMoldMaintenancePlan, HttpServletRequest request, HttpServletResponse response) {
+		mesMoldMaintenancePlan.setPage(new Page<>(request, response));
+		Page<MesMoldMaintenancePlan> page = mesMoldMaintenancePlanService.findPage(mesMoldMaintenancePlan);
+		return page;
+	}
+
+	/**
+	 * 查看编辑表单
+	 */
+	@RequiresPermissions("mes:mesMoldMaintenancePlan:view")
+	@RequestMapping(value = "form")
+	public String form(MesMoldMaintenancePlan mesMoldMaintenancePlan, Model model) {
+		model.addAttribute("mesMoldMaintenancePlan", mesMoldMaintenancePlan);
+		return "modules/mes/mesMoldMaintenancePlanForm";
+	}
+
+	/**
+	 * 保存数据
+	 */
+	@RequiresPermissions("mes:mesMoldMaintenancePlan:edit")
+	@PostMapping(value = "save")
+	@ResponseBody
+	public String save(@Validated MesMoldMaintenancePlan mesMoldMaintenancePlan) {
+		mesMoldMaintenancePlanService.save(mesMoldMaintenancePlan);
+		return renderResult(Global.TRUE, text("保存模具维保计划成功!"));
+	}
+
+	/**
+	 * 删除数据
+	 */
+	@RequiresPermissions("mes:mesMoldMaintenancePlan:edit")
+	@RequestMapping(value = "delete")
+	@ResponseBody
+	public String delete(MesMoldMaintenancePlan mesMoldMaintenancePlan) {
+		mesMoldMaintenancePlanService.delete(mesMoldMaintenancePlan);
+		return renderResult(Global.TRUE, text("删除模具维保计划成功!"));
+	}
+
+	/**
+	 * 保养项选择弹窗
+	 */
+	@RequiresPermissions("mes:mesMoldMaintenancePlan:edit")
+	@RequestMapping(value = "upkeepSelect")
+	public String upkeepSelect(MesMoldMaintenanceItem mesMoldMaintenanceItem, Model model) {
+		model.addAttribute("mesMoldMaintenanceItem", mesMoldMaintenanceItem);
+		return "modules/mes/mesMoldMaintenancePlanUpkeepSelect";
+	}
+
+	/**
+	 * 执行保养:根据选中的保养项更新维保计划
+	 */
+	@RequiresPermissions("mes:mesMoldMaintenancePlan:edit")
+	@PostMapping(value = "doUpkeep")
+	@ResponseBody
+	public String doUpkeep(MesMoldMaintenancePlan mesMoldMaintenancePlan, String itemId) {
+		mesMoldMaintenancePlanService.doUpkeep(mesMoldMaintenancePlan, itemId);
+		return renderResult(Global.TRUE, text("保养操作成功!"));
+	}
+
+}

+ 27 - 0
src/main/java/com/jeesite/modules/tianHong/dao/RptProductionSummaryDao.java

@@ -0,0 +1,27 @@
+package com.jeesite.modules.tianHong.dao;
+
+import java.util.List;
+import com.jeesite.common.mybatis.annotation.MyBatisDao;
+
+/**
+ * 生产统计汇总DAO接口(bzh数据源)
+ * 所属包路径 com.jeesite.modules.tianHong.dao 自动映射到 tianHong 数据源(bzh 库)
+ * @author mes
+ */
+@MyBatisDao
+public interface RptProductionSummaryDao {
+
+	/**
+	 * 根据设备号(EQP_ID)查询完成数量总和(FinishQTY)
+	 * @param eqpId 设备号(对应模具维保计划的moldCode)
+	 * @return FinishQTY总和,无数据返回null
+	 */
+	Integer getFinishQtyByEqpId(String eqpId);
+
+	/**
+	 * 根据多个设备号批量查询完成数量总和
+	 * @param eqpIds 设备号列表
+	 * @return 每个设备号的完成数量,返回数组每项包含 eqpId 和 finishQty
+	 */
+	List<java.util.Map<String, Object>> getFinishQtyByEqpIds(List<String> eqpIds);
+}

+ 15 - 0
src/main/resources/mappings/modules/mes/MesMoldMaintenanceItemDao.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.MesMoldMaintenanceItemDao">
+
+	<!-- 查询数据
+	<select id="findList" resultType="MesMoldMaintenanceItem">
+		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/MesMoldMaintenancePlanDao.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.MesMoldMaintenancePlanDao">
+
+	<!-- 查询数据
+	<select id="findList" resultType="MesMoldMaintenancePlan">
+		SELECT ${sqlMap.column.toSql()}
+		FROM ${sqlMap.table.toSql()}
+		<where>
+			${sqlMap.where.toSql()}
+		</where>
+		ORDER BY ${sqlMap.order.toSql()}
+	</select> -->
+
+</mapper>

+ 23 - 0
src/main/resources/mappings/modules/tianHong/RptProductionSummaryDao.xml

@@ -0,0 +1,23 @@
+<?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.tianHong.dao.RptProductionSummaryDao">
+
+	<!-- 根据设备号(EQP_ID)查询完成数量总和(FinishQTY) -->
+	<select id="getFinishQtyByEqpId" resultType="java.lang.Integer">
+		SELECT CAST(IFNULL(SUM(FinishQTY), 0) AS SIGNED)
+		FROM rpt_production_summary
+		WHERE EQP_ID = #{eqpId}
+	</select>
+
+	<!-- 根据多个设备号批量查询完成数量总和 -->
+	<select id="getFinishQtyByEqpIds" resultType="java.util.Map">
+		SELECT EQP_ID AS "eqpId", CAST(IFNULL(SUM(FinishQTY), 0) AS SIGNED) AS "finishQty"
+		FROM rpt_production_summary
+		WHERE EQP_ID IN
+		<foreach collection="list" item="eqpId" open="(" separator="," close=")">
+			#{eqpId}
+		</foreach>
+		GROUP BY EQP_ID
+	</select>
+
+</mapper>

+ 86 - 0
src/main/resources/views/modules/mes/mesMoldMaintenanceItemForm.html

@@ -0,0 +1,86 @@
+<% layout('/layouts/default.html', {title: '模具维保项管理', libs: ['validate','dataGrid']}){ %>
+<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(mesMoldMaintenanceItem.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="${mesMoldMaintenanceItem}" action="${ctx}/mes/mesMoldMaintenanceItem/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:select path="maintenanceType" dictType="mes_mold_maintenance_type" blankOption="true" class="form-control required"/>
+							</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="maintenanceLevel" maxlength="100" class="form-control required"/>
+							</div>
+						</div>
+					</div>
+				</div>
+				<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="batchProductionNum" class="form-control required digits"/>
+							</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('维保内容')}:<i class="fa icon-question hide"></i></label>
+							<div class="col-sm-10">
+								<#form:textarea path="maintenanceContent" 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:mesMoldMaintenanceItem: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>

+ 70 - 0
src/main/resources/views/modules/mes/mesMoldMaintenanceItemList.html

@@ -0,0 +1,70 @@
+<% 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:mesMoldMaintenanceItem:edit')){ %>
+					<a href="${ctx}/mes/mesMoldMaintenanceItem/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="${mesMoldMaintenanceItem}" action="${ctx}/mes/mesMoldMaintenanceItem/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:select path="maintenanceType" dictType="mes_mold_maintenance_type" blankOption="true" class="form-control width-120"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<label class="control-label">${text('维保等级')}:</label>
+					<div class="control-inline">
+						<#form:input path="maintenanceLevel" maxlength="100" 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:'id', index:'a.id', width:200, align:"center"},
+		{header:'${text("维保类型")}', name:'maintenanceType', index:'a.maintenance_type', width:120, align:"center", formatter: function(val){
+			return js.getDictLabel(${@DictUtils.getDictListJson('mes_mold_maintenance_type')}, val, '${text("未知")}', true);
+		}},
+		{header:'${text("维保等级")}', name:'maintenanceLevel', index:'a.maintenance_level', width:120, align:"center"},
+		{header:'${text("维保内容")}', name:'maintenanceContent', index:'a.maintenance_content', width:300, align:"left"},
+		{header:'${text("批次生产数")}', name:'batchProductionNum', index:'a.batch_production_num', width:120, align:"center"},
+		{header:'${text("创建时间")}', name:'createDate', index:'a.create_date', width:150, align:"center"},
+		{header:'${text("更新时间")}', name:'updateDate', index:'a.update_date', width:150, align:"center"},
+		{header:'${text("操作")}', name:'actions', width:120, formatter: function(val, obj, row, act){
+			var actions = [];
+			//<% if(hasPermi('mes:mesMoldMaintenanceItem:edit')){ %>
+				actions.push('<a href="${ctx}/mes/mesMoldMaintenanceItem/form?id='+row.id+'" class="btnList" title="${text("编辑模具维保项")}"><i class="fa fa-pencil"></i></a>&nbsp;');
+				actions.push('<a href="${ctx}/mes/mesMoldMaintenanceItem/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>

+ 232 - 0
src/main/resources/views/modules/mes/mesMoldMaintenancePlanForm.html

@@ -0,0 +1,232 @@
+<% layout('/layouts/default.html', {title: '模具维保计划管理', libs: ['validate','dataGrid','laydate']}){ %>
+<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(mesMoldMaintenancePlan.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="${mesMoldMaintenancePlan}" action="${ctx}/mes/mesMoldMaintenancePlan/save" method="post" class="form-horizontal">
+			<div class="box-body">
+				<div class="form-unit">${text('基本信息')}</div>
+				<#form:hidden path="id"/>
+				<#form:hidden path="maintenanceItemId"/>
+				<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="dept" maxlength="100" class="form-control required"/>
+							</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="section" maxlength="100" class="form-control required"/>
+							</div>
+						</div>
+					</div>
+				</div>
+				<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="partName" maxlength="255" class="form-control required"/>
+							</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="partNo" maxlength="100" class="form-control required"/>
+							</div>
+						</div>
+					</div>
+				</div>
+				<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="moldCode" maxlength="100" class="form-control required"/>
+							</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="lastMaintenanceDate" readonly="true" maxlength="20" class="form-control required" 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" title="">
+								<span class="required hide">*</span> ${text('选择维保项')}:<i class="fa icon-question hide"></i></label>
+							<div class="col-sm-8">
+								<select id="maintenanceItemSelect" class="form-control required">
+									<option value="">${text('请选择模具维保项')}</option>
+								</select>
+							</div>
+						</div>
+					</div>
+				</div>
+				<div class="row">
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4" title="">
+								${text('维保类型')}:<i class="fa icon-question hide"></i></label>
+							<div class="col-sm-8">
+								<#form:select path="lastMaintenanceType" dictType="mes_mold_maintenance_type" blankOption="true" class="form-control" disabled="disabled"/>
+							</div>
+						</div>
+					</div>
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4" title="">
+								${text('维保等级')}:<i class="fa icon-question hide"></i></label>
+							<div class="col-sm-8">
+								<#form:input path="lastMaintenanceLevel" readonly="true" maxlength="100" class="form-control"/>
+							</div>
+						</div>
+					</div>
+				</div>
+				<div class="row">
+					<div class="col-xs-6">
+						<div class="form-group">
+							<label class="control-label col-sm-4" title="">
+								${text('批次生产数')}:<i class="fa icon-question hide"></i></label>
+							<div class="col-sm-8">
+								<#form:input path="remainBatchProductionNum" readonly="true" 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="">
+								${text('维保内容')}:<i class="fa icon-question hide"></i></label>
+							<div class="col-sm-10">
+								<#form:textarea path="lastMaintenanceContent" readonly="true" 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:mesMoldMaintenancePlan: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>
+// 字典数据,用于维保项下拉框显示文本
+var maintenanceTypeDict = ${@DictUtils.getDictListJson('mes_mold_maintenance_type')};
+
+// 页面加载时获取模具维保项列表,填充下拉框
+$(function(){
+	loadMaintenanceItemSelect();
+
+	// 上次维保时间日期选择器
+	laydate.render({
+		elem: '#lastMaintenanceDate',
+		type: 'datetime',
+		format: 'yyyy-MM-dd HH:mm:ss'
+	});
+
+	// 维保项下拉框变更事件,自动填充字段
+	$('#maintenanceItemSelect').on('change', function(){
+		var itemId = $(this).val();
+		if(!itemId){
+			// 清空相关字段
+			$('#maintenanceItemId').val('');
+			$('#lastMaintenanceType').val('').trigger('change');
+			$('#lastMaintenanceLevel').val('');
+			$('#lastMaintenanceContent').val('');
+			$('#remainBatchProductionNum').val('');
+			return;
+		}
+		// ajax 获取维保项详情,自动填充
+		$.ajax({
+			url: '${ctx}/mes/mesMoldMaintenanceItem/listData',
+			data: { id: itemId, pageSize: 1, pageNo: 1 },
+			dataType: 'json',
+			success: function(data){
+				if(data.list && data.list.length > 0){
+					var item = data.list[0];
+					$('#maintenanceItemId').val(item.id);
+					$('#lastMaintenanceType').val(item.maintenanceType || '').trigger('change');
+					$('#lastMaintenanceLevel').val(item.maintenanceLevel || '');
+					$('#lastMaintenanceContent').val(item.maintenanceContent || '');
+					$('#remainBatchProductionNum').val(item.batchProductionNum || '');
+				}
+			}
+		});
+	});
+});
+
+// 加载模具维保项下拉框数据
+function loadMaintenanceItemSelect(){
+	$.ajax({
+		url: '${ctx}/mes/mesMoldMaintenanceItem/listData',
+		data: { pageSize: -1 },
+		dataType: 'json',
+		success: function(data){
+			var $select = $('#maintenanceItemSelect');
+			var currentId = $('#maintenanceItemId').val();
+			if(data.list && data.list.length > 0){
+				$.each(data.list, function(i, item){
+					var typeText = js.getDictLabel(maintenanceTypeDict, item.maintenanceType, '', true);
+					var label = typeText + ' - ' + (item.maintenanceLevel || '');
+					$('<option value="' + item.id + '">' + label + '</option>').appendTo($select);
+				});
+			}
+			// 编辑时选中当前维保项
+			if(currentId){
+				$select.val(currentId);
+			}
+		}
+	});
+}
+
+$("#inputForm").validate({
+	submitHandler: function(form){
+		// 提交前临时启用 disabled 的 select,确保其值被提交
+		$('#lastMaintenanceType').prop('disabled', false);
+		js.ajaxSubmitForm($(form), function(data){
+			js.showMessage(data.message);
+			if(data.result == Global.TRUE){
+				js.closeCurrentTabPage(function(contentWindow){
+					contentWindow.page();
+				});
+			}
+		}, "json");
+    }
+});
+</script>

+ 127 - 0
src/main/resources/views/modules/mes/mesMoldMaintenancePlanList.html

@@ -0,0 +1,127 @@
+<% 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:mesMoldMaintenancePlan:edit')){ %>
+					<a href="${ctx}/mes/mesMoldMaintenancePlan/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="${mesMoldMaintenancePlan}" action="${ctx}/mes/mesMoldMaintenancePlan/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="dept" 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="section" 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="partName" maxlength="255" class="form-control width-120"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<label class="control-label">${text('模具号')}:</label>
+					<div class="control-inline">
+						<#form:input path="moldCode" maxlength="100" class="form-control width-120"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<label class="control-label">${text('上次维保类型')}:</label>
+					<div class="control-inline">
+						<#form:select path="lastMaintenanceType" dictType="mes_mold_maintenance_type" blankOption="true" 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:'dept', index:'a.dept', width:120, align:"center"},
+		{header:'${text("工段")}', name:'section', index:'a.section', width:120, align:"center"},
+		{header:'${text("零件名称")}', name:'partName', index:'a.part_name', width:150, align:"center"},
+		{header:'${text("零件号")}', name:'partNo', index:'a.part_no', width:120, align:"center"},
+		{header:'${text("模具号")}', name:'moldCode', index:'a.mold_code', width:120, align:"center"},
+		{header:'${text("上次维保类型")}', name:'lastMaintenanceType', index:'a.last_maintenance_type', width:120, align:"center", formatter: function(val){
+			return js.getDictLabel(${@DictUtils.getDictListJson('mes_mold_maintenance_type')}, val, '${text("未知")}', true);
+		}},
+		{header:'${text("上次维保等级")}', name:'lastMaintenanceLevel', index:'a.last_maintenance_level', width:120, align:"center"},
+		{header:'${text("上次维保内容")}', name:'lastMaintenanceContent', index:'a.last_maintenance_content', width:250, align:"left"},
+		{header:'${text("上次保养生产完成数")}', name:'lastMaintenanceFinishQty', index:'a.last_maintenance_finish_qty', width:140, align:"center"},
+		{header:'${text("批次完成数")}', name:'batchCompleteNum', width:120, align:"center"},
+		{header:'${text("剩余批次生产数")}', name:'remainBatchProductionNum', index:'a.remain_batch_production_num', width:120, align:"center"},
+		{header:'${text("上次维保时间")}', name:'lastMaintenanceDate', index:'a.last_maintenance_date', width:150, align:"center"},
+		{header:'${text("操作")}', name:'actions', width:160, formatter: function(val, obj, row, act){
+			var actions = [];
+			//<% if(hasPermi('mes:mesMoldMaintenancePlan:edit')){ %>
+				actions.push('<a href="${ctx}/mes/mesMoldMaintenancePlan/form?id='+row.id+'" class="btnList" title="${text("编辑模具维保计划")}"><i class="fa fa-pencil"></i></a>&nbsp;');
+				actions.push('<a href="javascript:;" onclick="doUpkeep(\''+row.id+'\')" title="${text("保养")}"><i class="fa fa-wrench"></i></a>&nbsp;');
+				actions.push('<a href="${ctx}/mes/mesMoldMaintenancePlan/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){
+
+	}
+});
+
+// 保养操作:弹窗选择保养项后更新维保计划
+function doUpkeep(planId){
+	js.layer.open({
+		type: 2,
+		area: ['760px', '500px'],
+		title: '${text("选择保养项")}',
+		content: '${ctx}/mes/mesMoldMaintenancePlan/upkeepSelect',
+		btn: ['<i class="fa fa-check"></i> ${text("确定")}',
+			'<i class="fa fa-remove"></i> ${text("取消")}'],
+		btn1: function(index, layero){
+			var iframeWin = layero.find('iframe')[0].contentWindow;
+			var selectData = iframeWin.getSelectData();
+			if(!selectData || !selectData.id){
+				js.showMessage("${text('请选择一个保养项')}", null, 'warning');
+				return false;
+			}
+			$.ajax({
+				url: '${ctx}/mes/mesMoldMaintenancePlan/doUpkeep',
+				type: 'post',
+				data: { id: planId, itemId: selectData.id },
+				dataType: 'json',
+				success: function(data){
+					js.showMessage(data.message);
+					if(data.result == Global.TRUE){
+						js.layer.close(index);
+						$('#dataGrid').dataGrid('refresh');
+					}
+				}
+			});
+		}
+	});
+}
+</script>

+ 54 - 0
src/main/resources/views/modules/mes/mesMoldMaintenancePlanUpkeepSelect.html

@@ -0,0 +1,54 @@
+<% layout('/layouts/default.html', {title: '选择保养项', libs: ['dataGrid']}){ %>
+<div class="main-content">
+	<div class="box box-main">
+		<div class="box-body">
+			<#form:form id="searchForm" model="${mesMoldMaintenanceItem}" action="${ctx}/mes/mesMoldMaintenanceItem/listData" method="post" class="form-inline hide"
+					data-page-no="${parameter.pageNo}" data-page-size="${parameter.pageSize}" data-order-by="${parameter.orderBy}">
+				<#form:hidden name="maintenanceType" value="upkeep"/>
+				<div class="form-group">
+					<label class="control-label">${text('保养等级')}:</label>
+					<div class="control-inline">
+						<#form:input path="maintenanceLevel" maxlength="100" 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>
+var selectData = {};
+var dataGrid = $('#dataGrid').dataGrid({
+	searchForm: $("#searchForm"),
+	columnModel: [
+		{header:'${text("保养等级")}', name:'maintenanceLevel', index:'a.maintenance_level', width:150, align:"center"},
+		{header:'${text("保养内容")}', name:'maintenanceContent', index:'a.maintenance_content', width:350, align:"left"},
+		{header:'${text("批次生产数")}', name:'batchProductionNum', index:'a.batch_production_num', width:120, align:"center"},
+		{header:'行数据', name:'rowData', hidden:true, formatter: function(val, obj, row, act){
+			return JSON.stringify(row);
+		}}
+	],
+	multiselect: false,
+	onSelectRow: function(id, isSelect, event){
+		selectData = {};
+		if(isSelect){
+			selectData = JSON.parse(dataGrid.dataGrid('getRowData', id).rowData);
+		}
+	},
+	ondblClickRow: function(id, rownum, colnum, event){
+		selectData = JSON.parse(dataGrid.dataGrid('getRowData', id).rowData);
+		js.layer.$('#' + window.name).closest('.layui-layer')
+			.find(".layui-layer-btn0").trigger("click");
+	}
+});
+
+function getSelectData(){
+	return selectData;
+}
+</script>