Forráskód Böngészése

生产领料,退料,订单列表详情

sunxianglong 4 hónapja
szülő
commit
11510ec905
25 módosított fájl, 1804 hozzáadás és 39 törlés
  1. 5 9
      src/main/java/com/jeesite/modules/erp/entity/MesProductOrder.java
  2. 3 3
      src/main/java/com/jeesite/modules/erp/service/MesProductOrderService.java
  3. 66 1
      src/main/java/com/jeesite/modules/erp/web/MesProductOrderController.java
  4. 15 0
      src/main/java/com/jeesite/modules/mes/dao/MesMaterialLlDao.java
  5. 15 0
      src/main/java/com/jeesite/modules/mes/dao/MesMaterialTlDao.java
  6. 21 10
      src/main/java/com/jeesite/modules/mes/entity/MesMaterialBl.java
  7. 202 0
      src/main/java/com/jeesite/modules/mes/entity/MesMaterialLl.java
  8. 116 0
      src/main/java/com/jeesite/modules/mes/entity/MesMaterialTl.java
  9. 194 0
      src/main/java/com/jeesite/modules/mes/service/MesMaterialLlService.java
  10. 181 0
      src/main/java/com/jeesite/modules/mes/service/MesMaterialTlService.java
  11. 54 0
      src/main/java/com/jeesite/modules/mes/util/U9cAuthUtil.java
  12. 177 0
      src/main/java/com/jeesite/modules/mes/web/MesMaterialLlController.java
  13. 2 2
      src/main/java/com/jeesite/modules/mes/web/MesMaterialRkController.java
  14. 137 0
      src/main/java/com/jeesite/modules/mes/web/MesMaterialTlController.java
  15. 11 3
      src/main/resources/config/application.yml
  16. 15 0
      src/main/resources/mappings/modules/mes/MesMaterialLlDao.xml
  17. 15 0
      src/main/resources/mappings/modules/mes/MesMaterialTlDao.xml
  18. 10 10
      src/main/resources/views/modules/erp/mesProductOrderForm.html
  19. 1 1
      src/main/resources/views/modules/erp/mesProductOrderList.html
  20. 9 0
      src/main/resources/views/modules/mes/mesMaterialBlForm.html
  21. 1 0
      src/main/resources/views/modules/mes/mesMaterialBlList.html
  22. 176 0
      src/main/resources/views/modules/mes/mesMaterialLlForm.html
  23. 149 0
      src/main/resources/views/modules/mes/mesMaterialLlList.html
  24. 122 0
      src/main/resources/views/modules/mes/mesMaterialTlForm.html
  25. 107 0
      src/main/resources/views/modules/mes/mesMaterialTlList.html

+ 5 - 9
src/main/java/com/jeesite/modules/erp/entity/MesProductOrder.java

@@ -7,6 +7,7 @@ import java.util.List;
 import com.jeesite.common.mybatis.annotation.JoinTable;
 import com.jeesite.common.mybatis.annotation.JoinTable.Type;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.alibaba.fastjson.annotation.JSONField;
 
 import com.jeesite.common.entity.DataEntity;
 import com.jeesite.common.mybatis.annotation.Column;
@@ -23,7 +24,7 @@ import com.jeesite.modules.mes.entity.MesMaterialBl;
 		@Column(name="id", attrName="id", label="id", isPK=true),
 		@Column(name="sn", attrName="sn", label="订单编号"),
 		@Column(name="line_sn", attrName="lineSn", label="产线编号"),
-		@Column(name="doc_line_no", attrName="docLineNo", label="行号"),
+//		@Column(name="doc_line_no", attrName="docLineNo", label="行号"),
 		@Column(name="nums", attrName="nums", label="生产数量", isUpdateForce=true),
 		@Column(name="now_num", attrName="nowNums", label="当前生产入库数量", isUpdateForce=true),
 		@Column(name="delivery_date", attrName="deliveryDate", label="交货日期", isUpdateForce=true),
@@ -41,7 +42,7 @@ public class MesProductOrder extends DataEntity<MesProductOrder> {
 	private static final long serialVersionUID = 1L;
 	private String sn;		// 订单编号
 	private String lineSn;		// 产线编号
-	private String docLineNo;   //行号
+//	private String docLineNo;   //行号
 	private Integer nums;		// 生产数量
 	private Integer nowNums;		// 当前生产入库数量
 	private Date deliveryDate;		// 交货日期
@@ -58,13 +59,7 @@ public class MesProductOrder extends DataEntity<MesProductOrder> {
 		this.list = list;
 	}
 
-	public String getDocLineNo() {
-		return docLineNo;
-	}
 
-	public void setDocLineNo(String docLineNo) {
-		this.docLineNo = docLineNo;
-	}
 
 	public MesProductOrder() {
 		this(null);
@@ -100,7 +95,8 @@ public class MesProductOrder extends DataEntity<MesProductOrder> {
 		this.nums = nums;
 	}
 
-	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	@JSONField(format = "yyyy-MM-dd")
+	@JsonFormat(pattern = "yyyy-MM-dd")
 	public Date getDeliveryDate() {
 		return deliveryDate;
 	}

+ 3 - 3
src/main/java/com/jeesite/modules/erp/service/MesProductOrderService.java

@@ -113,9 +113,9 @@ public class MesProductOrderService extends CrudService<MesProductOrderDao, MesP
 		if (ListUtils.isEmpty(mesProductOrder.getList())) {
 			throw new ServiceException(text("备料清单不能为空!"));
 		}
-		if (mesProductOrder.getDocLineNo() == null) {
-			throw new ServiceException(text("行号不能为空!"));
-		}
+//		if (mesProductOrder.getDocLineNo() == null) {
+//			throw new ServiceException(text("行号不能为空!"));
+//		}
 
 		MesProductOrder exist = dao.findBySn(mesProductOrder.getSn(), null);
 		if (exist != null) {

+ 66 - 1
src/main/java/com/jeesite/modules/erp/web/MesProductOrderController.java

@@ -1,9 +1,13 @@
 package com.jeesite.modules.erp.web;
 
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
 import java.util.List;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
+import com.jeesite.modules.mes.resp.CommonResp;
 import org.apache.shiro.authz.annotation.RequiresPermissions;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Controller;
@@ -15,8 +19,11 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.ResponseBody;
 
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.jeesite.common.config.Global;
 import com.jeesite.common.entity.Page;
+import com.jeesite.common.lang.StringUtils;
 import com.jeesite.common.service.ServiceException;
 import com.jeesite.common.web.BaseController;
 import com.jeesite.modules.erp.entity.MesProductOrder;
@@ -97,13 +104,71 @@ public class MesProductOrderController extends BaseController {
 	}
 
 	/**
+	 * pda生产订单列表
+	 */
+//	@RequiresPermissions("erp:mesProductOrder:view")
+	@RequestMapping(value = "orderList")
+	@ResponseBody
+	public CommonResp orderList(MesProductOrder mesProductOrder) {
+		CommonResp<List<MesProductOrder> > resp = new CommonResp<>();
+		//展示所有未结束的订单
+		mesProductOrder.setState("1");//0=草稿 1=下发 2=完成
+		List<MesProductOrder> list = mesProductOrderService.findList(mesProductOrder);
+		resp.setData(list);
+		resp.setResult(Global.TRUE);
+		resp.setMessage("操作成功!");
+		return resp;
+	}
+	/**
+	 * pda生产订单详情
+	 */
+//	@RequiresPermissions("erp:mesProductOrder:view")
+	@RequestMapping(value = "orderInfo")
+	@ResponseBody
+	public CommonResp orderInfo(MesProductOrder mesProductOrder) {
+		CommonResp<MesProductOrder> resp = new CommonResp<>();
+		MesProductOrder mesProductOrder1 = mesProductOrderService.get(mesProductOrder.getId());
+		if(mesProductOrder1==null){
+			resp.setResult(Global.FALSE);
+			resp.setMessage("没有该生产订单!");
+			return resp;
+		}
+		resp.setData(mesProductOrder1);
+		resp.setResult(Global.TRUE);
+		resp.setMessage("操作成功!");
+		return resp;
+	}
+
+	/**
 	 * 接收erp生产订单
 	 */
 //	@RequiresPermissions("erp:mesProductOrder:edit")
 	@PostMapping(value = "receiveOrder")
 	@ResponseBody
-	public String receiveOrder(@RequestBody MesProductOrder mesProductOrder) {
+	public String receiveOrder(@RequestBody String body) {
 		try {
+			if (StringUtils.isBlank(body)) {
+				return renderResult(Global.FALSE, text("参数错误!"));
+			}
+			String json = body.trim();
+			if (json.startsWith("\"") && json.endsWith("\"") && json.length() >= 2) {
+				json = json.substring(1, json.length() - 1);
+			}
+			JSONObject jsonObj = JSON.parseObject(json);
+			MesProductOrder mesProductOrder = jsonObj.toJavaObject(MesProductOrder.class);
+			if (mesProductOrder == null) {
+				return renderResult(Global.FALSE, text("参数错误!"));
+			}
+			String deliveryDateStr = jsonObj.getString("deliveryDate");
+			if (StringUtils.isNotBlank(deliveryDateStr)) {
+				try {
+					String pattern = deliveryDateStr.length() > 10 ? "yyyy-MM-dd HH:mm:ss" : "yyyy-MM-dd";
+					Date deliveryDate = new SimpleDateFormat(pattern).parse(deliveryDateStr);
+					mesProductOrder.setDeliveryDate(deliveryDate);
+				} catch (ParseException e) {
+					return renderResult(Global.FALSE, text("交货日期格式错误!"));
+				}
+			}
 			mesProductOrderService.receiveOrder(mesProductOrder);
 			return renderResult(Global.TRUE, text("接收生产订单成功!"));
 		} catch (ServiceException e) {

+ 15 - 0
src/main/java/com/jeesite/modules/mes/dao/MesMaterialLlDao.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.MesMaterialLl;
+
+/**
+ * 生产领料单DAO接口
+ * @author sxl
+ * @version 2026-06-30
+ */
+@MyBatisDao
+public interface MesMaterialLlDao extends CrudDao<MesMaterialLl> {
+	
+}

+ 15 - 0
src/main/java/com/jeesite/modules/mes/dao/MesMaterialTlDao.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.MesMaterialTl;
+
+/**
+ * 生产退料表DAO接口
+ * @author sxl
+ * @version 2026-07-01
+ */
+@MyBatisDao
+public interface MesMaterialTlDao extends CrudDao<MesMaterialTl> {
+	
+}

+ 21 - 10
src/main/java/com/jeesite/modules/mes/entity/MesMaterialBl.java

@@ -16,6 +16,7 @@ import com.jeesite.common.mybatis.mapper.query.QueryType;
 		@Column(name="id", attrName="id", label="id", isPK=true),
 		@Column(name="order_id", attrName="orderId", label="订单编码"),
 		@Column(name="erp_sn", attrName="erpSn", label="erp编码"),
+		@Column(name="doc_line_no", attrName="docLineNo", label="行号"),
 		@Column(name="nums_qr", attrName="numsQr", label="确认数量"),
 		@Column(name="nums_yl", attrName="numsYl", label="已领数量"),
 		@Column(name="title", attrName="title", label="物料名称", queryType=QueryType.LIKE),
@@ -23,23 +24,33 @@ import com.jeesite.common.mybatis.mapper.query.QueryType;
 	}, orderBy="a.id DESC"
 )
 public class MesMaterialBl extends DataEntity<MesMaterialBl> {
-	
+
 	private static final long serialVersionUID = 1L;
 	private String orderId;		// 订单编码
 	private String erpSn;		// erp编码
+	private String docLineNo;   //行号
 	private String numsQr;		// 确认数量
 	private String numsYl;		// 已领数量
 	private String title;		// 物料名称
 	private String spec;		// 规格
 
+
 	public MesMaterialBl() {
 		this(null);
 	}
-	
+
 	public MesMaterialBl(String id){
 		super(id);
 	}
-	
+
+	public String getDocLineNo() {
+		return docLineNo;
+	}
+
+	public void setDocLineNo(String docLineNo) {
+		this.docLineNo = docLineNo;
+	}
+
 	@Size(min=0, max=64, message="订单编码长度不能超过 64 个字符")
 	public String getOrderId() {
 		return orderId;
@@ -48,7 +59,7 @@ public class MesMaterialBl extends DataEntity<MesMaterialBl> {
 	public void setOrderId(String orderId) {
 		this.orderId = orderId;
 	}
-	
+
 	@Size(min=0, max=64, message="erp编码长度不能超过 64 个字符")
 	public String getErpSn() {
 		return erpSn;
@@ -57,7 +68,7 @@ public class MesMaterialBl extends DataEntity<MesMaterialBl> {
 	public void setErpSn(String erpSn) {
 		this.erpSn = erpSn;
 	}
-	
+
 	@Size(min=0, max=64, message="确认数量长度不能超过 64 个字符")
 	public String getNumsQr() {
 		return numsQr;
@@ -66,7 +77,7 @@ public class MesMaterialBl extends DataEntity<MesMaterialBl> {
 	public void setNumsQr(String numsQr) {
 		this.numsQr = numsQr;
 	}
-	
+
 	@Size(min=0, max=64, message="已领数量长度不能超过 64 个字符")
 	public String getNumsYl() {
 		return numsYl;
@@ -75,7 +86,7 @@ public class MesMaterialBl extends DataEntity<MesMaterialBl> {
 	public void setNumsYl(String numsYl) {
 		this.numsYl = numsYl;
 	}
-	
+
 	@Size(min=0, max=255, message="物料名称长度不能超过 255 个字符")
 	public String getTitle() {
 		return title;
@@ -84,7 +95,7 @@ public class MesMaterialBl extends DataEntity<MesMaterialBl> {
 	public void setTitle(String title) {
 		this.title = title;
 	}
-	
+
 	@Size(min=0, max=64, message="规格长度不能超过 64 个字符")
 	public String getSpec() {
 		return spec;
@@ -93,5 +104,5 @@ public class MesMaterialBl extends DataEntity<MesMaterialBl> {
 	public void setSpec(String spec) {
 		this.spec = spec;
 	}
-	
-}
+
+}

+ 202 - 0
src/main/java/com/jeesite/modules/mes/entity/MesMaterialLl.java

@@ -0,0 +1,202 @@
+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-06-30
+ */
+@Table(name="mes_material_ll", alias="a", label="生产领料单信息", columns={
+		@Column(name="id", attrName="id", label="id", isPK=true),
+		@Column(name="other_id", attrName="otherId", label="第三方数据标识"),
+		@Column(name="business_date", attrName="businessDate", label="单据日期", isUpdateForce=true),
+		@Column(name="mo_doc_no", attrName="moDocNo", label="生产订单号"),
+		@Column(name="dept_code", attrName="deptCode", label="领料部门"),
+		@Column(name="employee_code", attrName="employeeCode", label="领料人员"),
+		@Column(name="is_no_pick_line", attrName="isNoPickLine", label="是否无备料领料,如果有备料就为false,无备料就为true"),
+		@Column(name="wh_code", attrName="whCode", label="存储地点"),
+		@Column(name="bin_code", attrName="binCode", label="库位"),
+		@Column(name="item_code", attrName="itemCode", label="料品编码"),
+		@Column(name="lot_code", attrName="lotCode", label="批号编码"),
+		@Column(name="project_code", attrName="projectCode", label="项目号"),
+		@Column(name="issued_qty", attrName="issuedQty", label="领料数量", isUpdateForce=true),
+		@Column(name="issue_doc_no", attrName="issueDocNo", label="生产领料单号"),
+		@Column(name="mopick_list", attrName="mopickList", label="生产订单备料行"),
+		@Column(name="state", attrName="state", 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_date", attrName="updateDate", label="更新时间", isQuery=false, isUpdateForce=true),
+	}, orderBy="a.update_date DESC"
+)
+public class MesMaterialLl extends DataEntity<MesMaterialLl> {
+
+	private static final long serialVersionUID = 1L;
+	private String otherId;		// 第三方数据标识
+	private Date businessDate;		// 单据日期
+	private String moDocNo;		// 生产订单号
+	private String deptCode;		// 领料部门
+	private String employeeCode;		// 领料人员
+	private String isNoPickLine;		// 是否无备料领料,如果有备料就为false,无备料就为true
+	private String whCode;		// 存储地点
+	private String binCode;		// 库位
+	private String itemCode;		// 料品编码
+	private String lotCode;		// 批号编码
+	private String projectCode;		// 项目号
+	private Double issuedQty;		// 领料数量
+	private String issueDocNo;   //生产领料单号
+	private String mopickList;		// 生产订单备料行
+
+	private String state;       //状态0=草稿 1=下发 2=完成
+
+	public String getState() {
+		return state;
+	}
+
+	public void setState(String state) {
+		this.state = state;
+	}
+
+	public String getIssueDocNo() {
+		return issueDocNo;
+	}
+
+	public void setIssueDocNo(String issueDocNo) {
+		this.issueDocNo = issueDocNo;
+	}
+
+	public MesMaterialLl() {
+		this(null);
+	}
+
+	public MesMaterialLl(String id){
+		super(id);
+	}
+
+	@Size(min=0, max=64, message="第三方数据标识长度不能超过 64 个字符")
+	public String getOtherId() {
+		return otherId;
+	}
+
+	public void setOtherId(String otherId) {
+		this.otherId = otherId;
+	}
+
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	public Date getBusinessDate() {
+		return businessDate;
+	}
+
+	public void setBusinessDate(Date businessDate) {
+		this.businessDate = businessDate;
+	}
+
+	@Size(min=0, max=64, message="生产订单号长度不能超过 64 个字符")
+	public String getMoDocNo() {
+		return moDocNo;
+	}
+
+	public void setMoDocNo(String moDocNo) {
+		this.moDocNo = moDocNo;
+	}
+
+	@Size(min=0, max=64, message="领料部门长度不能超过 64 个字符")
+	public String getDeptCode() {
+		return deptCode;
+	}
+
+	public void setDeptCode(String deptCode) {
+		this.deptCode = deptCode;
+	}
+
+	@Size(min=0, max=64, message="领料人员长度不能超过 64 个字符")
+	public String getEmployeeCode() {
+		return employeeCode;
+	}
+
+	public void setEmployeeCode(String employeeCode) {
+		this.employeeCode = employeeCode;
+	}
+
+	@Size(min=0, max=1, message="是否无备料领料,如果有备料就为false,无备料就为true长度不能超过 1 个字符")
+	public String getIsNoPickLine() {
+		return isNoPickLine;
+	}
+
+	public void setIsNoPickLine(String isNoPickLine) {
+		this.isNoPickLine = isNoPickLine;
+	}
+
+	@Size(min=0, max=64, message="存储地点长度不能超过 64 个字符")
+	public String getWhCode() {
+		return whCode;
+	}
+
+	public void setWhCode(String whCode) {
+		this.whCode = whCode;
+	}
+
+	@Size(min=0, max=64, message="库位长度不能超过 64 个字符")
+	public String getBinCode() {
+		return binCode;
+	}
+
+	public void setBinCode(String binCode) {
+		this.binCode = binCode;
+	}
+
+	@Size(min=0, max=64, message="料品编码长度不能超过 64 个字符")
+	public String getItemCode() {
+		return itemCode;
+	}
+
+	public void setItemCode(String itemCode) {
+		this.itemCode = itemCode;
+	}
+
+	@Size(min=0, max=64, message="批号编码长度不能超过 64 个字符")
+	public String getLotCode() {
+		return lotCode;
+	}
+
+	public void setLotCode(String lotCode) {
+		this.lotCode = lotCode;
+	}
+
+	@Size(min=0, max=64, message="项目号长度不能超过 64 个字符")
+	public String getProjectCode() {
+		return projectCode;
+	}
+
+	public void setProjectCode(String projectCode) {
+		this.projectCode = projectCode;
+	}
+
+	public Double getIssuedQty() {
+		return issuedQty;
+	}
+
+	public void setIssuedQty(Double issuedQty) {
+		this.issuedQty = issuedQty;
+	}
+
+	@Size(min=0, max=64, message="生产订单备料行长度不能超过 64 个字符")
+	public String getMopickList() {
+		return mopickList;
+	}
+
+	public void setMopickList(String mopickList) {
+		this.mopickList = mopickList;
+	}
+
+}

+ 116 - 0
src/main/java/com/jeesite/modules/mes/entity/MesMaterialTl.java

@@ -0,0 +1,116 @@
+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-01
+ */
+@Table(name="mes_material_tl", alias="a", label="生产退料表信息", columns={
+		@Column(name="id", attrName="id", label="id", isPK=true),
+		@Column(name="other_id", attrName="otherId", label="第三方数据标识"),
+		@Column(name="doc_type_code", attrName="docTypeCode", label="退料单据类型"),
+		@Column(name="business_date", attrName="businessDate", label="单据日期", isUpdateForce=true),
+		@Column(name="issue_doc_no", attrName="issueDocNo", label="领料单号"),
+		@Column(name="issue_doc_line_no", attrName="issueDocLineNo", label="领料单行号"),
+		@Column(name="qty", attrName="qty", label="退料数量"),
+		@Column(name="tl_code", attrName="tlCode", 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_date", attrName="updateDate", label="更新时间", isQuery=false, isUpdateForce=true),
+	}, orderBy="a.update_date DESC"
+)
+public class MesMaterialTl extends DataEntity<MesMaterialTl> {
+
+	private static final long serialVersionUID = 1L;
+	private String otherId;		// 第三方数据标识
+	private String docTypeCode;		// 退料单据类型
+	private Date businessDate;		// 单据日期
+	private String issueDocNo;		// 领料单号
+	private String issueDocLineNo;		// 领料单行号
+	private String qty;		// 退料数量
+	private String tlCode;		// 退料单号
+
+	public MesMaterialTl() {
+		this(null);
+	}
+
+	public MesMaterialTl(String id){
+		super(id);
+	}
+
+	@Size(min=0, max=64, message="第三方数据标识长度不能超过 64 个字符")
+	public String getOtherId() {
+		return otherId;
+	}
+
+	public void setOtherId(String otherId) {
+		this.otherId = otherId;
+	}
+
+	@Size(min=0, max=64, message="退料单据类型长度不能超过 64 个字符")
+	public String getDocTypeCode() {
+		return docTypeCode;
+	}
+
+	public void setDocTypeCode(String docTypeCode) {
+		this.docTypeCode = docTypeCode;
+	}
+
+	@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+	public Date getBusinessDate() {
+		return businessDate;
+	}
+
+	public void setBusinessDate(Date businessDate) {
+		this.businessDate = businessDate;
+	}
+
+	@Size(min=0, max=64, message="领料单号长度不能超过 64 个字符")
+	public String getIssueDocNo() {
+		return issueDocNo;
+	}
+
+	public void setIssueDocNo(String issueDocNo) {
+		this.issueDocNo = issueDocNo;
+	}
+
+	@Size(min=0, max=64, message="领料单行号长度不能超过 64 个字符")
+	public String getIssueDocLineNo() {
+		return issueDocLineNo;
+	}
+
+	public void setIssueDocLineNo(String issueDocLineNo) {
+		this.issueDocLineNo = issueDocLineNo;
+	}
+
+	@Size(min=0, max=64, message="退料数量长度不能超过 64 个字符")
+	public String getQty() {
+		return qty;
+	}
+
+	public void setQty(String qty) {
+		this.qty = qty;
+	}
+
+	@Size(min=0, max=64, message="退料单号长度不能超过 64 个字符")
+	public String getTlCode() {
+		return tlCode;
+	}
+
+	public void setTlCode(String tlCode) {
+		this.tlCode = tlCode;
+	}
+
+}

+ 194 - 0
src/main/java/com/jeesite/modules/mes/service/MesMaterialLlService.java

@@ -0,0 +1,194 @@
+package com.jeesite.modules.mes.service;
+
+import java.util.Date;
+import java.util.List;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jeesite.common.collect.ListUtils;
+import com.jeesite.common.entity.Page;
+import com.jeesite.common.lang.DateUtils;
+import com.jeesite.common.lang.StringUtils;
+import com.jeesite.common.service.CrudService;
+import com.jeesite.common.service.ServiceException;
+import com.jeesite.modules.mes.entity.MesMaterialBl;
+import com.jeesite.modules.mes.entity.MesMaterialLl;
+import com.jeesite.modules.mes.dao.MesMaterialLlDao;
+import com.jeesite.modules.mes.util.U9cAuthUtil;
+import com.jeesite.modules.file.utils.FileUploadUtils;
+
+/**
+ * 生产领料单Service
+ * @author sxl
+ * @version 2026-06-30
+ */
+@Service
+public class MesMaterialLlService extends CrudService<MesMaterialLlDao, MesMaterialLl> {
+
+	@Autowired
+	private MesMaterialBlService mesMaterialBlService;
+
+	/**
+	 * 获取单条数据
+	 * @param mesMaterialLl
+	 * @return
+	 */
+	@Override
+	public MesMaterialLl get(MesMaterialLl mesMaterialLl) {
+		return super.get(mesMaterialLl);
+	}
+
+	/**
+	 * 查询分页数据
+	 * @param mesMaterialLl 查询条件
+	 * @param mesMaterialLl.page 分页对象
+	 * @return
+	 */
+	@Override
+	public Page<MesMaterialLl> findPage(MesMaterialLl mesMaterialLl) {
+		return super.findPage(mesMaterialLl);
+	}
+
+	/**
+	 * 查询列表数据
+	 * @param mesMaterialLl
+	 * @return
+	 */
+	@Override
+	public List<MesMaterialLl> findList(MesMaterialLl mesMaterialLl) {
+		return super.findList(mesMaterialLl);
+	}
+
+	/**
+	 * 保存数据(插入或更新)
+	 * @param mesMaterialLl
+	 */
+	@Override
+	@Transactional
+	public void save(MesMaterialLl mesMaterialLl) {
+		super.save(mesMaterialLl);
+		// 保存上传图片
+		FileUploadUtils.saveFileUpload(mesMaterialLl, mesMaterialLl.getId(), "mesMaterialLl_image");
+	}
+
+	/**
+	 * 更新状态
+	 * @param mesMaterialLl
+	 */
+	@Override
+	@Transactional
+	public void updateStatus(MesMaterialLl mesMaterialLl) {
+		super.updateStatus(mesMaterialLl);
+	}
+
+	/**
+	 * 删除数据
+	 * @param mesMaterialLl
+	 */
+	@Override
+	@Transactional
+	public void delete(MesMaterialLl mesMaterialLl) {
+		super.delete(mesMaterialLl);
+	}
+
+	/**
+	 * 生产领料单出库:根据生产订单号匹配备料行号
+	 */
+	@Transactional
+	public void materialLl(MesMaterialLl mesMaterialLl) {
+		MesMaterialLl entity;
+		if (StringUtils.isNotBlank(mesMaterialLl.getId())) {
+			entity = get(mesMaterialLl);
+			if (entity == null) {
+				throw new ServiceException(text("生产领料单不存在!"));
+			}
+		} else {
+			entity = mesMaterialLl;
+		}
+		if (StringUtils.isBlank(entity.getMoDocNo())) {
+			throw new ServiceException(text("生产订单号不能为空!"));
+		}
+		MesMaterialBl query = new MesMaterialBl();
+		query.setOrderId(entity.getMoDocNo());
+		List<MesMaterialBl> blList = mesMaterialBlService.findList(query);
+		if (ListUtils.isEmpty(blList)) {
+			throw new ServiceException(text("未找到对应备料信息!"));
+		}
+		MesMaterialBl mesMaterialBl = blList.get(0);
+		if (StringUtils.isBlank(mesMaterialBl.getDocLineNo())) {
+			throw new ServiceException(text("备料行号不能为空!"));
+		}
+		entity.setMopickList(mesMaterialBl.getDocLineNo());
+		save(entity);
+		entity.setIsNewRecord(false);
+		syncIssueDocToErp(entity);
+	}
+
+	private String buildCreateIssueDocJson(MesMaterialLl mesMaterialLl) {
+		JSONObject root = new JSONObject(true);
+		root.put("OtherID", StringUtils.defaultIfBlank(mesMaterialLl.getOtherId(), mesMaterialLl.getId()));
+		root.put("BusinessDate", formatIssueDocDate(mesMaterialLl.getBusinessDate()));
+		root.put("MODocNo", StringUtils.defaultIfBlank(mesMaterialLl.getMoDocNo(), ""));
+		root.put("DeptCode", StringUtils.defaultIfBlank(mesMaterialLl.getDeptCode(), ""));
+		root.put("EmployeeCode", StringUtils.defaultIfBlank(mesMaterialLl.getEmployeeCode(), ""));
+
+		JSONObject line = new JSONObject(true);
+		line.put("IsNoPickLine", "1".equals(mesMaterialLl.getIsNoPickLine()));
+		line.put("WHCode", StringUtils.defaultIfBlank(mesMaterialLl.getWhCode(), ""));
+		line.put("BinCode", StringUtils.defaultIfBlank(mesMaterialLl.getBinCode(), ""));
+		line.put("ItemCode", StringUtils.defaultIfBlank(mesMaterialLl.getItemCode(), ""));
+		line.put("LotCode", StringUtils.defaultIfBlank(mesMaterialLl.getLotCode(), ""));
+		line.put("ProjectCode", StringUtils.defaultIfBlank(mesMaterialLl.getProjectCode(), ""));
+		line.put("IssuedQty", mesMaterialLl.getIssuedQty() != null ? mesMaterialLl.getIssuedQty() : 0);
+		line.put("MOPickList", StringUtils.defaultIfBlank(mesMaterialLl.getMopickList(), ""));
+
+		JSONArray lineDtos = new JSONArray();
+		lineDtos.add(line);
+		root.put("LineDtos", lineDtos);
+
+		JSONArray requestArray = new JSONArray();
+		requestArray.add(root);
+		return requestArray.toJSONString();
+	}
+
+	private String formatIssueDocDate(Date date) {
+		if (date == null) {
+			return "";
+		}
+		return DateUtils.formatDate(date, "yyyy-MM-dd");
+	}
+
+	private void syncIssueDocToErp(MesMaterialLl mesMaterialLl) {
+		String requestJson = buildCreateIssueDocJson(mesMaterialLl);
+		JSONObject response = U9cAuthUtil.createIssueDoc(requestJson);
+		if (response == null) {
+			throw new ServiceException(text("同步ERP失败!"));
+		}
+		if (!Boolean.TRUE.equals(response.getBoolean("Success"))) {
+			String msg = response.getString("ResMsg");
+			throw new ServiceException(text(StringUtils.isNotBlank(msg) ? msg : "同步ERP失败!"));
+		}
+
+		JSONArray dataList = response.getJSONArray("Data");
+		if (dataList == null || dataList.isEmpty()) {
+			throw new ServiceException(text("同步ERP失败:返回数据为空!"));
+		}
+		JSONObject data = dataList.getJSONObject(0);
+		if (data == null || !Boolean.TRUE.equals(data.getBoolean("IsSucceed"))) {
+			String errorMsg = data != null ? data.getString("ErrorMsg") : null;
+			throw new ServiceException(text(StringUtils.isNotBlank(errorMsg) ? errorMsg : "同步ERP失败!"));
+		}
+		String issueDocNo = data.getString("Code");
+		if (StringUtils.isBlank(issueDocNo)) {
+			throw new ServiceException(text("同步ERP失败:未返回生产领料单号!"));
+		}
+		mesMaterialLl.setIssueDocNo(issueDocNo);
+		mesMaterialLl.setIsNewRecord(false);
+		mesMaterialLl.setState("1");
+		super.update(mesMaterialLl);
+	}
+
+}

+ 181 - 0
src/main/java/com/jeesite/modules/mes/service/MesMaterialTlService.java

@@ -0,0 +1,181 @@
+package com.jeesite.modules.mes.service;
+
+import java.util.Date;
+import java.util.List;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.jeesite.common.entity.Page;
+import com.jeesite.common.lang.DateUtils;
+import com.jeesite.common.lang.StringUtils;
+import com.jeesite.common.service.CrudService;
+import com.jeesite.common.service.ServiceException;
+import com.jeesite.modules.mes.entity.MesMaterialTl;
+import com.jeesite.modules.mes.dao.MesMaterialTlDao;
+import com.jeesite.modules.mes.util.U9cAuthUtil;
+import com.jeesite.modules.file.utils.FileUploadUtils;
+
+/**
+ * 生产退料表Service
+ * @author sxl
+ * @version 2026-07-01
+ */
+@Service
+public class MesMaterialTlService extends CrudService<MesMaterialTlDao, MesMaterialTl> {
+	
+	/**
+	 * 获取单条数据
+	 * @param mesMaterialTl
+	 * @return
+	 */
+	@Override
+	public MesMaterialTl get(MesMaterialTl mesMaterialTl) {
+		return super.get(mesMaterialTl);
+	}
+	
+	/**
+	 * 查询分页数据
+	 * @param mesMaterialTl 查询条件
+	 * @param mesMaterialTl.page 分页对象
+	 * @return
+	 */
+	@Override
+	public Page<MesMaterialTl> findPage(MesMaterialTl mesMaterialTl) {
+		return super.findPage(mesMaterialTl);
+	}
+	
+	/**
+	 * 查询列表数据
+	 * @param mesMaterialTl
+	 * @return
+	 */
+	@Override
+	public List<MesMaterialTl> findList(MesMaterialTl mesMaterialTl) {
+		return super.findList(mesMaterialTl);
+	}
+	
+	/**
+	 * 保存数据(插入或更新)
+	 * @param mesMaterialTl
+	 */
+	@Override
+	@Transactional
+	public void save(MesMaterialTl mesMaterialTl) {
+		super.save(mesMaterialTl);
+		// 保存上传图片
+		FileUploadUtils.saveFileUpload(mesMaterialTl, mesMaterialTl.getId(), "mesMaterialTl_image");
+	}
+	
+	/**
+	 * 更新状态
+	 * @param mesMaterialTl
+	 */
+	@Override
+	@Transactional
+	public void updateStatus(MesMaterialTl mesMaterialTl) {
+		super.updateStatus(mesMaterialTl);
+	}
+	
+	/**
+	 * 删除数据
+	 * @param mesMaterialTl
+	 */
+	@Override
+	@Transactional
+	public void delete(MesMaterialTl mesMaterialTl) {
+		super.delete(mesMaterialTl);
+	}
+
+	/**
+	 * 生产退料:同步 ERP 并回写退料单号
+	 */
+	@Transactional
+	public void mesMaterialTl(MesMaterialTl mesMaterialTl) {
+		MesMaterialTl entity;
+		if (StringUtils.isNotBlank(mesMaterialTl.getId())) {
+			entity = get(mesMaterialTl);
+			if (entity == null) {
+				throw new ServiceException(text("生产退料单不存在!"));
+			}
+		} else {
+			entity = mesMaterialTl;
+		}
+		if (StringUtils.isBlank(entity.getDocTypeCode())) {
+			throw new ServiceException(text("退料单据类型不能为空!"));
+		}
+		if (entity.getBusinessDate() == null) {
+			throw new ServiceException(text("单据日期不能为空!"));
+		}
+		if (StringUtils.isBlank(entity.getIssueDocNo())) {
+			throw new ServiceException(text("领料单号不能为空!"));
+		}
+		if (StringUtils.isBlank(entity.getIssueDocLineNo())) {
+			throw new ServiceException(text("领料单行号不能为空!"));
+		}
+		if (StringUtils.isBlank(entity.getQty())) {
+			throw new ServiceException(text("退料数量不能为空!"));
+		}
+		save(entity);
+		entity.setIsNewRecord(false);
+		syncRtnIssueDocToErp(entity);
+	}
+
+	private String buildCreateRtnIssueDocJson(MesMaterialTl mesMaterialTl) {
+		JSONObject root = new JSONObject(true);
+		root.put("OtherID", StringUtils.defaultIfBlank(mesMaterialTl.getOtherId(), mesMaterialTl.getId()));
+		root.put("DocTypeCode", StringUtils.defaultIfBlank(mesMaterialTl.getDocTypeCode(), ""));
+		root.put("BusinessDate", formatTlDate(mesMaterialTl.getBusinessDate()));
+
+		JSONObject line = new JSONObject(true);
+		line.put("IssueDocNo", StringUtils.defaultIfBlank(mesMaterialTl.getIssueDocNo(), ""));
+		line.put("IssueDocLineNo", StringUtils.defaultIfBlank(mesMaterialTl.getIssueDocLineNo(), ""));
+		line.put("Qty", StringUtils.defaultIfBlank(mesMaterialTl.getQty(), ""));
+
+		JSONArray lineDtos = new JSONArray();
+		lineDtos.add(line);
+		root.put("LineDtos", lineDtos);
+
+		JSONArray requestArray = new JSONArray();
+		requestArray.add(root);
+		return requestArray.toJSONString();
+	}
+
+	private String formatTlDate(Date date) {
+		if (date == null) {
+			return "";
+		}
+		return DateUtils.formatDate(date, "yyyy-MM-dd");
+	}
+
+	private void syncRtnIssueDocToErp(MesMaterialTl mesMaterialTl) {
+		String requestJson = buildCreateRtnIssueDocJson(mesMaterialTl);
+		JSONObject response = U9cAuthUtil.createRtnIssueDoc(requestJson);
+		if (response == null) {
+			throw new ServiceException(text("同步ERP失败!"));
+		}
+		if (!Boolean.TRUE.equals(response.getBoolean("Success"))) {
+			String msg = response.getString("ResMsg");
+			throw new ServiceException(text(StringUtils.isNotBlank(msg) ? msg : "同步ERP失败!"));
+		}
+
+		JSONArray dataList = response.getJSONArray("Data");
+		if (dataList == null || dataList.isEmpty()) {
+			throw new ServiceException(text("同步ERP失败:返回数据为空!"));
+		}
+		JSONObject data = dataList.getJSONObject(0);
+		if (data == null || !Boolean.TRUE.equals(data.getBoolean("IsSucceed"))) {
+			String errorMsg = data != null ? data.getString("ErrorMsg") : null;
+			throw new ServiceException(text(StringUtils.isNotBlank(errorMsg) ? errorMsg : "同步ERP失败!"));
+		}
+		String tlCode = data.getString("Code");
+		if (StringUtils.isBlank(tlCode)) {
+			throw new ServiceException(text("同步ERP失败:未返回退料单号!"));
+		}
+		mesMaterialTl.setTlCode(tlCode);
+		mesMaterialTl.setIsNewRecord(false);
+		super.update(mesMaterialTl);
+	}
+	
+}

+ 54 - 0
src/main/java/com/jeesite/modules/mes/util/U9cAuthUtil.java

@@ -31,6 +31,10 @@ public class U9cAuthUtil {
 
 	private static final String CREATE_COMPLETE_DOC_URL = "http://10.0.10.11/u9c/webapi/CustLJRMESOpenAP/CreateCompleteDoc";
 
+	private static final String CREATE_ISSUE_DOC_URL = "http://10.0.10.11/u9c/webapi/CustLJRMESOpenAPI/CreateIssueDoc";
+
+	private static final String CREATE_RTN_ISSUE_DOC_URL = "http://10.0.10.11/u9c/webapi/CustLJRMESOpenAPI/CreateRtnIssueDoc";
+
 	private U9cAuthUtil() {
 	}
 
@@ -103,6 +107,56 @@ public class U9cAuthUtil {
 	}
 
 	/**
+	 * 调用 CreateIssueDoc 接口,自动获取 token 并写入请求头
+	 *
+	 * @param requestBody JSON 请求体
+	 * @return 接口响应,失败返回 null
+	 */
+	public static JSONObject createIssueDoc(String requestBody) {
+		String token = getToken();
+		if (StringUtils.isEmpty(token)) {
+			log.warn("CreateIssueDoc 请求失败: 无法获取 token");
+			return null;
+		}
+		return postWithToken(CREATE_ISSUE_DOC_URL, requestBody, token);
+	}
+
+	/**
+	 * 调用 CreateIssueDoc 接口,自动获取 token 并写入请求头
+	 *
+	 * @param requestBody JSON 请求体
+	 * @return 接口响应,失败返回 null
+	 */
+	public static JSONObject createIssueDoc(JSONObject requestBody) {
+		return createIssueDoc(requestBody == null ? "[]" : requestBody.toJSONString());
+	}
+
+	/**
+	 * 调用 CreateRtnIssueDoc 接口,自动获取 token 并写入请求头
+	 *
+	 * @param requestBody JSON 请求体
+	 * @return 接口响应,失败返回 null
+	 */
+	public static JSONObject createRtnIssueDoc(String requestBody) {
+		String token = getToken();
+		if (StringUtils.isEmpty(token)) {
+			log.warn("CreateRtnIssueDoc 请求失败: 无法获取 token");
+			return null;
+		}
+		return postWithToken(CREATE_RTN_ISSUE_DOC_URL, requestBody, token);
+	}
+
+	/**
+	 * 调用 CreateRtnIssueDoc 接口,自动获取 token 并写入请求头
+	 *
+	 * @param requestBody JSON 请求体
+	 * @return 接口响应,失败返回 null
+	 */
+	public static JSONObject createRtnIssueDoc(JSONObject requestBody) {
+		return createRtnIssueDoc(requestBody == null ? "[]" : requestBody.toJSONString());
+	}
+
+	/**
 	 * 调用 U9C OAuth2 登录接口,返回完整响应
 	 */
 	public static JSONObject authLogin() {

+ 177 - 0
src/main/java/com/jeesite/modules/mes/web/MesMaterialLlController.java

@@ -0,0 +1,177 @@
+package com.jeesite.modules.mes.web;
+
+import java.util.List;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import com.jeesite.modules.erp.entity.MesProductOrder;
+import com.jeesite.modules.mes.resp.CommonResp;
+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.service.ServiceException;
+import com.jeesite.common.web.BaseController;
+import com.jeesite.modules.mes.entity.MesMaterialLl;
+import com.jeesite.modules.mes.service.MesMaterialLlService;
+
+/**
+ * 生产领料单Controller
+ * @author sxl
+ * @version 2026-06-30
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/mes/mesMaterialLl")
+public class MesMaterialLlController extends BaseController {
+
+	@Autowired
+	private MesMaterialLlService mesMaterialLlService;
+
+	/**
+	 * 获取数据
+	 */
+	@ModelAttribute
+	public MesMaterialLl get(String id, boolean isNewRecord) {
+		return mesMaterialLlService.get(id, isNewRecord);
+	}
+
+	/**
+	 * 查询列表
+	 */
+	@RequiresPermissions("mes:mesMaterialLl:view")
+	@RequestMapping(value = {"list", ""})
+	public String list(MesMaterialLl mesMaterialLl, Model model) {
+		model.addAttribute("mesMaterialLl", mesMaterialLl);
+		return "modules/mes/mesMaterialLlList";
+	}
+
+	/**
+	 * 查询列表数据
+	 */
+	@RequiresPermissions("mes:mesMaterialLl:view")
+	@RequestMapping(value = "listData")
+	@ResponseBody
+	public Page<MesMaterialLl> listData(MesMaterialLl mesMaterialLl, HttpServletRequest request, HttpServletResponse response) {
+		mesMaterialLl.setPage(new Page<>(request, response));
+		Page<MesMaterialLl> page = mesMaterialLlService.findPage(mesMaterialLl);
+		return page;
+	}
+
+	/**
+	 * 查看编辑表单
+	 */
+	@RequiresPermissions("mes:mesMaterialLl:view")
+	@RequestMapping(value = "form")
+	public String form(MesMaterialLl mesMaterialLl, Model model) {
+		model.addAttribute("mesMaterialLl", mesMaterialLl);
+		return "modules/mes/mesMaterialLlForm";
+	}
+
+	/**
+	 * 保存数据
+	 */
+	@RequiresPermissions("mes:mesMaterialLl:edit")
+	@PostMapping(value = "save")
+	@ResponseBody
+	public String save(@Validated MesMaterialLl mesMaterialLl) {
+		mesMaterialLlService.save(mesMaterialLl);
+		return renderResult(Global.TRUE, text("保存生产领料单成功!"));
+	}
+
+	/**
+	 * 停用数据
+	 */
+	@RequiresPermissions("mes:mesMaterialLl:edit")
+	@RequestMapping(value = "disable")
+	@ResponseBody
+	public String disable(MesMaterialLl mesMaterialLl) {
+		mesMaterialLl.setStatus(MesMaterialLl.STATUS_DISABLE);
+		mesMaterialLlService.updateStatus(mesMaterialLl);
+		return renderResult(Global.TRUE, text("停用生产领料单成功"));
+	}
+
+	/**
+	 * 启用数据
+	 */
+	@RequiresPermissions("mes:mesMaterialLl:edit")
+	@RequestMapping(value = "enable")
+	@ResponseBody
+	public String enable(MesMaterialLl mesMaterialLl) {
+		mesMaterialLl.setStatus(MesMaterialLl.STATUS_NORMAL);
+		mesMaterialLlService.updateStatus(mesMaterialLl);
+		return renderResult(Global.TRUE, text("启用生产领料单成功"));
+	}
+
+	/**
+	 * 删除数据
+	 */
+	@RequiresPermissions("mes:mesMaterialLl:edit")
+	@RequestMapping(value = "delete")
+	@ResponseBody
+	public String delete(MesMaterialLl mesMaterialLl) {
+		mesMaterialLlService.delete(mesMaterialLl);
+		return renderResult(Global.TRUE, text("删除生产领料单成功!"));
+	}
+
+	/**
+	 * 生产领料单出库
+	 */
+//	@RequiresPermissions("mes:mesMaterialLl:edit")
+	@RequestMapping(value = "materialLl")
+	@ResponseBody
+	public String materialLl(MesMaterialLl mesMaterialLl) {
+		try {
+			mesMaterialLlService.materialLl(mesMaterialLl);
+			return renderResult(Global.TRUE, text("生产领料单出库成功!"));
+		} catch (ServiceException e) {
+			return renderResult(Global.FALSE, text(e.getMessage()));
+		}
+	}
+
+	/**
+	 * 生产领料单列表
+	 */
+//	@RequiresPermissions("mes:mesMaterialLl:edit")
+	@RequestMapping(value = "codeList")
+	@ResponseBody
+	public CommonResp codeList(MesMaterialLl mesMaterialLl) {
+		CommonResp<List<MesMaterialLl> > resp = new CommonResp<>();
+		//展示所有未结束的订单
+		mesMaterialLl.setState("1");//0=草稿 1=下发 2=完成
+		List<MesMaterialLl> list = mesMaterialLlService.findList(mesMaterialLl);
+		resp.setData(list);
+		resp.setResult(Global.TRUE);
+		resp.setMessage("操作成功!");
+		return resp;
+	}
+
+	/**
+	 * 生产领料单详情
+	 */
+//	@RequiresPermissions("mes:mesMaterialLl:edit")
+	@RequestMapping(value = "codeInfo")
+	@ResponseBody
+	public CommonResp codeInfo(MesMaterialLl mesMaterialLl) {
+		CommonResp<MesMaterialLl> resp = new CommonResp<>();
+		MesMaterialLl mesMaterialLl1 = mesMaterialLlService.get(mesMaterialLl.getId());
+		if(mesMaterialLl1==null){
+			resp.setResult(Global.FALSE);
+			resp.setMessage("没有该生产领料单!");
+			return resp;
+		}
+		resp.setData(mesMaterialLl1);
+		resp.setResult(Global.TRUE);
+		resp.setMessage("操作成功!");
+		return resp;
+	}
+
+
+}

+ 2 - 2
src/main/java/com/jeesite/modules/mes/web/MesMaterialRkController.java

@@ -206,11 +206,11 @@ public class MesMaterialRkController extends BaseController {
 
 		HashMap<String, Object> data = new HashMap<>();
 //		data.put("materialCode", materialCode);       // 来料码
-//		data.put("docTypeCode", docTypeCode);         // ERP代码/单据类型编码
+		data.put("docTypeCode", docTypeCode);         // ERP代码/单据类型编码
 		data.put("srcDocNo", srcDocNo);               // 采购订单号
 		data.put("srcDocLineNo", srcDocLineNo);       // 采购订单行号
 		data.put("docLineNo", srcDocLineNo);          // 行号
-//		data.put("erpSn", erpSn);                     // 料号/ERP编码
+		data.put("itemCode", erpSn);                     // 料号/ERP编码
 		data.put("produceDate", produceDate);         // 生产日期
 		data.put("lotCode", lotCode);                 // 生产批次/批号
 		data.put("pcQty", pcQty);                         // 批次数量

+ 137 - 0
src/main/java/com/jeesite/modules/mes/web/MesMaterialTlController.java

@@ -0,0 +1,137 @@
+package com.jeesite.modules.mes.web;
+
+import java.util.List;
+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.service.ServiceException;
+import com.jeesite.common.web.BaseController;
+import com.jeesite.modules.mes.entity.MesMaterialTl;
+import com.jeesite.modules.mes.service.MesMaterialTlService;
+
+/**
+ * 生产退料表Controller
+ * @author sxl
+ * @version 2026-07-01
+ */
+@Controller
+@RequestMapping(value = "${adminPath}/mes/mesMaterialTl")
+public class MesMaterialTlController extends BaseController {
+
+	@Autowired
+	private MesMaterialTlService mesMaterialTlService;
+
+	/**
+	 * 获取数据
+	 */
+	@ModelAttribute
+	public MesMaterialTl get(String id, boolean isNewRecord) {
+		return mesMaterialTlService.get(id, isNewRecord);
+	}
+
+	/**
+	 * 查询列表
+	 */
+	@RequiresPermissions("mes:mesMaterialTl:view")
+	@RequestMapping(value = {"list", ""})
+	public String list(MesMaterialTl mesMaterialTl, Model model) {
+		model.addAttribute("mesMaterialTl", mesMaterialTl);
+		return "modules/mes/mesMaterialTlList";
+	}
+
+	/**
+	 * 查询列表数据
+	 */
+	@RequiresPermissions("mes:mesMaterialTl:view")
+	@RequestMapping(value = "listData")
+	@ResponseBody
+	public Page<MesMaterialTl> listData(MesMaterialTl mesMaterialTl, HttpServletRequest request, HttpServletResponse response) {
+		mesMaterialTl.setPage(new Page<>(request, response));
+		Page<MesMaterialTl> page = mesMaterialTlService.findPage(mesMaterialTl);
+		return page;
+	}
+
+	/**
+	 * 查看编辑表单
+	 */
+	@RequiresPermissions("mes:mesMaterialTl:view")
+	@RequestMapping(value = "form")
+	public String form(MesMaterialTl mesMaterialTl, Model model) {
+		model.addAttribute("mesMaterialTl", mesMaterialTl);
+		return "modules/mes/mesMaterialTlForm";
+	}
+
+	/**
+	 * 保存数据
+	 */
+	@RequiresPermissions("mes:mesMaterialTl:edit")
+	@PostMapping(value = "save")
+	@ResponseBody
+	public String save(@Validated MesMaterialTl mesMaterialTl) {
+		mesMaterialTlService.save(mesMaterialTl);
+		return renderResult(Global.TRUE, text("保存生产退料表成功!"));
+	}
+
+	/**
+	 * 停用数据
+	 */
+	@RequiresPermissions("mes:mesMaterialTl:edit")
+	@RequestMapping(value = "disable")
+	@ResponseBody
+	public String disable(MesMaterialTl mesMaterialTl) {
+		mesMaterialTl.setStatus(MesMaterialTl.STATUS_DISABLE);
+		mesMaterialTlService.updateStatus(mesMaterialTl);
+		return renderResult(Global.TRUE, text("停用生产退料表成功"));
+	}
+
+	/**
+	 * 启用数据
+	 */
+	@RequiresPermissions("mes:mesMaterialTl:edit")
+	@RequestMapping(value = "enable")
+	@ResponseBody
+	public String enable(MesMaterialTl mesMaterialTl) {
+		mesMaterialTl.setStatus(MesMaterialTl.STATUS_NORMAL);
+		mesMaterialTlService.updateStatus(mesMaterialTl);
+		return renderResult(Global.TRUE, text("启用生产退料表成功"));
+	}
+
+	/**
+	 * 删除数据
+	 */
+	@RequiresPermissions("mes:mesMaterialTl:edit")
+	@RequestMapping(value = "delete")
+	@ResponseBody
+	public String delete(MesMaterialTl mesMaterialTl) {
+		mesMaterialTlService.delete(mesMaterialTl);
+		return renderResult(Global.TRUE, text("删除生产退料表成功!"));
+	}
+
+	/**
+	 * 生产退料
+	 */
+//	@RequiresPermissions("mes:mesMaterialTl:edit")
+	@RequestMapping(value = "mesMaterialTl")
+	@ResponseBody
+	public String mesMaterialTl(MesMaterialTl mesMaterialTl) {
+		try {
+			mesMaterialTlService.mesMaterialTl(mesMaterialTl);
+			return renderResult(Global.TRUE, text("生产退料成功!"));
+		} catch (ServiceException e) {
+			return renderResult(Global.FALSE, text(e.getMessage()));
+		}
+	}
+
+}

+ 11 - 3
src/main/resources/config/application.yml

@@ -53,8 +53,8 @@ jdbc:
   # Mysql 数据库配置
   type: mysql
   driver: com.mysql.cj.jdbc.Driver
-#  url: jdbc:mysql://127.0.0.1:3306/mes_cloud_ljr?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
-  url: jdbc:mysql://10.0.20.10:3306/mes_cloud_ljr?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
+  url: jdbc:mysql://127.0.0.1:3306/mes_cloud_ljr?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
+#  url: jdbc:mysql://10.0.20.10:3306/mes_cloud_ljr?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
 #  url: jdbc:mysql://192.168.22.99:3306/mes_cloud?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=CONVERT_TO_NULL&serverTimezone=Asia/Shanghai&nullCatalogMeansCurrent=true
 #  username: mes_cloud
 #  password: YD57bSRabiyWBwkZ
@@ -81,7 +81,7 @@ jdbc:
 #      minIdle: 3
 #      maxActive: 20
 #
-#   这边表示这个jeesite.modules.tianHong.dao路径映射到从库
+##   这边表示这个jeesite.modules.tianHong.dao路径映射到从库
 #  mybatisDaoAndDataSourceMappings: |
 #    com.jeesite.modules.tianHong.dao = tianHong
 
@@ -724,6 +724,7 @@ shiro:
     ${adminPath}/mes/mesInspectionApi/save= anon
     ${adminPath}/mes/mesLineProcess/processListAll= anon
     ${adminPath}/mes/mesProductOrderApi/mesProductOrderCodeList= anon
+    ${adminPath}/erp/mesProductOrder/receiveOrder= anon
     ${adminPath}/mes/wmsHouseControllerApi/wmsHouseList= anon
     ${adminPath}/mes/mesInboundControllerApi/inboundSave= anon
     ${adminPath}/mes/mesInboundControllerApi/mesInboundList= anon
@@ -734,6 +735,13 @@ shiro:
     ${adminPath}/mes/mesProductRecord/pdaRcl= anon
     ${adminPath}/mes/mesMaterialRk/jxCode= anon
     ${adminPath}/mes/mesMaterialRk/mesToErp= anon
+    ${adminPath}/erp/mesProductOrder/receiveOrder= anon
+    ${adminPath}/erp/mesProductOrder/orderList= anon
+    ${adminPath}/erp/mesProductOrder/orderInfo= anon
+    ${adminPath}/mes/mesMaterialLl/materialLl= anon
+    ${adminPath}/mes/mesMaterialLl/codeList= anon
+    ${adminPath}/mes/mesMaterialLl/codeInfo= anon
+    ${adminPath}/mes/mesMaterialTl/mesMaterialTl= anon
     
     
   

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

+ 10 - 10
src/main/resources/views/modules/erp/mesProductOrderForm.html

@@ -32,15 +32,15 @@
 							</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="docLineNo" 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="docLineNo" 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="">
@@ -107,4 +107,4 @@ $("#inputForm").validate({
 		}, "json");
     }
 });
-</script>
+</script>

+ 1 - 1
src/main/resources/views/modules/erp/mesProductOrderList.html

@@ -80,7 +80,7 @@ $('#dataGrid').dataGrid({
 		// }},
 		{header:'${text("订单编号")}', name:'sn', index:'a.sn', width:150, align:"center"},
 		{header:'${text("产线编号")}', name:'lineSn', index:'a.line_sn', width:120, align:"center"},
-		{header:'${text("行号")}', name:'docLineNo', index:'a.doc_line_no', width:100, align:"center"},
+		// {header:'${text("行号")}', name:'docLineNo', index:'a.doc_line_no', width:100, align:"center"},
 		{header:'${text("生产数量")}', name:'nums', index:'a.nums', width:150, align:"center"},
 		{header:'${text("交货日期")}', name:'deliveryDate', index:'a.delivery_date', width:150, align:"center"},
 		{header:'${text("备注")}', name:'remark', index:'a.remark', width:150, align:"center"},

+ 9 - 0
src/main/resources/views/modules/mes/mesMaterialBlForm.html

@@ -35,6 +35,15 @@
 					<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="docLineNo" 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="numsQr" maxlength="64" class="form-control"/>

+ 1 - 0
src/main/resources/views/modules/mes/mesMaterialBlList.html

@@ -72,6 +72,7 @@ $('#dataGrid').dataGrid({
 			return '<a href="${ctx}/mes/mesMaterialBl/form?id='+row.id+'" class="btnList" data-title="${text("编辑备料表")}">'+(val||row.id)+'</a>';
 		}},
 		{header:'${text("erp编码")}', name:'erpSn', index:'a.erp_sn', width:150, align:"left"},
+		{header:'${text("行号")}', name:'docLineNo', index:'a.doc_line_no', width:100, align:"center"},
 		{header:'${text("确认数量")}', name:'numsQr', index:'a.nums_qr', width:150, align:"left"},
 		{header:'${text("已领数量")}', name:'numsYl', index:'a.nums_yl', width:150, align:"left"},
 		{header:'${text("物料名称")}', name:'title', index:'a.title', width:150, align:"left"},

+ 176 - 0
src/main/resources/views/modules/mes/mesMaterialLlForm.html

@@ -0,0 +1,176 @@
+<% layout('/layouts/default.html', {title: '生产领料单管理', libs: ['validate','fileupload']}){ %>
+<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(mesMaterialLl.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="${mesMaterialLl}" action="${ctx}/mes/mesMaterialLl/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="otherId" 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="businessDate" readonly="true" maxlength="20" class="form-control laydate"
+									dataFormat="datetime" data-type="datetime" data-format="yyyy-MM-dd HH:mm"/>
+							</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="moDocNo" 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="deptCode" 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="employeeCode" 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('是否无备料领料,如果有备料就为false,无备料就为true')}:<i class="fa icon-question hide"></i></label>
+							<div class="col-sm-8">
+								<#form:input path="isNoPickLine" maxlength="1" 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="whCode" 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="binCode" 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="itemCode" 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="lotCode" 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="projectCode" 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="issuedQty" maxlength="9" class="form-control digits"/>
+							</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="mopickList" maxlength="64" 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">
+								<span class="required hide">*</span> ${text('图片上传')}:</label>
+							<div class="col-sm-10">
+								<#form:fileupload id="uploadImage" bizKey="${mesMaterialLl.id}" bizType="mesMaterialLl_image"
+									uploadType="image" class="" readonly="false" preview="true"/>
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
+			<div class="box-footer">
+				<div class="row">
+					<div class="col-sm-offset-2 col-sm-10">
+						<% if (hasPermi('mes:mesMaterialLl: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>

+ 149 - 0
src/main/resources/views/modules/mes/mesMaterialLlList.html

@@ -0,0 +1,149 @@
+<% 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:mesMaterialLl:edit')){ %>
+					<a href="${ctx}/mes/mesMaterialLl/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="${mesMaterialLl}" action="${ctx}/mes/mesMaterialLl/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="otherId" 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="businessDate" 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">
+					<label class="control-label">${text('生产订单号')}:</label>
+					<div class="control-inline">
+						<#form:input path="moDocNo" 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="deptCode" 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="employeeCode" maxlength="64" class="form-control width-120"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<label class="control-label">${text('是否无备料领料,如果有备料就为false,无备料就为true')}:</label>
+					<div class="control-inline">
+						<#form:input path="isNoPickLine" maxlength="1" class="form-control width-120"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<label class="control-label">${text('存储地点')}:</label>
+					<div class="control-inline">
+						<#form:input path="whCode" 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="binCode" 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="itemCode" 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="lotCode" 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="projectCode" 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="issuedQty" maxlength="9" class="form-control width-120"/>
+					</div>
+				</div>
+				<div class="form-group">
+					<label class="control-label">${text('生产订单备料行')}:</label>
+					<div class="control-inline">
+						<#form:input path="mopickList" maxlength="64" 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:'otherId', index:'a.other_id', width:150, align:"left", frozen:true, formatter: function(val, obj, row, act){
+			return '<a href="${ctx}/mes/mesMaterialLl/form?id='+row.id+'" class="btnList" data-title="${text("编辑生产领料单")}">'+(val||row.id)+'</a>';
+		}},
+		{header:'${text("单据日期")}', name:'businessDate', index:'a.business_date', width:150, align:"center"},
+		{header:'${text("生产订单号")}', name:'moDocNo', index:'a.mo_doc_no', width:150, align:"left"},
+		{header:'${text("领料部门")}', name:'deptCode', index:'a.dept_code', width:150, align:"left"},
+		{header:'${text("领料人员")}', name:'employeeCode', index:'a.employee_code', width:150, align:"left"},
+		{header:'${text("是否无备料领料,如果有备料就为false,无备料就为true")}', name:'isNoPickLine', index:'a.is_no_pick_line', width:150, align:"left"},
+		{header:'${text("存储地点")}', name:'whCode', index:'a.wh_code', width:150, align:"left"},
+		{header:'${text("库位")}', name:'binCode', index:'a.bin_code', width:150, align:"left"},
+		{header:'${text("料品编码")}', name:'itemCode', index:'a.item_code', width:150, align:"left"},
+		{header:'${text("批号编码")}', name:'lotCode', index:'a.lot_code', width:150, align:"left"},
+		{header:'${text("项目号")}', name:'projectCode', index:'a.project_code', width:150, align:"left"},
+		{header:'${text("领料数量")}', name:'issuedQty', index:'a.issued_qty', width:150, align:"center"},
+		{header:'${text("生产订单备料行")}', name:'mopickList', index:'a.mopick_list', width:150, align:"left"},
+		{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:mesMaterialLl:edit')){ %>
+				actions.push('<a href="${ctx}/mes/mesMaterialLl/form?id='+row.id+'" class="btnList" title="${text("编辑生产领料单")}"><i class="fa fa-pencil"></i></a>&nbsp;');
+				if (row.status == Global.STATUS_NORMAL){
+					actions.push('<a href="${ctx}/mes/mesMaterialLl/disable?id='+row.id+'" class="btnList" title="${text("停用生产领料单")}" data-confirm="${text("确认要停用该生产领料单吗?")}"><i class="glyphicon glyphicon-ban-circle"></i></a>&nbsp;');
+				} else if (row.status == Global.STATUS_DISABLE){
+					actions.push('<a href="${ctx}/mes/mesMaterialLl/enable?id='+row.id+'" class="btnList" title="${text("启用生产领料单")}" data-confirm="${text("确认要启用该生产领料单吗?")}"><i class="glyphicon glyphicon-ok-circle"></i></a>&nbsp;');
+				}
+				actions.push('<a href="${ctx}/mes/mesMaterialLl/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>

+ 122 - 0
src/main/resources/views/modules/mes/mesMaterialTlForm.html

@@ -0,0 +1,122 @@
+<% layout('/layouts/default.html', {title: '生产退料表管理', libs: ['validate','fileupload']}){ %>
+<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(mesMaterialTl.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="${mesMaterialTl}" action="${ctx}/mes/mesMaterialTl/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="otherId" 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="docTypeCode" 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="businessDate" readonly="true" maxlength="20" class="form-control laydate"
+									dataFormat="datetime" data-type="datetime" data-format="yyyy-MM-dd HH:mm"/>
+							</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="issueDocNo" 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="issueDocLineNo" 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="qty" 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="tlCode" maxlength="64" 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">
+								<span class="required hide">*</span> ${text('图片上传')}:</label>
+							<div class="col-sm-10">
+								<#form:fileupload id="uploadImage" bizKey="${mesMaterialTl.id}" bizType="mesMaterialTl_image"
+									uploadType="image" class="" readonly="false" preview="true"/>
+							</div>
+						</div>
+					</div>
+				</div>
+			</div>
+			<div class="box-footer">
+				<div class="row">
+					<div class="col-sm-offset-2 col-sm-10">
+						<% if (hasPermi('mes:mesMaterialTl: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>

+ 107 - 0
src/main/resources/views/modules/mes/mesMaterialTlList.html

@@ -0,0 +1,107 @@
+<% 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:mesMaterialTl:edit')){ %>
+					<a href="${ctx}/mes/mesMaterialTl/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="${mesMaterialTl}" action="${ctx}/mes/mesMaterialTl/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="otherId" 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="docTypeCode" 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="businessDate" 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">
+					<label class="control-label">${text('领料单号')}:</label>
+					<div class="control-inline">
+						<#form:input path="issueDocNo" 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="issueDocLineNo" 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="qty" 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="tlCode" maxlength="64" 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:'otherId', index:'a.other_id', width:150, align:"left", frozen:true, formatter: function(val, obj, row, act){
+			return '<a href="${ctx}/mes/mesMaterialTl/form?id='+row.id+'" class="btnList" data-title="${text("编辑生产退料表")}">'+(val||row.id)+'</a>';
+		}},
+		{header:'${text("退料单据类型")}', name:'docTypeCode', index:'a.doc_type_code', width:150, align:"left"},
+		{header:'${text("单据日期")}', name:'businessDate', index:'a.business_date', width:150, align:"center"},
+		{header:'${text("领料单号")}', name:'issueDocNo', index:'a.issue_doc_no', width:150, align:"left"},
+		{header:'${text("领料单行号")}', name:'issueDocLineNo', index:'a.issue_doc_line_no', width:150, align:"left"},
+		{header:'${text("退料数量")}', name:'qty', index:'a.qty', width:150, align:"left"},
+		{header:'${text("退料单号")}', name:'tlCode', index:'a.tl_code', width:150, align:"left"},
+		{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:mesMaterialTl:edit')){ %>
+				actions.push('<a href="${ctx}/mes/mesMaterialTl/form?id='+row.id+'" class="btnList" title="${text("编辑生产退料表")}"><i class="fa fa-pencil"></i></a>&nbsp;');
+				if (row.status == Global.STATUS_NORMAL){
+					actions.push('<a href="${ctx}/mes/mesMaterialTl/disable?id='+row.id+'" class="btnList" title="${text("停用生产退料表")}" data-confirm="${text("确认要停用该生产退料表吗?")}"><i class="glyphicon glyphicon-ban-circle"></i></a>&nbsp;');
+				} else if (row.status == Global.STATUS_DISABLE){
+					actions.push('<a href="${ctx}/mes/mesMaterialTl/enable?id='+row.id+'" class="btnList" title="${text("启用生产退料表")}" data-confirm="${text("确认要启用该生产退料表吗?")}"><i class="glyphicon glyphicon-ok-circle"></i></a>&nbsp;');
+				}
+				actions.push('<a href="${ctx}/mes/mesMaterialTl/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>