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 { @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 findPage(MesMaterialLl mesMaterialLl) { return super.findPage(mesMaterialLl); } /** * 查询列表数据 * @param mesMaterialLl * @return */ @Override public List 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()); query.setErpSn(entity.getItemCode()); List 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); } }