|
|
@@ -5,6 +5,7 @@ import java.util.ArrayList;
|
|
|
import java.util.Map;
|
|
|
import java.util.HashMap;
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
import java.text.SimpleDateFormat;
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
@@ -12,6 +13,7 @@ import javax.servlet.http.HttpServletResponse;
|
|
|
import com.alibaba.fastjson.JSON;
|
|
|
import com.alibaba.fastjson.JSONValidator;
|
|
|
import com.jeesite.common.codec.EncodeUtils;
|
|
|
+import com.jeesite.common.lang.StringUtils;
|
|
|
import com.jeesite.modules.wms.entity.WmsBom;
|
|
|
import com.jeesite.modules.wms.entity.WmsMaterial;
|
|
|
import com.jeesite.modules.wms.entity.WmsOrder;
|
|
|
@@ -38,6 +40,7 @@ import org.springframework.transaction.annotation.Transactional;
|
|
|
import com.jeesite.common.config.Global;
|
|
|
import com.jeesite.common.entity.Page;
|
|
|
import com.jeesite.common.mybatis.mapper.query.QueryType;
|
|
|
+import com.jeesite.common.service.ServiceException;
|
|
|
import com.jeesite.common.web.BaseController;
|
|
|
import com.jeesite.modules.mes.entity.MesProductCate;
|
|
|
import com.jeesite.modules.mes.entity.MesProductOrder;
|
|
|
@@ -269,10 +272,13 @@ public class MesProductOrderController extends BaseController {
|
|
|
if (orderId == null || materialId == null || nums == null || nums <= 0) return renderResult(Global.FALSE, text("请输入有效的取料数量!"));
|
|
|
MesProductOrder order = mesProductOrderService.get(orderId);
|
|
|
if (order == null) return renderResult(Global.FALSE, text("生产订单不存在!"));
|
|
|
+ if (StringUtils.isBlank(order.getBomId())) return renderResult(Global.FALSE, text("生产订单未维护BOM,无法取料!"));
|
|
|
WmsBomMaterial q = new WmsBomMaterial(); q.setBomId(order.getBomId()); q.setMaterialId(materialId); q.setStatus("0");
|
|
|
List<WmsBomMaterial> items = wmsBomMaterialService.findList(q);
|
|
|
if (items.isEmpty()) return renderResult(Global.FALSE, text("物料不在订单BOM中!"));
|
|
|
- int demand = Integer.parseInt(items.get(0).getNums()) * order.getNums();
|
|
|
+ BigDecimal bomNums = parseNums(items.get(0).getNums());
|
|
|
+ if (bomNums == null || order.getNums() == null) return renderResult(Global.FALSE, text("BOM物料需求数量无效,请先维护BOM物料数量!"));
|
|
|
+ int demand = bomNums.multiply(BigDecimal.valueOf(order.getNums())).setScale(0, RoundingMode.CEILING).intValue();
|
|
|
WmsPickRecord rq = new WmsPickRecord(); rq.setOrderId(orderId); rq.setMaterialId(materialId);
|
|
|
int picked = 0; for (WmsPickRecord pr : wmsPickRecordService.findList(rq)) if (pr.getNums()!=null) picked += pr.getNums();
|
|
|
if (picked + nums > demand) return renderResult(Global.FALSE, text("取料数量不能超过订单需求!"));
|
|
|
@@ -288,7 +294,11 @@ public class MesProductOrderController extends BaseController {
|
|
|
@PostMapping(value = "save")
|
|
|
@ResponseBody
|
|
|
public String save(@Validated MesProductOrder mesProductOrder) {
|
|
|
- mesProductOrderService.save(mesProductOrder);
|
|
|
+ try {
|
|
|
+ mesProductOrderService.save(mesProductOrder);
|
|
|
+ } catch (ServiceException e) {
|
|
|
+ return renderResult(Global.FALSE, e.getMessage());
|
|
|
+ }
|
|
|
return renderResult(Global.TRUE, text("保存生产订单成功!"));
|
|
|
}
|
|
|
|
|
|
@@ -303,12 +313,36 @@ public class MesProductOrderController extends BaseController {
|
|
|
if (!"0".equals(mesProductOrder.getState()))
|
|
|
return renderResult(Global.FALSE, text("当前订单不能下发!"));
|
|
|
|
|
|
+ if (mesProductOrder.getNums() == null || mesProductOrder.getNums() <= 0)
|
|
|
+ return renderResult(Global.FALSE, text("订单生产数量不能为空,请先编辑订单维护生产数量!"));
|
|
|
+ if (StringUtils.isBlank(mesProductOrder.getBomId()))
|
|
|
+ return renderResult(Global.FALSE, text("订单未维护BOM,不能下发!"));
|
|
|
+
|
|
|
WmsBomMaterial query = new WmsBomMaterial();
|
|
|
query.setBomId(mesProductOrder.getBomId());
|
|
|
query.setStatus("0");
|
|
|
List<WmsBomMaterial> bomItems = wmsBomMaterialService.findList(query);
|
|
|
if (bomItems.isEmpty())
|
|
|
return renderResult(Global.FALSE, text("订单BOM未配置有效物料!"));
|
|
|
+
|
|
|
+ // 先校验BOM物料数量,避免生成领料单后才发现数据异常
|
|
|
+ Map<String, Integer> planNumsMap = new HashMap<>();
|
|
|
+ for (WmsBomMaterial bomItem : bomItems) {
|
|
|
+ BigDecimal bomNums = parseNums(bomItem.getNums());
|
|
|
+ if (bomNums == null) {
|
|
|
+ return renderResult(Global.FALSE, text("BOM物料需求数量无效,请先维护BOM物料数量!"));
|
|
|
+ }
|
|
|
+ planNumsMap.put(bomItem.getId(), bomNums
|
|
|
+ .multiply(BigDecimal.valueOf(mesProductOrder.getNums()))
|
|
|
+ .setScale(0, RoundingMode.CEILING).intValue());
|
|
|
+ }
|
|
|
+
|
|
|
+ // 防止重复下发时生成多张领料单
|
|
|
+ WmsPick pickQuery = new WmsPick();
|
|
|
+ pickQuery.setOrderId(mesProductOrder.getId());
|
|
|
+ if (!wmsPickService.findList(pickQuery).isEmpty())
|
|
|
+ return renderResult(Global.FALSE, text("该订单已生成领料单,请勿重复下发!"));
|
|
|
+
|
|
|
WmsPick pick = new WmsPick();
|
|
|
pick.setOrderId(mesProductOrder.getId());
|
|
|
pick.setState("0");
|
|
|
@@ -319,18 +353,45 @@ public class MesProductOrderController extends BaseController {
|
|
|
WmsPickMaterial item = new WmsPickMaterial();
|
|
|
item.setPickId(pick.getId());
|
|
|
item.setMaterialId(bomItem.getMaterialId());
|
|
|
- item.setPlanNums(Integer.valueOf(bomItem.getNums()) * mesProductOrder.getNums());
|
|
|
+ item.setPlanNums(planNumsMap.get(bomItem.getId()));
|
|
|
item.setPickNums(0);
|
|
|
item.setState("0");
|
|
|
item.setStatus("0");
|
|
|
wmsPickMaterialService.save(item);
|
|
|
}
|
|
|
- mesProductOrder.setState("1");
|
|
|
- mesProductOrderService.save(mesProductOrder);
|
|
|
+ mesProductOrderService.updateOrderState(mesProductOrder.getId(), "1");
|
|
|
return renderResult(Global.TRUE, text("操作成功!"));
|
|
|
}
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 解析BOM数量,支持小数;为空或格式错误时返回null。
|
|
|
+ */
|
|
|
+ private BigDecimal parseNums(String value) {
|
|
|
+ if (StringUtils.isBlank(value)) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ return new BigDecimal(value.trim());
|
|
|
+ } catch (NumberFormatException e) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
/**
|
|
|
+ * 完成订单
|
|
|
+ */
|
|
|
+ @RequiresPermissions("mes:mesProductOrder:edit")
|
|
|
+ @RequestMapping(value = "complete")
|
|
|
+ @ResponseBody
|
|
|
+ @Transactional
|
|
|
+ public String complete(MesProductOrder mesProductOrder) {
|
|
|
+ if (!"1".equals(mesProductOrder.getState()))
|
|
|
+ return renderResult(Global.FALSE, text("只有已下发的订单才能完成!"));
|
|
|
+ mesProductOrderService.updateOrderState(mesProductOrder.getId(), "2");
|
|
|
+ return renderResult(Global.TRUE, text("订单已完成!"));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
* 删除数据
|
|
|
*/
|
|
|
@RequiresPermissions("mes:mesProductOrder:edit")
|