diff --git a/pom.xml b/pom.xml index 8e87240..31b68a7 100644 --- a/pom.xml +++ b/pom.xml @@ -19,6 +19,21 @@ + + cn.afterturn + easypoi-base + 3.2.0 + + + cn.afterturn + easypoi-web + 3.2.0 + + + cn.afterturn + easypoi-annotation + 3.2.0 + org.apache.pdfbox pdfbox @@ -254,6 +269,11 @@ mybatisplus-plus 1.7.4-RELEASE --> + + com.google.guava + guava + 21.0 + diff --git a/src/main/java/com/dsic/gj_erp/bean/jcsj/DmBom.java b/src/main/java/com/dsic/gj_erp/bean/jcsj/DmBom.java index 9c4cb51..17cb005 100644 --- a/src/main/java/com/dsic/gj_erp/bean/jcsj/DmBom.java +++ b/src/main/java/com/dsic/gj_erp/bean/jcsj/DmBom.java @@ -1,7 +1,9 @@ package com.dsic.gj_erp.bean.jcsj; import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; +import com.dsic.gj_erp.pc.dto.资源; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @@ -217,7 +219,7 @@ public class DmBom implements Serializable { // 反馈工时 private String fkgs; - - + @TableField(exist = false) + private 资源 所在资源; } diff --git a/src/main/java/com/dsic/gj_erp/bean/jhgk/DmSygdxq.java b/src/main/java/com/dsic/gj_erp/bean/jhgk/DmSygdxq.java index 2e76062..91f5654 100644 --- a/src/main/java/com/dsic/gj_erp/bean/jhgk/DmSygdxq.java +++ b/src/main/java/com/dsic/gj_erp/bean/jhgk/DmSygdxq.java @@ -3,12 +3,14 @@ package com.dsic.gj_erp.bean.jhgk; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; +import com.dsic.gj_erp.bean.jcsj.DmBom; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; +import java.util.List; /** *

@@ -90,5 +92,7 @@ public class DmSygdxq implements Serializable { private String xqzt="0"; + @TableField(exist = false) + private List bomList; } diff --git a/src/main/java/com/dsic/gj_erp/mapper/jhgk/DmSygdxqMapper.java b/src/main/java/com/dsic/gj_erp/mapper/jhgk/DmSygdxqMapper.java index e2caed7..5b27c5e 100644 --- a/src/main/java/com/dsic/gj_erp/mapper/jhgk/DmSygdxqMapper.java +++ b/src/main/java/com/dsic/gj_erp/mapper/jhgk/DmSygdxqMapper.java @@ -18,4 +18,6 @@ import java.util.List; */ public interface DmSygdxqMapper extends BaseMapper { + List getXqWithBom(String from,String to); + } diff --git a/src/main/java/com/dsic/gj_erp/pc/Constant.java b/src/main/java/com/dsic/gj_erp/pc/Constant.java new file mode 100644 index 0000000..aed16c1 --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/pc/Constant.java @@ -0,0 +1,162 @@ +package com.dsic.gj_erp.pc; + +import com.dsic.gj_erp.bean.jcsj.EmSbjbb; +import com.dsic.gj_erp.pc.dto.sb.设备01上料; +import com.dsic.gj_erp.pc.dto.sb.设备02抛丸; +import com.dsic.gj_erp.pc.dto.设备; +import com.google.common.collect.ImmutableMap; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.Map; + +public interface Constant { + //手动配置,后期可根据设备进行计算(计算方式根据所有设备的产能合并后的结果,设备维护时不计入产能,休息日产能默认为0) + ImmutableMap<工序, Double> 工序产能 = ImmutableMap.<工序, Double>builder() + .put(工序.上料, 200.0) + .put(工序.抛丸, 200.0) + .put(工序.理料, 200.0) + .put(工序.划线, 200.0) + + .put(工序.一跨龙门切割, 200.0) + .put(工序.一跨数控切割, 200.0) + .put(工序.二跨数控切割, 200.0) + .put(工序.三跨数控切割, 200.0) + .put(工序.三跨平铁切割, 200.0) + .put(工序.手工切割, 200.0) + + .put(工序.坡口, 200.0) + .put(工序.型材面板, 200.0) + .put(工序.曲加工, 200.0) + .put(工序.平铁打磨, 200.0) + .put(工序.手工打磨, 200.0) + .put(工序.预配盘, 200.0) + .put(工序.光电结束, 200.0) + .build(); + + //相对于钢料需求期 + ImmutableMap<工序, Integer> 工序CD = ImmutableMap.<工序, Integer>builder() + .put(工序.上料, -10) + .put(工序.抛丸, -8) + .put(工序.理料, -8) + .put(工序.划线, -5) + + .put(工序.一跨龙门切割, -5) + .put(工序.一跨数控切割, -5) + .put(工序.二跨数控切割, -5) + .put(工序.三跨数控切割, -5) + .put(工序.三跨平铁切割, -5) + .put(工序.手工切割, -5) + + .put(工序.坡口, -3) + .put(工序.型材面板, -2) + .put(工序.曲加工, -5) + .put(工序.平铁打磨, -5) + .put(工序.手工打磨, -5) + .put(工序.预配盘, 0) + .put(工序.光电结束, -3) + .put(工序.配送, 0) + .build(); + + //来源数据库 +// ImmutableMap 套料图工序对应关系 = ImmutableMap.of(); +// .builder() + //二跨超长超宽曲板小组 +// .put("10101019", 工序.上料) +// .put("10101020", 工序.抛丸) +// .put("10101021", 工序.理料) +// .put("10101004", 工序.二跨数控切割) +// .put("10101008", 工序.坡口) +// .put("10101018", 工序.曲加工) + //二跨超长超宽曲板中大组 +// .put("10111019", 工序.上料) +// .put("10111020", 工序.抛丸) +// .put("10111021", 工序.理料) +// .put("10111004", 工序.二跨数控切割) +// .put("10111008", 工序.坡口) +// .put("10111018", 工序.曲加工) +// .build(); + + //来源数据库 + ImmutableMap<工序, Map> 工序设备对应关系 = ImmutableMap.<工序, Map>builder() + //二跨超长超宽曲板小组 + .put(工序.上料, ImmutableMap.builder() + .put("",new 设备01上料()) + .build()) + .put(工序.抛丸, ImmutableMap.builder() + .put("",new 设备02抛丸()) + .build()) +// .put(工序.抛丸, new EmSbjbb[]{new EmSbjbb(), new EmSbjbb()}) +// .put(工序.理料, new EmSbjbb[]{new EmSbjbb(), new EmSbjbb()}) +// .put(工序.划线, new EmSbjbb[]{new EmSbjbb(), new EmSbjbb()}) +// +// .put(工序.一跨龙门切割, new EmSbjbb[]{new EmSbjbb(), new EmSbjbb()}) +// .put(工序.一跨数控切割, new EmSbjbb[]{new EmSbjbb(), new EmSbjbb()}) +// .put(工序.二跨数控切割, new EmSbjbb[]{new EmSbjbb(), new EmSbjbb()}) +// .put(工序.三跨数控切割, new EmSbjbb[]{new EmSbjbb(), new EmSbjbb()}) +// .put(工序.三跨平铁切割, new EmSbjbb[]{new EmSbjbb(), new EmSbjbb()}) +// +// .put(工序.坡口, new EmSbjbb[]{new EmSbjbb(), new EmSbjbb()}) +// .put(工序.型材面板, new EmSbjbb[]{new EmSbjbb(), new EmSbjbb()}) +// .put(工序.曲加工, new EmSbjbb[]{new EmSbjbb(), new EmSbjbb()}) +// .put(工序.平铁打磨, new EmSbjbb[]{new EmSbjbb(), new EmSbjbb()}) +// .put(工序.手工打磨, new EmSbjbb[]{new EmSbjbb(), new EmSbjbb()}) +// .put(工序.预配盘, new EmSbjbb[]{new EmSbjbb(), new EmSbjbb()}) +// .put(工序.光电结束, new EmSbjbb[]{new EmSbjbb(), new EmSbjbb()}) +// .put(工序.配送, new EmSbjbb[]{new EmSbjbb(), new EmSbjbb()}) + .build(); + @Getter + @AllArgsConstructor + enum 设备产能{ + SLSB01(工序.上料,"","",0,0,200.0,200.0,400), + PWSB01(工序.抛丸,"","",0,0,240.0,286.0,526.0), + LM01(工序.一跨龙门切割,"","",2.4,3.6,9.6,15.6,25.2), + 火焰01(工序.一跨数控切割,"","",0.3,11.5,2.0,0,2.0), + 数控01(工序.一跨数控切割,"","",1.5,3.0,0,8.5,25.5), + ; + public 工序 _工序; + public String 设备编号; + public String 设备名称; + public double 单台效率; + public double 单台产能; + public double 白班设备产能; + public double 二班设备产能; + public double 双班合计产能; + } + + @AllArgsConstructor + enum 工序{ + NULL(""), + 上料("19"), + 抛丸("20"), + 理料("21"), + 划线("01"), + 一跨龙门切割("03"),一跨数控切割("04"),二跨数控切割("04"),三跨数控切割("04"),三跨平铁切割("05"),手工切割("06"), + 坡口("08"), + 型材面板("17"), + 曲加工("18"), + 平铁打磨("13"),手工打磨("16"), + 预配盘(""), + 光电结束(""), + 配送(""), + ; + + @Getter + private String code; + + //通过code获取工序 + public static 工序 getGxByCode(String code) { + for (工序 gx : 工序.values()) { + if (gx.getCode().equals(code)) { + return gx; + } + } + return 工序.NULL; + } + + //判断工序是否时NULL的 + public static boolean isNull(工序 gx) { + return gx==工序.NULL; + } + } +} diff --git a/src/main/java/com/dsic/gj_erp/pc/DataFactory.java b/src/main/java/com/dsic/gj_erp/pc/DataFactory.java new file mode 100644 index 0000000..2cc5757 --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/pc/DataFactory.java @@ -0,0 +1,179 @@ +package com.dsic.gj_erp.pc; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjUtil; +import cn.hutool.core.util.StrUtil; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.dsic.gj_erp.bean.SpringContextHolder; +import com.dsic.gj_erp.bean.jcsj.EmGcrl; +import com.dsic.gj_erp.bean.jcsj.EmSbcnp; +import com.dsic.gj_erp.bean.jcsj.EmSbjbb; +import com.dsic.gj_erp.bean.jhgk.DmSygdxq; +import com.dsic.gj_erp.pc.dto.gx.*; +import com.dsic.gj_erp.pc.dto.工序产能; +import com.dsic.gj_erp.pc.dto.排产结果; +import com.dsic.gj_erp.pc.dto.设备; +import com.dsic.gj_erp.pc.dto.资源; +import com.dsic.gj_erp.service.jcsj.EmGcrlService; +import com.dsic.gj_erp.service.jcsj.EmSbcnpService; +import com.dsic.gj_erp.service.jcsj.EmSbjbbService; +import com.dsic.gj_erp.service.jhgk.DmSygdxqService; + +import java.io.FileOutputStream; +import java.io.OutputStream; +import java.util.*; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.stream.Collectors; + +import static com.dsic.gj_erp.pc.Constant.工序CD; +import static com.dsic.gj_erp.pc.Manager.*; + +public class DataFactory { + + public static void 排产(){ + 套料图所占工序的资源.clear(); + List<排产结果> list = 排产.list; + list.clear(); + List xqWithBom = getBean(DmSygdxqService.class).getXqWithBom(from, to); + xqWithBom.forEach(xq->{ + xq.getBomList().forEach(bom->{ + Arrays.stream(Constant.工序.values()).forEach(gx->{ + if (StrUtil.isEmpty(gx.getCode()))return; + if (ObjUtil.isNotEmpty(套料图工序对应关系.get(bom.getKw()+bom.getZl()+"_"+gx.getCode()))){ + Integer cd = 工序CD.get(gx); + DateTime parse = DateUtil.parse(xq.getXzglxq(), "yyyy/MM/dd"); + DateTime dateTime = DateUtil.offsetDay(parse, cd); + 资源 _资源 = 提取资源(dateTime); + Optional.of(_资源).ifPresent(it->{ + 工序产能 工序产能=null; + 资源 资源 = 套料图所占工序的资源.get(bom.getTzbh()); + if (资源!=null){ + 工序产能 = 套料图所占工序的资源.get(bom.getTzbh()).get工序产能MAP().get(gx); + } + if (工序产能!=null&&工序产能.get资源占用图纸表().contains(bom.getTzbh())){ + bom.set所在资源(_资源); + }else{ + 工序产能 = it.get工序产能MAP().get(gx); + //直接占用资源 + 工序产能.占用资源(bom.getTzbh(), bom.getTlsl().doubleValue()); + bom.set所在资源(_资源); + 套料图所占工序的资源.put(bom.getTzbh(),_资源); + } + }); + } + }); + }); + }); + System.out.println(111); + } + + public static 资源 提取资源(Date date){ + 资源 资源 = 资源池.get(DateUtil.format(date, "yyyy/MM/dd")); + if (资源==null){ + return 提取资源(DateUtil.offsetDay(date,-1)); + } + return 资源; + } + + public static void 创建产能资源池(){ + 资源池.clear(); + + Map map=new HashMap<>(); + Arrays.stream(Constant.工序.values()).forEach(item->{ + if (StrUtil.isNotEmpty(item.getCode())){ + map.put(item,工序产能工厂(item)); + } + }); + 工厂日历.stream().filter(item -> "1".equals(item.getXxr())) + .forEach(item -> 资源池.put(item.getGl(),资源.of(item.getGl(), map))); + } + + public static 工序产能 工序产能工厂(Constant.工序 _工序){ + Map _设备 = Constant.工序设备对应关系.get(_工序); + switch (_工序){ + case 上料: + return new 工序01上料(_工序,_设备); + case 抛丸: + return new 工序02抛丸(_工序,_设备); + case 理料: + return new 工序03理料(_工序,_设备); + case 划线: + return new 工序04划线(_工序,_设备); + case 一跨龙门切割: + case 一跨数控切割: + case 二跨数控切割: + case 三跨数控切割: + case 三跨平铁切割: + case 手工切割: + return new 工序05切割(_工序,_设备); + case 坡口: + return new 工序07坡口(_工序,_设备); + case 型材面板: + return new 工序10型材(_工序,_设备); + case 曲加工: + return new 工序08曲面(_工序,_设备); + case 平铁打磨: + case 手工打磨: + return new 工序09打磨(_工序,_设备); +// case 预配盘: +// return new 工序01上料(_工序,_设备); +// case 光电结束: +// return new 工序01上料(_工序,_设备); +// case 配送: +// return new 工序01上料(_工序,_设备); + default: + return new 工序99未知(_工序,_设备); + } + } + + public static void 加载工厂日历(){ + List list = getBean(EmGcrlService.class).getList(new JSONObject()); + 工厂日历.clear(); + 工厂日历.addAll(list); + } + + public static void 加载套料图工序对应关系(){ + 套料图工序对应关系.clear(); + List list = getBean(EmSbcnpService.class).list(); + Map> map = list.stream().collect(Collectors.groupingBy(l -> l.getTzbh() + l.getZl()+"_"+l.getGx())); + map.keySet().forEach(key->{ + String gxCode=key.split("_")[1]; + 套料图工序对应关系.put(key,Constant.工序.getGxByCode(gxCode)); + }); + } + + public static void 加载设备信息(){ + List deviceList = getBean(EmSbjbbService.class).list(Wrappers.lambdaQuery().like(EmSbjbb::getScbs, "1")); + 设备列表.clear(); + 设备列表.addAll(deviceList); + } + + public static void 加载工序设备对应关系(){ + 工序设备对应关系.clear(); + Arrays.stream(Constant.工序.values()).forEach(gx->{ + if (StrUtil.isNotEmpty(gx.getCode())){ + 工序设备对应关系.putIfAbsent(gx, 设备列表.stream().filter(d->d.getGx().equals(gx.getCode())).collect(Collectors.toList())); + } + }); + } + + public static void 输出排产结果到EXCEL(OutputStream stream){ + + } + + + public static void 输出排产结果到EXCEL(String fileName){ + try(FileOutputStream fos=new FileOutputStream(fileName)) { + 输出排产结果到EXCEL(fos); + }catch (Exception e){ + e.printStackTrace(); + } + } + + private static T getBean(Class clazz) { + return SpringContextHolder.getBean(clazz); + } + private DataFactory(){} +} diff --git a/src/main/java/com/dsic/gj_erp/pc/Manager.java b/src/main/java/com/dsic/gj_erp/pc/Manager.java new file mode 100644 index 0000000..26c7e0e --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/pc/Manager.java @@ -0,0 +1,26 @@ +package com.dsic.gj_erp.pc; + +import com.dsic.gj_erp.bean.jcsj.EmGcrl; +import com.dsic.gj_erp.bean.jcsj.EmSbjbb; +import com.dsic.gj_erp.pc.dto.资源; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public class Manager { + public static String from; + public static String to; + public static 排产 排产; + public static final List 工厂日历=new ArrayList<>(); + public static final Map 资源池= new ConcurrentHashMap<>(); + //key=tlth+"_"+工序名称 + public static final Map 套料图所占工序的资源= new ConcurrentHashMap<>(); + public static final Map 套料图工序对应关系 = new ConcurrentHashMap<>(); + public static final List 设备列表= new ArrayList<>(); + //实时加载 + public static final Map> 工序设备对应关系 = new ConcurrentHashMap<>(); + + private Manager(){} +} diff --git a/src/main/java/com/dsic/gj_erp/pc/dto/gx/工序01上料.java b/src/main/java/com/dsic/gj_erp/pc/dto/gx/工序01上料.java new file mode 100644 index 0000000..780ed26 --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/pc/dto/gx/工序01上料.java @@ -0,0 +1,22 @@ +package com.dsic.gj_erp.pc.dto.gx; + +import com.dsic.gj_erp.pc.Constant; +import com.dsic.gj_erp.pc.dto.工序产能; +import com.dsic.gj_erp.pc.dto.设备; +import lombok.Getter; +import lombok.Setter; + +import java.util.Map; + +@Getter +@Setter +public class 工序01上料 extends 工序产能 { + public 工序01上料(Constant.工序 工序, Map _设备) { + super(工序,_设备); + } + + @Override + public void 占用资源(double 所需产能) { + super.占用资源(1.0); + } +} diff --git a/src/main/java/com/dsic/gj_erp/pc/dto/gx/工序02抛丸.java b/src/main/java/com/dsic/gj_erp/pc/dto/gx/工序02抛丸.java new file mode 100644 index 0000000..899d64f --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/pc/dto/gx/工序02抛丸.java @@ -0,0 +1,22 @@ +package com.dsic.gj_erp.pc.dto.gx; + +import com.dsic.gj_erp.pc.Constant; +import com.dsic.gj_erp.pc.dto.工序产能; +import com.dsic.gj_erp.pc.dto.设备; +import lombok.Getter; +import lombok.Setter; + +import java.util.Map; + +@Getter +@Setter +public class 工序02抛丸 extends 工序产能 { + public 工序02抛丸(Constant.工序 工序, Map _设备) { + super(工序,_设备); + } + + @Override + public void 占用资源(double 所需产能) { + super.占用资源(1.0); + } +} diff --git a/src/main/java/com/dsic/gj_erp/pc/dto/gx/工序03理料.java b/src/main/java/com/dsic/gj_erp/pc/dto/gx/工序03理料.java new file mode 100644 index 0000000..ee5d9ed --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/pc/dto/gx/工序03理料.java @@ -0,0 +1,22 @@ +package com.dsic.gj_erp.pc.dto.gx; + +import com.dsic.gj_erp.pc.Constant; +import com.dsic.gj_erp.pc.dto.工序产能; +import com.dsic.gj_erp.pc.dto.设备; +import lombok.Getter; +import lombok.Setter; + +import java.util.Map; + +@Getter +@Setter +public class 工序03理料 extends 工序产能 { + public 工序03理料(Constant.工序 工序, Map _设备) { + super(工序,_设备); + } + + @Override + public void 占用资源(double 所需产能) { + super.占用资源(所需产能); + } +} diff --git a/src/main/java/com/dsic/gj_erp/pc/dto/gx/工序04划线.java b/src/main/java/com/dsic/gj_erp/pc/dto/gx/工序04划线.java new file mode 100644 index 0000000..d4c91df --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/pc/dto/gx/工序04划线.java @@ -0,0 +1,23 @@ +package com.dsic.gj_erp.pc.dto.gx; + +import com.dsic.gj_erp.bean.jcsj.EmSbjbb; +import com.dsic.gj_erp.pc.Constant; +import com.dsic.gj_erp.pc.dto.工序产能; +import com.dsic.gj_erp.pc.dto.设备; +import lombok.Getter; +import lombok.Setter; + +import java.util.Map; + +@Getter +@Setter +public class 工序04划线 extends 工序产能 { + public 工序04划线(Constant.工序 工序, Map _设备) { + super(工序,_设备); + } + + @Override + public void 占用资源(double 所需产能) { + super.占用资源(所需产能); + } +} diff --git a/src/main/java/com/dsic/gj_erp/pc/dto/gx/工序05切割.java b/src/main/java/com/dsic/gj_erp/pc/dto/gx/工序05切割.java new file mode 100644 index 0000000..f9b25ea --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/pc/dto/gx/工序05切割.java @@ -0,0 +1,23 @@ +package com.dsic.gj_erp.pc.dto.gx; + +import com.dsic.gj_erp.bean.jcsj.EmSbjbb; +import com.dsic.gj_erp.pc.Constant; +import com.dsic.gj_erp.pc.dto.工序产能; +import com.dsic.gj_erp.pc.dto.设备; +import lombok.Getter; +import lombok.Setter; + +import java.util.Map; + +@Getter +@Setter +public class 工序05切割 extends 工序产能 { + public 工序05切割(Constant.工序 工序, Map _设备) { + super(工序,_设备); + } + + @Override + public void 占用资源(double 所需产能) { + super.占用资源(所需产能); + } +} diff --git a/src/main/java/com/dsic/gj_erp/pc/dto/gx/工序07坡口.java b/src/main/java/com/dsic/gj_erp/pc/dto/gx/工序07坡口.java new file mode 100644 index 0000000..d190bc8 --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/pc/dto/gx/工序07坡口.java @@ -0,0 +1,23 @@ +package com.dsic.gj_erp.pc.dto.gx; + +import com.dsic.gj_erp.bean.jcsj.EmSbjbb; +import com.dsic.gj_erp.pc.Constant; +import com.dsic.gj_erp.pc.dto.工序产能; +import com.dsic.gj_erp.pc.dto.设备; +import lombok.Getter; +import lombok.Setter; + +import java.util.Map; + +@Getter +@Setter +public class 工序07坡口 extends 工序产能 { + public 工序07坡口(Constant.工序 工序, Map _设备) { + super(工序,_设备); + } + + @Override + public void 占用资源(double 所需产能) { + super.占用资源(所需产能); + } +} diff --git a/src/main/java/com/dsic/gj_erp/pc/dto/gx/工序08曲面.java b/src/main/java/com/dsic/gj_erp/pc/dto/gx/工序08曲面.java new file mode 100644 index 0000000..38e0362 --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/pc/dto/gx/工序08曲面.java @@ -0,0 +1,23 @@ +package com.dsic.gj_erp.pc.dto.gx; + +import com.dsic.gj_erp.bean.jcsj.EmSbjbb; +import com.dsic.gj_erp.pc.Constant; +import com.dsic.gj_erp.pc.dto.工序产能; +import com.dsic.gj_erp.pc.dto.设备; +import lombok.Getter; +import lombok.Setter; + +import java.util.Map; + +@Getter +@Setter +public class 工序08曲面 extends 工序产能 { + public 工序08曲面(Constant.工序 工序, Map _设备) { + super(工序,_设备); + } + + @Override + public void 占用资源(double 所需产能) { + super.占用资源(所需产能); + } +} diff --git a/src/main/java/com/dsic/gj_erp/pc/dto/gx/工序09打磨.java b/src/main/java/com/dsic/gj_erp/pc/dto/gx/工序09打磨.java new file mode 100644 index 0000000..c4f806f --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/pc/dto/gx/工序09打磨.java @@ -0,0 +1,23 @@ +package com.dsic.gj_erp.pc.dto.gx; + +import com.dsic.gj_erp.bean.jcsj.EmSbjbb; +import com.dsic.gj_erp.pc.Constant; +import com.dsic.gj_erp.pc.dto.工序产能; +import com.dsic.gj_erp.pc.dto.设备; +import lombok.Getter; +import lombok.Setter; + +import java.util.Map; + +@Getter +@Setter +public class 工序09打磨 extends 工序产能 { + public 工序09打磨(Constant.工序 工序, Map _设备) { + super(工序,_设备); + } + + @Override + public void 占用资源(double 所需产能) { + super.占用资源(所需产能); + } +} diff --git a/src/main/java/com/dsic/gj_erp/pc/dto/gx/工序10型材.java b/src/main/java/com/dsic/gj_erp/pc/dto/gx/工序10型材.java new file mode 100644 index 0000000..893f56a --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/pc/dto/gx/工序10型材.java @@ -0,0 +1,23 @@ +package com.dsic.gj_erp.pc.dto.gx; + +import com.dsic.gj_erp.bean.jcsj.EmSbjbb; +import com.dsic.gj_erp.pc.Constant; +import com.dsic.gj_erp.pc.dto.工序产能; +import com.dsic.gj_erp.pc.dto.设备; +import lombok.Getter; +import lombok.Setter; + +import java.util.Map; + +@Getter +@Setter +public class 工序10型材 extends 工序产能 { + public 工序10型材(Constant.工序 工序, Map _设备) { + super(工序,_设备); + } + + @Override + public void 占用资源(double 所需产能) { + super.占用资源(所需产能); + } +} diff --git a/src/main/java/com/dsic/gj_erp/pc/dto/gx/工序99未知.java b/src/main/java/com/dsic/gj_erp/pc/dto/gx/工序99未知.java new file mode 100644 index 0000000..04d4e9c --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/pc/dto/gx/工序99未知.java @@ -0,0 +1,22 @@ +package com.dsic.gj_erp.pc.dto.gx; + +import com.dsic.gj_erp.pc.Constant; +import com.dsic.gj_erp.pc.dto.工序产能; +import com.dsic.gj_erp.pc.dto.设备; +import lombok.Getter; +import lombok.Setter; + +import java.util.Map; + +@Getter +@Setter +public class 工序99未知 extends 工序产能 { + public 工序99未知(Constant.工序 工序, Map _设备) { + super(工序,_设备); + } + + @Override + public void 占用资源(double 所需产能) { + super.占用资源(所需产能); + } +} diff --git a/src/main/java/com/dsic/gj_erp/pc/dto/sb/设备01上料.java b/src/main/java/com/dsic/gj_erp/pc/dto/sb/设备01上料.java new file mode 100644 index 0000000..05247a0 --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/pc/dto/sb/设备01上料.java @@ -0,0 +1,8 @@ +package com.dsic.gj_erp.pc.dto.sb; + +import com.dsic.gj_erp.bean.jcsj.EmSbjbb; +import com.dsic.gj_erp.pc.dto.设备; + +public class 设备01上料 extends 设备 { + +} diff --git a/src/main/java/com/dsic/gj_erp/pc/dto/sb/设备02抛丸.java b/src/main/java/com/dsic/gj_erp/pc/dto/sb/设备02抛丸.java new file mode 100644 index 0000000..4dc4dcd --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/pc/dto/sb/设备02抛丸.java @@ -0,0 +1,7 @@ +package com.dsic.gj_erp.pc.dto.sb; + +import com.dsic.gj_erp.pc.dto.设备; + +public class 设备02抛丸 extends 设备 { + +} diff --git a/src/main/java/com/dsic/gj_erp/pc/dto/工序产能.java b/src/main/java/com/dsic/gj_erp/pc/dto/工序产能.java new file mode 100644 index 0000000..a39117e --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/pc/dto/工序产能.java @@ -0,0 +1,83 @@ +package com.dsic.gj_erp.pc.dto; + +import com.dsic.gj_erp.pc.Constant; +import com.dsic.gj_erp.pc.service.工序排产处理接口; +import lombok.Getter; +import lombok.Setter; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.stream.Collectors; + +@Getter +@Setter +public abstract class 工序产能 implements 工序排产处理接口 { + protected Constant.工序 工序; + protected double 白班时长; + protected double 二班时长; + protected double 产能; + protected double 占用=0.0; + protected int cd; + protected Constant.工序 CD所对应的工序;//需要根据对应工序进行计算cd + protected Map 设备; + protected List 资源占用图纸表; + + /** + * 默认构造 + */ + public 工序产能(Constant.工序 工序, Map 设备){ + this.工序=工序; + this.设备=设备; + this.白班时长=7; + this.产能=0; + 设备.values().forEach(item->{ + this.产能+=item.白班设备产能*this.白班时长+item.二班设备产能*this.二班时长; + }); + this.产能=Constant.工序产能.get(工序); + this.cd=Constant.工序CD.get(工序); + 资源占用图纸表=new ArrayList<>(); + } + + public 工序产能(Constant.工序 工序, Map 设备,double 白班时长,double 二班时长){ + this.工序=工序; + this.设备=设备; + this.白班时长=白班时长; + this.二班时长=二班时长; + this.产能=0; + 设备.values().forEach(item->{ + this.产能+=item.白班设备产能*this.白班时长+item.二班设备产能*this.二班时长; + }); + this.cd=Constant.工序CD.get(工序); + 资源占用图纸表=new ArrayList<>(); + } + + public 设备 获取可占用设备(double 所需产能){ + return this.设备.values().stream() + .filter(item -> this.判断设备是否可以占用(item.设备编号, 所需产能)).findFirst().orElse(null); + } + + public boolean 判断设备是否可以占用(String 设备编号,double 所需产能){ + 设备 _设备 = 设备.get(设备编号); + return _设备.占用+所需产能<=_设备.产能; + } + + public boolean 判断是否可以占用(double 所需产能){ + return this.占用+所需产能<=this.产能; + } + + public void 占用资源(double 所需产能){ + this.占用=this.占用+所需产能; + } + + public void 占用资源(String 占用源){ + this.资源占用图纸表.add(占用源); + } + + @Override + public void 占用设备(String 设备编号,String 占用源) { + 设备 _设备 = 设备.get(设备编号); + _设备.资源占用图纸表.add(占用源); + } +} diff --git a/src/main/java/com/dsic/gj_erp/pc/dto/排产结果.java b/src/main/java/com/dsic/gj_erp/pc/dto/排产结果.java new file mode 100644 index 0000000..a77f9b5 --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/pc/dto/排产结果.java @@ -0,0 +1,23 @@ +package com.dsic.gj_erp.pc.dto; + +import com.dsic.gj_erp.bean.jhgk.DmSygdxq; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public class 排产结果 { + private String date; + private Double bbsc=7.0;//白班时长 + private Double ybsc=0.0;//夜班时长 + private String gx;//工序;上料,抛丸,切割... + private String gw;//工位;几跨什么 + private Double gxde;//工序定额 + private String sbbh;//设备编码 + private String sbmc;//设备名称 + private String degs;//设备定额 + + List sygdxqList;//钢料需求 +} diff --git a/src/main/java/com/dsic/gj_erp/pc/dto/设备.java b/src/main/java/com/dsic/gj_erp/pc/dto/设备.java new file mode 100644 index 0000000..a057941 --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/pc/dto/设备.java @@ -0,0 +1,23 @@ +package com.dsic.gj_erp.pc.dto; + +import com.dsic.gj_erp.pc.Constant; +import lombok.Getter; +import lombok.Setter; + +import java.util.List; + +@Getter +@Setter +public abstract class 设备 { + protected String 设备编号; + protected String 设备名称; + protected double 白班设备产能; + protected double 二班设备产能; + protected double 产能; + protected double 占用=0.0; + protected List 资源占用图纸表; + + public 设备(Constant.设备产能 _设备产能){ + + } +} diff --git a/src/main/java/com/dsic/gj_erp/pc/dto/资源.java b/src/main/java/com/dsic/gj_erp/pc/dto/资源.java new file mode 100644 index 0000000..ffd57dc --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/pc/dto/资源.java @@ -0,0 +1,33 @@ +package com.dsic.gj_erp.pc.dto; + +import com.dsic.gj_erp.pc.Constant; +import lombok.Getter; +import lombok.Setter; + +import java.util.Map; +import java.util.Optional; + +@Getter +@Setter +public class 资源 { + private String date; + private Map 工序产能MAP; + + public void 占用资源(Constant.工序 工序,String 套料图号,double 产能消耗){ + 工序产能 工序产能 = 工序产能MAP.get(工序); + Optional.of(工序产能).ifPresent(it->{ + if (it.判断是否可以占用(产能消耗)){ + it.占用资源(套料图号,产能消耗); + } + }); + } + + public static 资源 of(String date,Map 工序产能MAP){ + 资源 资源 = new 资源(); + 资源.date=date; + 资源.工序产能MAP=工序产能MAP; + return 资源; + } + + private 资源(){} +} diff --git a/src/main/java/com/dsic/gj_erp/pc/service/工序排产处理接口.java b/src/main/java/com/dsic/gj_erp/pc/service/工序排产处理接口.java new file mode 100644 index 0000000..e5b8b5e --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/pc/service/工序排产处理接口.java @@ -0,0 +1,20 @@ +package com.dsic.gj_erp.pc.service; + +public interface 工序排产处理接口 { + + default void 占用资源(String 设备编号,String 图纸,double 所需产能){ + 占用资源(图纸,所需产能); + 占用设备(设备编号,图纸); + } + + default void 占用资源(String 图纸,double 所需产能){ + 占用资源(所需产能); + 占用资源(图纸); + } + + void 占用设备(String 设备编号,String 占用源); + + void 占用资源(double 所需产能); + + void 占用资源(String 占用源); +} diff --git a/src/main/java/com/dsic/gj_erp/pc/排产.java b/src/main/java/com/dsic/gj_erp/pc/排产.java new file mode 100644 index 0000000..4db7ac8 --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/pc/排产.java @@ -0,0 +1,58 @@ +package com.dsic.gj_erp.pc; + +import com.dsic.gj_erp.pc.dto.排产结果; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotNull; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Semaphore; + +@Getter +@Setter +public class 排产 { + private String from; + private String to; + private boolean complete; + List<排产结果> list; + private static Semaphore semaphore = new Semaphore(1); + + public static void execute(@NotNull String from, @NotNull String to) { + 排产 _排产=null; + try { + semaphore.acquire(); + _排产 = 排产.of(from,to); + DataFactory.排产(); + }catch (Exception e){ + e.printStackTrace(); + }finally { + if (_排产!=null){ + _排产.complete = true; + } + semaphore.release(); + } + + } + + private static 排产 of(@NotNull String from, @NotNull String to){ + if (!from.equals(Manager.from)||!to.equals(Manager.to)){ + 排产 排产 = new 排产(); + 排产.from=from; + 排产.to=to; + 排产.complete=false; + 排产.list=new ArrayList<>(); + Manager.排产=排产; + Manager.from = from; + Manager.to = to; + DataFactory.加载工厂日历(); + DataFactory.加载套料图工序对应关系(); + DataFactory.加载设备信息(); + DataFactory.加载工序设备对应关系(); + DataFactory.创建产能资源池(); + } + return Manager.排产; + } + + private 排产(){} +} diff --git a/src/main/java/com/dsic/gj_erp/service/jhgk/DmSygdxqService.java b/src/main/java/com/dsic/gj_erp/service/jhgk/DmSygdxqService.java index 8fd4361..009db9c 100644 --- a/src/main/java/com/dsic/gj_erp/service/jhgk/DmSygdxqService.java +++ b/src/main/java/com/dsic/gj_erp/service/jhgk/DmSygdxqService.java @@ -17,4 +17,6 @@ import java.util.List; public interface DmSygdxqService extends IService { void saveXzList(List list, String username, String day); void saveDzList(List list, String username, String day); + + List getXqWithBom(String from, String to); } diff --git a/src/main/java/com/dsic/gj_erp/service/jhgk/impl/DmSygdxqServiceImpl.java b/src/main/java/com/dsic/gj_erp/service/jhgk/impl/DmSygdxqServiceImpl.java index f15f9f1..271b61e 100644 --- a/src/main/java/com/dsic/gj_erp/service/jhgk/impl/DmSygdxqServiceImpl.java +++ b/src/main/java/com/dsic/gj_erp/service/jhgk/impl/DmSygdxqServiceImpl.java @@ -127,6 +127,11 @@ public class DmSygdxqServiceImpl extends ServiceImpl i } + @Override + public List getXqWithBom(String from, String to) { + return baseMapper.getXqWithBom(from,to); + } + //零件信息 public void correctSygdmx(String ch,String pl,String fd,String xqsj){ //根据:本次导入的三月需求期 提取BOM 生成三月需求零件信息 diff --git a/src/main/resources/mappers/jhgk/DmSygdxqMapper.xml b/src/main/resources/mappers/jhgk/DmSygdxqMapper.xml index 5307a26..77f541c 100644 --- a/src/main/resources/mappers/jhgk/DmSygdxqMapper.xml +++ b/src/main/resources/mappers/jhgk/DmSygdxqMapper.xml @@ -2,6 +2,53 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/mappers/xiaochi/CutPlanMapper.xml b/src/main/resources/mappers/xiaochi/CutPlanMapper.xml index cf6f1ce..ac0bac8 100644 --- a/src/main/resources/mappers/xiaochi/CutPlanMapper.xml +++ b/src/main/resources/mappers/xiaochi/CutPlanMapper.xml @@ -12,7 +12,7 @@ a.nest_cut_ho as 'nest_cut_ho' FROM tbl_nest_mast a WHERE - isnull(a.nest_ext_c02,'') != '' and a.nest_kakuyaku_date between #{st} and #{ed} + isnull(a.nest_ext_c02,'') != '' and a.nest_kakuyaku_date between #{st} and #{ed} and nest_cut_lengs>0 and not EXISTS( select b.czbh as nest_ext_c02,b.kw as nest_ext_c03 ,b.pl as nest_ext_c04 from pgd_qgjh b