自动排产2.0

master
zhaoxiaolin 7 months ago
parent f16b434b1b
commit e111a303b8

@ -481,7 +481,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
* @param content (0)
* @return
*/
public static final List<String> batchAutoCreate(String factoryCode, String lineCode, Date productDate,String version, String content,int batchNum){
public static final List<String> batchAutoCreate(String factoryCode, String lineCode, Date productDate,String version, String content,int batchNum,char startZM){
SimpleDateFormat targetFormat = new SimpleDateFormat("yyyyMMdd");
// Create a Calendar instance and set it to the current date
Calendar calendar = Calendar.getInstance();
@ -495,7 +495,8 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils {
// Format the new date
String toValidity = targetFormat.format(futureDate);
List<String> batchList=new ArrayList<>();
for (char letter = 'A'; letter < 'A' + batchNum; letter++) {
for (char letter = startZM; letter < startZM + batchNum; letter++) {
String BatchCode=toValidity+Constants.LJ+targetFormat.format(productDate)+lineCode+factoryCode+letter+Constants.OUTPUT_STATUS_A+content+version;
batchList.add(BatchCode);
}

@ -341,8 +341,9 @@ public class ProOrderController extends BaseController {
/**辅助排产**/
@PostMapping("/autoSplitOrder")
public R autoSplitOrder(@RequestBody ProOrder proOrder) {
return proOrderService.autoSplitOrder(proOrder);
public AjaxResult autoSplitOrder(@RequestBody ProOrder proOrder) {
AjaxResult r= proOrderService.autoSplitOrder(proOrder);
return r;
}
/**辅助排产取消**/

@ -75,6 +75,15 @@ public class ProOrder extends TreeEntity {
private String routeCode;
private Integer endFlag;
private String belongWorkOrder;
private String shiftId;
public String getShiftId() {
return shiftId;
}
public void setShiftId(String shiftId) {
this.shiftId = shiftId;
}
public String getBelongWorkOrder() {
return belongWorkOrder;

@ -231,5 +231,7 @@ public interface ProOrderWorkorderMapper {
List<ProOrderWorkorder> selectFirWorkOrderCG(String id);
List<ProOrderWorkorder> selectChildWorkOrderCG(String workorderCode);
List<String> getBatchDict(String batchFlag);
}

@ -148,7 +148,7 @@ public interface IProOrderService {
ProOrder getCanProductLine(ProOrder proOrder);
R autoSplitOrder(ProOrder proOrder);
AjaxResult autoSplitOrder(ProOrder proOrder);
AjaxResult getWorkOrderListCG(String id);

@ -1,6 +1,7 @@
package com.op.plan.service.impl;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.LinkedBlockingQueue;
@ -1318,37 +1319,46 @@ public class ProOrderServiceImpl implements IProOrderService {
//所有线体
List<ProOrder> lineList = proOrderMapper.getCanProductLine();
dto.setLineList(lineList);
List<ProOrder> proLines = proOrderMapper.getSelectLineLevel1(proOrder);
BigDecimal todayPro = new BigDecimal(BigInteger.ZERO);//当日设备实际产能
for(ProOrder pLines:proLines){
todayPro = todayPro.add(pLines.getEfficiency());
}
if(todayPro.doubleValue() < proOrder.getQuantity()){
logger.error("当日设备产能达不到订单要求");
return null;
}
//推荐线体
List<String> recommendLineList = getRecommendLines(proOrder);
List<String> recommendLineList = getRecommendLines(proLines,proOrder);
dto.setRecommendLineList(recommendLineList);
return dto;
}
@Override
@DS("#header.poolName")
public R autoSplitOrder(ProOrder proOrder) {
public AjaxResult autoSplitOrder(ProOrder proOrder) {
Date nowTime = DateUtils.getNowDate();//公共时间
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
String key = "#header.poolName";
proOrder.setFactoryCode(request.getHeader(key.substring(8)).replace("ds_",""));
proOrder.setCreateTime(nowTime);
String shiftId = proOrder.getShiftId();
//订单总量
proOrder.setQuantitySplit(proOrder.getQuantitySplit()==null?0L:proOrder.getQuantitySplit());
Long orderQua = proOrder.getQuantity()-proOrder.getQuantitySplit();
//有几个设备就有几个工单
for(int i=0;i<proOrder.getLineCodes().length;i++){
if(orderQua == 0L){
logger.info("线体产能满足生产");
break;
}
List<ProOrderWorkorder> workorders = new ArrayList<>();
proOrder.setLineCode(proOrder.getLineCodes()[i]);
ProLine plineInfo = proOrderWorkorderMapper.getLineProductInfo(proOrder);//线体母单产品产能和线体代码
if(plineInfo==null){
logger.error("线体"+proOrder.getLineCodes()[i]+"无法生产");
return R.fail("线体"+proOrder.getLineCodes()[i]+"无法生产");
return AjaxResult.error(642,"线体"+proOrder.getLineCodes()[i]+"无法生产");
}
Long efficiency = plineInfo.getEfficiency();
if(efficiency < orderQua){
@ -1365,6 +1375,7 @@ public class ProOrderServiceImpl implements IProOrderService {
proOrder.setBelongWorkOrder(belongWorkOrder);
proOrder.setWorkerOrder(belongWorkOrder);
proOrder.setParentOrder("0");
proOrder.setShiftId(shiftId);
ProOrderWorkorder pworkOrder = getWorkOrderByOrder(proOrder,proOrder);//TODO;
//父级
workorders.add(pworkOrder);
@ -1384,6 +1395,7 @@ public class ProOrderServiceImpl implements IProOrderService {
sonOrder.setWorkerOrder(sworkOrderCode);
sonOrder.setParentOrder(parentWorkOrder);
sonOrder.setQuantitySplit(sonOrder.getQuantity());
sonOrder.setShiftId(shiftId);
if(CollectionUtils.isEmpty(sonOrder.getChildren())){
sonOrder.setEndFlag(1);
}
@ -1412,7 +1424,16 @@ public class ProOrderServiceImpl implements IProOrderService {
/**拆批次**/
proOrder.setProdSpc(plineInfo.getDh());//借用字段
List<ProOrderWorkorderBatch> workorderBatches0 = getBatchList(proOrder);//TODO;
if(CollectionUtils.isEmpty(workorderBatches0)){
logger.error("批次太多,请检查【产品批次数量】、【产线产能】、【批次号夜班开始字母】是否设置正常。");
return AjaxResult.error(642,"批次太多,请检查产品批次数量是否设置正常。");
}
List<ProOrderWorkorderBatch> workBatchs = new ArrayList<>();
for(int m=0;m<workorders.size();m++){
ProOrderWorkorder work = workorders.get(m);
@ -1440,18 +1461,12 @@ public class ProOrderServiceImpl implements IProOrderService {
/**pro_order_workorder_batch**/
if(!CollectionUtils.isEmpty(workBatchs)) {
if(workBatchs.size()>100){
logger.error("批次太多,请检查产品批次数量是否设置正常。");
return R.fail("批次太多,请检查产品批次数量是否设置正常。");
}
int pn = proOrderWorkorderBatchMapper.insertWorkorderBatchs(workBatchs);
System.out.println("pn:"+pn);
}
}
return R.ok();
return AjaxResult.success();
}
/**
@ -1507,12 +1522,33 @@ public class ProOrderServiceImpl implements IProOrderService {
pworkOrderQua = pworkOrderQua - batchQua0.getBatchQuaStandar().longValue();
}
List<String> batches = proOrderWorkorderMapper.getBatchDict("batch_flag");
char dayWorkBatchStart = batches.get(0).charAt(0);
char nightWorkBatchStart = batches.get(1).charAt(0);
int dayBatches = nightWorkBatchStart - dayWorkBatchStart;
int nigthBatches = 'Z' - nightWorkBatchStart;
int maxBatchNum = 0;
char startZM = 'A';
if("5".equals(proOrder.getShiftId())){//白班
maxBatchNum = nightWorkBatchStart - dayWorkBatchStart;
startZM = dayWorkBatchStart;
}else if("2".equals(proOrder.getShiftId())){//夜班
maxBatchNum = 'Z' - nightWorkBatchStart;
startZM = nightWorkBatchStart;
}
if(workorderBatches.size()>maxBatchNum){
logger.error("大于工厂字典【batch_flag】推理的的批次数");
return null;
}
//获取批次号集合
List<String> batchCodes = StringUtils.batchAutoCreate(proOrder.getFactoryCode(),
proOrder.getProdSpc(),
DateUtils.dateTime("yyyy-MM-dd",proOrder.getProductDate()),
proOrder.getAtrr2().substring(proOrder.getAtrr2().length()-1),
"0",workorderBatches.size());
"0",workorderBatches.size(),startZM);
for(int n=0;n<workorderBatches.size();n++){
workorderBatches.get(n).setBatchCode(batchCodes.get(n));
@ -1527,9 +1563,8 @@ public class ProOrderServiceImpl implements IProOrderService {
* 2线
* @param proOrder
*/
protected List<String> getRecommendLines(ProOrder proOrder){
protected List<String> getRecommendLines(List<ProOrder> proLines,ProOrder proOrder){
List<String> lines = new ArrayList<>();
List<ProOrder> proLines = proOrderMapper.getSelectLineLevel1(proOrder);
//订单总量
proOrder.setQuantitySplit(proOrder.getQuantitySplit()==null?0L:proOrder.getQuantitySplit());
BigDecimal orderQuality = new BigDecimal(proOrder.getQuantity()).subtract(new BigDecimal(proOrder.getQuantitySplit()));
@ -1547,18 +1582,7 @@ public class ProOrderServiceImpl implements IProOrderService {
public static void main(String args[]){
// String arrayStr = "[[\"GX01\",\"LG1\"],[\"GX01\",\"LG2\"],[\"GX02\",\"S1\"],[\"GX02\",\"S2\"],[\"GX03\",\"HF01\"],[\"GX04\",\"SPJ01\"]]";
// JSONArray jsonArray = JSONArray.parseArray(arrayStr);
// for(int c=0;c<jsonArray.size();c++){
// System.out.println(jsonArray.getJSONArray(c).getString(1));
// }
// BigDecimal a = new BigDecimal("100");
// BigDecimal b = new BigDecimal("100");
// System.out.println(a.compareTo(b));
int m=1;
while(m<3){
++m;
}
System.out.println(m);
char zm = 'D';
System.out.println(zm-'A'+1);
}
}

@ -671,6 +671,9 @@
from base_product
where del_flag = '0' and product_code = #{prodCode}
</select>
<select id="getBatchDict" resultType="java.lang.String">
select dict_value from base_dict_data where dict_type = #{batchFlag} order by dict_value
</select>
<insert id="createPrepareDetails">
insert into mes_prepare_detail
@ -778,7 +781,7 @@
product_name,unit,quantity_split,route_code,prod_line_code,
product_date,parent_order, status,create_by,create_time,
prod_type,factory_code,end_flag,del_flag,sort_no,
belong_work_order
belong_work_order,shift_id
)VALUES
<foreach collection="list" item="d" index="index" separator=",">
(
@ -786,7 +789,7 @@
#{d.productName},#{d.unit},#{d.quantitySplit},#{d.routeCode},#{d.prodLineCode},
#{d.productDate},#{d.parentOrder},#{d.status},#{d.createBy},#{d.createTime},
#{d.prodType}, #{d.factoryCode},#{d.endFlag},'2',#{d.sortNo},
#{d.belongWorkOrder}
#{d.belongWorkOrder},#{d.shiftId}
)
</foreach>
</insert>

Loading…
Cancel
Save