From 1f8dc3f0b4ac0a56c86c1b2a47c71f64932c54d7 Mon Sep 17 00:00:00 2001 From: xiaoning <1097449274@qq.com> Date: Fri, 13 Oct 2023 11:19:41 +0800 Subject: [PATCH] wanghaodong --- .idea/workspace.xml | 330 ++++++++++++++++-- .../com/dsic/gj_erp/bean/jhgk/DmQfxq.java | 73 ++++ .../com/dsic/gj_erp/bean/jhgk/DmSygd.java | 269 ++++++++++---- .../com/dsic/gj_erp/bean/jhgk/DmSygdMx.java | 231 ++++++------ .../dsic/gj_erp/bean/jhgk/excel/QfExcel.java | 75 ++++ .../dsic/gj_erp/bean/jhgk/excel/SyExcel.java | 202 +++++++++++ .../controller/jhgk/DmQfxqController.java | 113 ++++++ .../controller/jhgk/DmSygdController.java | 21 +- .../controller/jhgk/DmSygdMxController.java | 46 ++- .../gj_erp/listeners/ExcelQFListener.java | 111 ++++++ .../gj_erp/listeners/ExcelSYListener.java | 107 ++++++ .../dsic/gj_erp/mapper/jhgk/DmQfxqMapper.java | 17 + .../dsic/gj_erp/mapper/jhgk/DmSygdMapper.java | 2 +- .../gj_erp/mapper/jhgk/DmSygdMxMapper.java | 2 +- .../gj_erp/service/jhgk/DmQfxqService.java | 23 ++ .../gj_erp/service/jhgk/DmSygdMxService.java | 9 +- .../gj_erp/service/jhgk/DmSygdService.java | 10 +- .../service/jhgk/impl/DmQfxqServiceImpl.java | 50 +++ .../jhgk/impl/DmSygdMxServiceImpl.java | 255 +++++++++++++- .../service/jhgk/impl/DmSygdServiceImpl.java | 97 ++++- .../resources/mappers/jhgk/DmQfxqMapper.xml | 20 ++ .../resources/mappers/jhgk/DmSygdMapper.xml | 112 ++++-- .../resources/mappers/jhgk/DmSygdMxMapper.xml | 64 +--- 23 files changed, 1915 insertions(+), 324 deletions(-) create mode 100644 src/main/java/com/dsic/gj_erp/bean/jhgk/DmQfxq.java create mode 100644 src/main/java/com/dsic/gj_erp/bean/jhgk/excel/QfExcel.java create mode 100644 src/main/java/com/dsic/gj_erp/bean/jhgk/excel/SyExcel.java create mode 100644 src/main/java/com/dsic/gj_erp/controller/jhgk/DmQfxqController.java create mode 100644 src/main/java/com/dsic/gj_erp/listeners/ExcelQFListener.java create mode 100644 src/main/java/com/dsic/gj_erp/listeners/ExcelSYListener.java create mode 100644 src/main/java/com/dsic/gj_erp/mapper/jhgk/DmQfxqMapper.java create mode 100644 src/main/java/com/dsic/gj_erp/service/jhgk/DmQfxqService.java create mode 100644 src/main/java/com/dsic/gj_erp/service/jhgk/impl/DmQfxqServiceImpl.java create mode 100644 src/main/resources/mappers/jhgk/DmQfxqMapper.xml diff --git a/.idea/workspace.xml b/.idea/workspace.xml index ea38b77..9c7b508 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -5,10 +5,199 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + @@ -31,47 +220,84 @@ + + - + + + - - - - - - - - - - - - - - - - - - - + - - + + + + + + + + + + + + - - - + + + + + + + + + + + + + @@ -126,6 +372,22 @@ + + + + + + + + + + + + + + + + 1695345779307 @@ -213,7 +475,6 @@ - @@ -227,13 +488,10 @@ - - - - - - - + + + + + \ No newline at end of file diff --git a/src/main/java/com/dsic/gj_erp/bean/jhgk/DmQfxq.java b/src/main/java/com/dsic/gj_erp/bean/jhgk/DmQfxq.java new file mode 100644 index 0000000..02d365f --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/bean/jhgk/DmQfxq.java @@ -0,0 +1,73 @@ +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 io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + *

+ * + *

+ * + * @author xn + * @since 2023-09-18 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="DmQfxq对象", description="") +public class DmQfxq implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "船名") + @TableField("DC_CH") + private String dcCh; + + @ApiModelProperty(value = "批量") + @TableField("DC_PL") + private String dcPl; + + @ApiModelProperty(value = "分段") + @TableField("DC_FD") + private String dcFd; + + @ApiModelProperty(value = "配送场地") + private String pscd; + + @ApiModelProperty(value = "车间主管") + private String cjzg; + + @ApiModelProperty(value = "大板") + private String db; + + @ApiModelProperty(value = "型材") + private String xc; + + @ApiModelProperty(value = "T型材") + private String txc; + + @ApiModelProperty(value = "备注") + private String bz; + + @ApiModelProperty(value = "状态") + private String zt; + + @TableId(value = "id", type = IdType.ASSIGN_UUID) + private String id; + + @ApiModelProperty(value = "编制人员") + private String bzry; + @ApiModelProperty(value = "编制日期") + private String bzrq; + @ApiModelProperty(value = "审核人员") + private String shry; + @ApiModelProperty(value = "审核日期") + private String shrq; + +} diff --git a/src/main/java/com/dsic/gj_erp/bean/jhgk/DmSygd.java b/src/main/java/com/dsic/gj_erp/bean/jhgk/DmSygd.java index 9436670..797b8aa 100644 --- a/src/main/java/com/dsic/gj_erp/bean/jhgk/DmSygd.java +++ b/src/main/java/com/dsic/gj_erp/bean/jhgk/DmSygd.java @@ -1,6 +1,7 @@ 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 io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; @@ -8,6 +9,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; +import java.util.List; /** *

@@ -15,7 +17,7 @@ import java.io.Serializable; *

* * @author xn - * @since 2023-09-15 + * @since 2023-10-09 */ @Data @EqualsAndHashCode(callSuper = false) @@ -24,122 +26,235 @@ public class DmSygd implements Serializable { private static final long serialVersionUID=1L; - @ApiModelProperty(value = "产品") - private String dcCh1; + @ApiModelProperty(value = "船号") + @TableField("DC_CH") + private String dcCh; - @ApiModelProperty(value = "目标船只") - private String dcCh2; - - @ApiModelProperty(value = "本船只") - private String dcCh3; + @ApiModelProperty(value = "分段号") + @TableField("DC_FD") + private String dcFd; - @ApiModelProperty(value = "批量") + @ApiModelProperty(value = "批量号") + @TableField("DC_PL") private String dcPl; - @ApiModelProperty(value = "分段") - private String dcFd; + @ApiModelProperty(value = "钢加大组结束") + private String gjjsDz; + + @ApiModelProperty(value = "钢加小组结束") + private String gjjsXz; + + @ApiModelProperty(value = "钢加开始") + private String gjks; + + @ApiModelProperty(value = "套料图接收") + private String jsqTlt; + + @ApiModelProperty(value = "板材领取表接收") + private String jsqLqb; + + @ApiModelProperty(value = "订货清单号") + private String dhqd; + + @ApiModelProperty(value = "状态;0编辑 1提交 2下发 3完成 4拖期") + private String gdZt="0"; + + @ApiModelProperty(value = "订货板数") + private Double orderBs; - @ApiModelProperty(value = "板数") - private Double bs; + @ApiModelProperty(value = "到货板数") + private Double arrivalBs; - @ApiModelProperty(value = "到货数量") - private Double dhsl; + @ApiModelProperty(value = "套料图板数") + private int tltSl; - @ApiModelProperty(value = "在途数量") - private Double ztsl; + @ApiModelProperty(value = "上料张数") + private int slSl; - @ApiModelProperty(value = "生产下发期") - private String scxfq; + @ApiModelProperty(value = "上料时间") + private String slSj; + + @ApiModelProperty(value = "抛丸数量") + private int pwSl; + + @ApiModelProperty(value = "抛丸时间") + private String pwSj; @ApiModelProperty(value = "型材抛丸") - private String xcpw; + private Double xcpwSl; + + @ApiModelProperty(value = "型材抛丸时间") + private String xcpwSj; + + @ApiModelProperty(value = "1跨平直大板(大组)") + private int n1ad; + + @ApiModelProperty(value = "加工时间") + private String n1adSj; + + @ApiModelProperty(value = "1跨平直大板(小组)") + private int n1ax; + + @ApiModelProperty(value = "加工时间") + private String n1axSj; + + @ApiModelProperty(value = "1跨进线板(大组)") + private int n1ld; + + @ApiModelProperty(value = "加工时间") + private String n1ldSj; + + @ApiModelProperty(value = "2跨超长超宽板(大组)") + private int n2bd; - @ApiModelProperty(value = "根数") - private Double gs; + @ApiModelProperty(value = "加工时间") + private String n2bdSj; - @ApiModelProperty(value = "抛丸") - private String pw; + @ApiModelProperty(value = "2跨超长超宽板(小组)") + private int n2bx; - @ApiModelProperty(value = "坡口切割结束") - private String pkjs1; + @ApiModelProperty(value = "加工时间") + private String n2bxSj; - @ApiModelProperty(value = "二垮数控板数") - private Double skbs1; + @ApiModelProperty(value = "2跨超长超宽曲板(小组)") + private int n2cx; - @ApiModelProperty(value = "数控切割开始") - private String skks1; + @ApiModelProperty(value = "加工时间") + private String n2cxSj; - @ApiModelProperty(value = "坡口长度") - private Double pkcd1; + @ApiModelProperty(value = "2跨超长超宽曲板(大组)") + private int n2cd; - @ApiModelProperty(value = "坡口切割结束") - private String pkjs2; + @ApiModelProperty(value = "加工时间") + private String n2cdSj; - @ApiModelProperty(value = "三垮数控板数") - private Double skbs2; + @ApiModelProperty(value = "2跨T型材腹板(小组)") + private int n2tx; - @ApiModelProperty(value = "数控切割开始") - private String skks2; + @ApiModelProperty(value = "加工时间") + private String n2txSj; - @ApiModelProperty(value = "坡口长度") - private Double pkcd2; + @ApiModelProperty(value = "2跨T型材腹板(大组)") + private int n2td; - @ApiModelProperty(value = "坡口切割结束") - private String pkjs3; + @ApiModelProperty(value = "加工时间") + private String n2tdSj; - @ApiModelProperty(value = "三垮平铁板数") - private Double ptbs; + @ApiModelProperty(value = "2跨激光切割板(小组)") + private int n2jx; - @ApiModelProperty(value = "平铁切割开始") - private String ptks; + @ApiModelProperty(value = "加工时间") + private String n2jxSj; - @ApiModelProperty(value = "平铁切割结束") - private String ptjs; + @ApiModelProperty(value = "2跨激光切割板(大组)") + private int n2jd; - @ApiModelProperty(value = "曲平铁转结束") - private String qptzjs; + @ApiModelProperty(value = "加工时间") + private String n2jdSj; - @ApiModelProperty(value = "曲平铁结束") - private String qptjs; + @ApiModelProperty(value = "3跨曲板(小组)") + private int n3cx; - @ApiModelProperty(value = "曲外板结束") - private String qwbjs; + @ApiModelProperty(value = "加工时间") + private String n3cxSj; - @ApiModelProperty(value = "组立") - private String zl; + @ApiModelProperty(value = "3跨曲板(大组)") + private int n3cd; - @ApiModelProperty(value = "数控 板数") - private Double skbs3; + @ApiModelProperty(value = "加工时间") + private String n3cdSj; - @ApiModelProperty(value = "数控切割开始") - private String skks3; + @ApiModelProperty(value = "3跨厚板(小组)") + private int n3hx; - @ApiModelProperty(value = "坡口长度") - private Double pkcd3; + @ApiModelProperty(value = "加工时间") + private String n3hxSj; - @ApiModelProperty(value = "坡口切割结束") - private String pkjs4; + @ApiModelProperty(value = "3跨厚板(大组)") + private int n3hd; - @ApiModelProperty(value = "面板挤边") - private String mbjb; + @ApiModelProperty(value = "加工时间") + private String n3hdSj; - @ApiModelProperty(value = "七垮型材米数") - private Double xcms; + @ApiModelProperty(value = "4跨普通板(小组)") + private int n4px; - @ApiModelProperty(value = "型材面板") - private String xcmb; + @ApiModelProperty(value = "加工时间") + private String n4pxSj; - @ApiModelProperty(value = "分段需求") - private String fdxqq; + @ApiModelProperty(value = "4跨普通板(大组)") + private int n4pd; - @ApiModelProperty(value = "光电 结束") - private String gdjs; + @ApiModelProperty(value = "加工时间") + private String n4pdSj; - @ApiModelProperty(value = "备注") - private String bz; + @ApiModelProperty(value = "4跨普通板(机器人)") + private int n4xx; + @ApiModelProperty(value = "加工时间") + private String n4xxSj; + + @ApiModelProperty(value = "光电") + private int n8gx; + + @ApiModelProperty(value = "加工时间") + private String n8gxSj; + + @ApiModelProperty(value = "7跨型板(小组)") + private Double x7xx; + + @ApiModelProperty(value = "加工时间") + private String x7xxSj; + + @ApiModelProperty(value = "7跨型板(大组)") + private Double x7xd; + + @ApiModelProperty(value = "加工时间") + private String x7xdSj; + + @ApiModelProperty(value = "2跨T型材面板(小组)") + private int s2tx; + + @ApiModelProperty(value = "加工时间") + private String s2txSj; + + @ApiModelProperty(value = "2跨T型材面板(大组)") + private int s2td; + + @ApiModelProperty(value = "加工时间") + private String s2tdSj; + + @ApiModelProperty(value = "3跨平铁(小组)") + private int s3px; + + @ApiModelProperty(value = "加工时间") + private String s3pxSj; + + @ApiModelProperty(value = "3跨平铁(大组)") + private int s3pd; + + @ApiModelProperty(value = "加工时间") + private String s3pdSj; + + @ApiModelProperty(value = "3跨平铁(机器人)") + private int s3xx; + + @ApiModelProperty(value = "加工时间") + private String s3xxSj; + + @ApiModelProperty(value = "计划大组完成时间") + private String jhwgDz; + + @ApiModelProperty(value = "计划小组完成时间") + private String jhwgXz; + + @ApiModelProperty(value = "数据来源船") + private String sjlyCh; + @ApiModelProperty(value = "数据更新时间") + private String gxsj; @TableId(value = "id", type = IdType.ASSIGN_UUID) private String id; - + @TableField(exist = false) + private List mxList; } diff --git a/src/main/java/com/dsic/gj_erp/bean/jhgk/DmSygdMx.java b/src/main/java/com/dsic/gj_erp/bean/jhgk/DmSygdMx.java index 8363f2d..cc84bda 100644 --- a/src/main/java/com/dsic/gj_erp/bean/jhgk/DmSygdMx.java +++ b/src/main/java/com/dsic/gj_erp/bean/jhgk/DmSygdMx.java @@ -9,6 +9,7 @@ import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; +import java.math.BigDecimal; /** *

@@ -16,7 +17,7 @@ import java.io.Serializable; *

* * @author xn - * @since 2023-09-15 + * @since 2023-10-09 */ @Data @EqualsAndHashCode(callSuper = false) @@ -26,188 +27,182 @@ public class DmSygdMx implements Serializable { private static final long serialVersionUID=1L; @ApiModelProperty(value = "产品") - private String dcCh1; - - @ApiModelProperty(value = "目标船只") - private String dcCh2; + private String dcCh; - @ApiModelProperty(value = "本船只") - private String dcCh3; + @ApiModelProperty(value = "数据来源船") + private String dcCh1; @ApiModelProperty(value = "批量") private String dcPl; - @ApiModelProperty(value = "分段") - private String dcFd; - - @ApiModelProperty(value = "类型") + @ApiModelProperty(value = "领取类型") @TableField("LQLB") private String lqlb; - @ApiModelProperty(value = "板数") - private Double bs; - @ApiModelProperty(value = "套料图号") private String tzbh; - @ApiModelProperty(value = "集团计划期") - private String jtjhq; - - @ApiModelProperty(value = "分段需求期") - private String fdxqq; - @ApiModelProperty(value = "规格") private String wpgg; @ApiModelProperty(value = "材质") private String wpxh; - @ApiModelProperty(value = "到货数量") - private Double dhsl; - - @ApiModelProperty(value = "在途数量") - private Double ztsl; - - @ApiModelProperty(value = "生产下发期") - private String scxfq; + @ApiModelProperty(value = "划线长度(米)") + private BigDecimal hxcd; - @ApiModelProperty(value = "长度(毫米)") - private Double cd; + @ApiModelProperty(value = "切割长度(米)") + private BigDecimal qgcd; - @ApiModelProperty(value = "面积(平方米)") - private Double mj; + @ApiModelProperty(value = "曲标识") + private String qbs; - @ApiModelProperty(value = "抛丸计划完工") - private String jhwgPw; + @ApiModelProperty(value = "坡口类型") + private String pklx; - @ApiModelProperty(value = "施工单位") - @TableField("ZZCJ") - private String zzcj; + @ApiModelProperty(value = "坡口长度") + private Double pkcd; - @ApiModelProperty(value = "理料") - private String llrq; + @ApiModelProperty(value = "零件数量") + private BigDecimal ljsl; - @ApiModelProperty(value = "划线长度(米)") - private Double hxcd; + @ApiModelProperty(value = "组立") + private String zl; - @ApiModelProperty(value = "切割长度(米)") - private Double qgcd; + @ApiModelProperty(value = "加工类型") + private String lx; - @ApiModelProperty(value = "板厚(毫米)") - private Double bh; + @ApiModelProperty(value = "型材米数") + private BigDecimal xcms; - @ApiModelProperty(value = "曲标识") - private String qbs; + @ApiModelProperty(value = "跨位") + private String kw; - @ApiModelProperty(value = "坡口标识") - private String pkbs; + @ApiModelProperty(value = "上料日期") + private String slrq; - @ApiModelProperty(value = "打磨标识") - private String dmbs; + @ApiModelProperty(value = "上料人员") + private String slry; - @ApiModelProperty(value = "一垮龙门板数") - private Double lm1k; + @ApiModelProperty(value = "抛丸") + private String pw; - @ApiModelProperty(value = "一垮龙门完工") - private String wg1klm; + @ApiModelProperty(value = "抛丸人员") + private String pwry; - @ApiModelProperty(value = "一垮数控板数") - private Double lksk; + @ApiModelProperty(value = "抛丸日期") + private String pwrq; - @ApiModelProperty(value = "一垮数控完工") - private String wgLksk; + @ApiModelProperty(value = "划线设备") + private String hxsb; - @ApiModelProperty(value = "坡口长度") - private Double pkcd; + @ApiModelProperty(value = "划线人员") + private String hxry; - @ApiModelProperty(value = "坡口计划完工") - private String jhwgPk; + @ApiModelProperty(value = "划线日期") + private String hxrq; - @ApiModelProperty(value = "二垮数控板数") - private Double lm2k; + @ApiModelProperty(value = "切割设备") + private String qgsb; - @ApiModelProperty(value = "二垮数控完工") - private String wg2klm; + @ApiModelProperty(value = "切割人员") + private String qgry; - @ApiModelProperty(value = "坡口长度") - private Double pkcd2; + @ApiModelProperty(value = "切割日期") + private String qgrq; - @ApiModelProperty(value = "坡口计划完工") - private String jhwgPk2; + @ApiModelProperty(value = "打磨长度") + private Double dmcd; - @ApiModelProperty(value = "三垮数控板数") - private Double lm3k; + @ApiModelProperty(value = "打磨设备") + private String dmsb; - @ApiModelProperty(value = "三垮数控完工") - private String wg3klm; + @ApiModelProperty(value = "打磨人员") + private String dmry; - @ApiModelProperty(value = "坡口长度") - private Double pkcd3; + @ApiModelProperty(value = "打磨日期") + private String dmrq; - @ApiModelProperty(value = "坡口计划完工") - private String jhwgPk3; + @ApiModelProperty(value = "坡口设备") + private String pksb; - @ApiModelProperty(value = "三垮平铁板数") - private Double pt3k; + @ApiModelProperty(value = "坡口人员") + private String pkry; - @ApiModelProperty(value = "三垮平铁完工") - private String wg3kpt; + @ApiModelProperty(value = "坡口日期") + private String pkrq; - @ApiModelProperty(value = "零件面积") - private Double ljmj; + @ApiModelProperty(value = "抛丸设备") + private String pwsb; + @ApiModelProperty(value = "分段号") + @TableField("DC_FD") + private String dcFd; - @ApiModelProperty(value = "零件数量") - private Double ljsl; + @ApiModelProperty(value = "钢加大组结束") + private String gjjsDz; - @ApiModelProperty(value = "曲平铁转结束") - private String qptzjs; + @ApiModelProperty(value = "钢加小组结束") + private String gjjsXz; - @ApiModelProperty(value = "曲平铁结束") - private String qptjs; + @ApiModelProperty(value = "套料图接收") + private String jsqTlt; - @ApiModelProperty(value = "曲外板结束") - private String qwbjs; + @ApiModelProperty(value = "领取表接收") + private String jsqLqb; - @ApiModelProperty(value = "组立") - private String zl; + @ApiModelProperty(value = "订货清单号") + private String dhqd; - @ApiModelProperty(value = "数控 板数") - private Double skbs3; + @ApiModelProperty(value = "订货数量") + private Double orderBs; - @ApiModelProperty(value = "数控切割开始") - private String skks3; + @ApiModelProperty(value = "到货数量") + private Double arrivalBs; - @ApiModelProperty(value = "坡口长度") - private Double pkcd4; + @ApiModelProperty(value = "区域") + private String qy; - @ApiModelProperty(value = "坡口切割结束") - private String pkjs4; + @ApiModelProperty(value = "矫正标识") + private String jzbs; - @ApiModelProperty(value = "面板挤边") - private String mbjb; + @ApiModelProperty(value = "矫正设备") + private String jzsb; - @ApiModelProperty(value = "七垮型材米数") - private Double xcms; + @ApiModelProperty(value = "矫正人员") + private String jzry; - @ApiModelProperty(value = "型材面板") - private String xcmb; + @ApiModelProperty(value = "曲加工设备") + private String qjgsb; - @ApiModelProperty(value = "分段需求") - private String fdxq; + @ApiModelProperty(value = "曲加工人员") + private String qjgry; - @ApiModelProperty(value = "光电 结束") - private String gdjs; + @ApiModelProperty(value = "曲加工日期") + private String qjgrq; - @ApiModelProperty(value = "备注") - private String bz; + @ApiModelProperty(value = "本船号") + @TableField("dcCh2") + private String dcCh2; - @ApiModelProperty(value = "状态") - private String zt; + @ApiModelProperty(value = "钢加开始") + private String gjks; + + @ApiModelProperty(value = "时间更新时间") + private String gxsj; + @ApiModelProperty(value = "结束时间") + private String jssj; + @ApiModelProperty(value = "矫正日期") + private String jzrq; + @ApiModelProperty(value = "划线空程长度") + private String hxcdCk; + @ApiModelProperty(value = "切割空程长度") + private String qgcdCk; + @ApiModelProperty(value = "状态;0编辑 1提交 2下发 3完成 4拖期") + private String zt="0"; private String parentId; @TableId(value = "id", type = IdType.ASSIGN_UUID) private String id; - } diff --git a/src/main/java/com/dsic/gj_erp/bean/jhgk/excel/QfExcel.java b/src/main/java/com/dsic/gj_erp/bean/jhgk/excel/QfExcel.java new file mode 100644 index 0000000..6f49bcb --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/bean/jhgk/excel/QfExcel.java @@ -0,0 +1,75 @@ +package com.dsic.gj_erp.bean.jhgk.excel; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.format.DateTimeFormat; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + *

+ * + *

+ * + * @author xn + * @since 2023-09-18 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="DmQfxq对象", description="") +public class QfExcel implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "船名") + @ExcelProperty(index = 0) + private String dcCh; + + @ApiModelProperty(value = "批量") + @ExcelProperty(index = 1) + private String dcPl; + + @ApiModelProperty(value = "分段") + @ExcelProperty(index = 2) + private String dcFd; + + @ApiModelProperty(value = "配送场地") + @ExcelProperty(index = 3) + private String pscd; + + @ApiModelProperty(value = "车间主管") + @ExcelProperty(index = 4) + private String cjzg; + + @ApiModelProperty(value = "大板") + @ExcelProperty(index = 5) + @DateTimeFormat("yyyy/MM/dd") + private String db; + + @ApiModelProperty(value = "型材") + @ExcelProperty(index = 6) + @DateTimeFormat("yyyy/MM/dd") + private String xc; + + @ApiModelProperty(value = "T型材") + @ExcelProperty(index = 7) + @DateTimeFormat("yyyy/MM/dd") + private String txc; + + @ApiModelProperty(value = "备注") + @ExcelProperty(index = 8) + private String bz; + + @ApiModelProperty(value = "状态") + private String zt; + + @TableId(value = "id", type = IdType.ASSIGN_UUID) + private String id; + + +} diff --git a/src/main/java/com/dsic/gj_erp/bean/jhgk/excel/SyExcel.java b/src/main/java/com/dsic/gj_erp/bean/jhgk/excel/SyExcel.java new file mode 100644 index 0000000..30b59e9 --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/bean/jhgk/excel/SyExcel.java @@ -0,0 +1,202 @@ +package com.dsic.gj_erp.bean.jhgk.excel; + +import com.alibaba.excel.annotation.ExcelProperty; +import com.alibaba.excel.annotation.format.DateTimeFormat; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.io.Serializable; + +/** + *

+ * + *

+ * + * @author xn + * @since 2023-09-15 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@ApiModel(value="DmSygd对象", description="") +public class SyExcel implements Serializable { + + private static final long serialVersionUID=1L; + + @ApiModelProperty(value = "产品") + @ExcelProperty(index = 1) + private String dcCh1; + + @ApiModelProperty(value = "目标船只") + @ExcelProperty(index = 2) + private String dcCh2; + + @ApiModelProperty(value = "本船只") + @ExcelProperty(index = 3) + private String dcCh3; + + @ApiModelProperty(value = "批量") + @ExcelProperty(index = 4) + private String dcPl; + + @ApiModelProperty(value = "分段") + @ExcelProperty(index = 5) + private String dcFd; + + @ApiModelProperty(value = "板数") + @ExcelProperty(index = 6) + private Double bs; + + @ApiModelProperty(value = "到货数量") + @ExcelProperty(index = 7) + private Double dhsl; + + @ApiModelProperty(value = "在途数量") + @ExcelProperty(index = 8) + private Double ztsl; + + @ApiModelProperty(value = "生产下发期") + @ExcelProperty(index = 9) + @DateTimeFormat("yyyy/MM/dd") + private String scxfq; + + @ApiModelProperty(value = "型材抛丸") + @ExcelProperty(index = 10) + private String xcpw; + + @ApiModelProperty(value = "根数") + @ExcelProperty(index = 11) + private Double gs; + + @ApiModelProperty(value = "抛丸") + @ExcelProperty(index = 12) + private String pw; + + @ApiModelProperty(value = "坡口切割结束") + @ExcelProperty(index = 13) + @DateTimeFormat("yyyy/MM/dd") + private String pkjs1; + + @ApiModelProperty(value = "二垮数控板数") + @ExcelProperty(index = 14) + private String skbs1; + + @ApiModelProperty(value = "数控切割开始") + @ExcelProperty(index = 15) + @DateTimeFormat("yyyy/MM/dd") + private String skks1; + + @ApiModelProperty(value = "坡口长度") + @ExcelProperty(index = 16) + private Double pkcd1; + + @ApiModelProperty(value = "坡口切割结束") + @ExcelProperty(index = 17) + @DateTimeFormat("yyyy/MM/dd") + private String pkjs2; + + @ApiModelProperty(value = "三垮数控板数") + @ExcelProperty(index = 18) + private String skbs2; + + @ApiModelProperty(value = "数控切割开始") + @ExcelProperty(index = 19) + @DateTimeFormat("yyyy/MM/dd") + private String skks2; + + @ApiModelProperty(value = "坡口长度") + @ExcelProperty(index = 20) + private Double pkcd2; + + @ApiModelProperty(value = "坡口切割结束") + @ExcelProperty(index = 21) + @DateTimeFormat("yyyy/MM/dd") + private String pkjs3; + + @ApiModelProperty(value = "三垮平铁板数") + @ExcelProperty(index = 22) + private String ptbs; + + @ApiModelProperty(value = "平铁切割开始") + @ExcelProperty(index = 23) + @DateTimeFormat("yyyy/MM/dd") + private String ptks; + + @ApiModelProperty(value = "平铁切割结束") + @ExcelProperty(index = 24) + @DateTimeFormat("yyyy/MM/dd") + private String ptjs; + + @ApiModelProperty(value = "曲平铁转结束") + @ExcelProperty(index = 25) + @DateTimeFormat("yyyy/MM/dd") + private String qptzjs; + + @ApiModelProperty(value = "曲平铁结束") + @ExcelProperty(index = 26) + @DateTimeFormat("yyyy/MM/dd") + private String qptjs; + + @ApiModelProperty(value = "曲外板结束") + @ExcelProperty(index = 27) + @DateTimeFormat("yyyy/MM/dd") + private String qwbjs; + + @ApiModelProperty(value = "组立") + @ExcelProperty(index = 28) + @DateTimeFormat("yyyy/MM/dd") + private String zl; + + @ApiModelProperty(value = "数控板数") + @ExcelProperty(index = 29) + private String skbs3; + + @ApiModelProperty(value = "数控切割开始") + @ExcelProperty(index = 30) + @DateTimeFormat("yyyy/MM/dd") + private String skks3; + + @ApiModelProperty(value = "坡口长度") + @ExcelProperty(index = 31) + private Double pkcd3; + + @ApiModelProperty(value = "坡口切割结束") + @ExcelProperty(index = 32) + @DateTimeFormat("yyyy/MM/dd") + private String pkjs4; + + @ApiModelProperty(value = "面板挤边") + @ExcelProperty(index = 33) + @DateTimeFormat("yyyy/MM/dd") + private String mbjb; + + @ApiModelProperty(value = "七垮型材米数") + @ExcelProperty(index = 34) + private Double xcms; + + @ApiModelProperty(value = "型材面板") + @ExcelProperty(index = 35) + private String xcmb; + + @ApiModelProperty(value = "分段需求") + @ExcelProperty(index = 36) + @DateTimeFormat("yyyy/MM/dd") + private String fdxqq; + + @ApiModelProperty(value = "光电 结束") + @ExcelProperty(index = 37) + @DateTimeFormat("yyyy/MM/dd") + private String gdjs; + + @ApiModelProperty(value = "备注") + @ExcelProperty(index = 38) + private String bz; + + @TableId(value = "id", type = IdType.ASSIGN_UUID) + private String id; + + +} diff --git a/src/main/java/com/dsic/gj_erp/controller/jhgk/DmQfxqController.java b/src/main/java/com/dsic/gj_erp/controller/jhgk/DmQfxqController.java new file mode 100644 index 0000000..3d9a865 --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/controller/jhgk/DmQfxqController.java @@ -0,0 +1,113 @@ +package com.dsic.gj_erp.controller.jhgk; + + +import cn.hutool.core.util.StrUtil; +import com.alibaba.excel.EasyExcel; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.dsic.gj_erp.annotation.AuthFunction; +import com.dsic.gj_erp.bean.ResultBean; +import com.dsic.gj_erp.bean.jcsj.DmCbxxp; +import com.dsic.gj_erp.bean.jhgk.DmQfxq; +import com.dsic.gj_erp.bean.jhgk.excel.QfExcel; +import com.dsic.gj_erp.exception.CustomException; +import com.dsic.gj_erp.listeners.ExcelQFListener; +import com.dsic.gj_erp.service.jcsj.DmCbxxpService; +import com.dsic.gj_erp.service.jhgk.DmQfxqService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; + +/** + *

+ * 前端控制器 + *

+ * + * @author xn + * @since 2023-09-18 + */ +@RestController +@RequestMapping("/dmQfxq") +public class DmQfxqController { + + @Autowired + DmQfxqService service; + @Autowired + DmCbxxpService cbxxpService; + //查询 + @RequestMapping("/getList") + @AuthFunction + public ResultBean getList(@RequestBody DmQfxq qfxq){ + List list=service.list(new QueryWrapper() + .eq(StrUtil.isNotEmpty(qfxq.getDcCh()),"DC_CH",qfxq.getDcCh()) + .eq(StrUtil.isNotEmpty(qfxq.getZt()),"zt",qfxq.getZt()) + .eq(StrUtil.isNotEmpty(qfxq.getDcPl()),"DC_PL",qfxq.getDcPl())); + return new ResultBean(list); + } + + @RequestMapping("/getCzxx") + @AuthFunction + public ResultBean getCzxx(){ + List list= cbxxpService.list(new QueryWrapper().select("cbbm","cbmc").orderBy(true, true, "cbbm")); + return new ResultBean(list); + } + //导入 + @PostMapping("/upload") + @AuthFunction + @ResponseBody + public ResultBean uploadQf(@RequestParam("file") MultipartFile file , String czbh, HttpServletRequest req) throws Exception, CustomException { + + ExcelQFListener objectListener = new ExcelQFListener(); + EasyExcel.read(file.getInputStream(), QfExcel.class, objectListener).sheet(0).headRowNumber(1).doRead(); + List objList = objectListener.getObjectList(); + service.uploadQf(objList,czbh,req); + return new ResultBean(); + } + + //保存 + @RequestMapping("/save") + @AuthFunction + public ResultBean save(@RequestBody List qfxqs){ + service.saveBatch(qfxqs); + return new ResultBean(); + } + //删除 + @RequestMapping("/remove") + @AuthFunction + public ResultBean remove(@RequestBody List qfxqs){ + service.removeByIds(qfxqs); + return new ResultBean(); + } + //提交/退回 + @RequestMapping("/qfxqTJ") + @AuthFunction + public ResultBean qfxqTJ(@RequestBody List qfxqs){ + qfxqs.forEach(q->{ + if (q.getZt().equals("0")) { + q.setZt("1"); + return; + } + if (q.getZt().equals("1")){ + q.setZt("0"); + } + }); + service.updateBatchById(qfxqs); + return new ResultBean(); + } + //审核 + @RequestMapping("/qfxqSH") + @AuthFunction + public ResultBean qfxqSH(@RequestBody List qfxqs){ + qfxqs.forEach(q->{ + if (q.getZt().equals("1")) { + q.setZt("2"); + } + }); + service.updateBatchById(qfxqs); + return new ResultBean(); + } + + +} diff --git a/src/main/java/com/dsic/gj_erp/controller/jhgk/DmSygdController.java b/src/main/java/com/dsic/gj_erp/controller/jhgk/DmSygdController.java index 4264161..5a20957 100644 --- a/src/main/java/com/dsic/gj_erp/controller/jhgk/DmSygdController.java +++ b/src/main/java/com/dsic/gj_erp/controller/jhgk/DmSygdController.java @@ -1,20 +1,39 @@ package com.dsic.gj_erp.controller.jhgk; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.dsic.gj_erp.annotation.AuthFunction; +import com.dsic.gj_erp.bean.ResultBean; +import com.dsic.gj_erp.bean.jhgk.DmQfxq; +import com.dsic.gj_erp.bean.jhgk.DmSygd; +import com.dsic.gj_erp.service.jhgk.DmSygdService; +import com.dsic.gj_erp.service.sy.SYService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import javax.annotation.Resource; +import java.util.List; + /** *

* 前端控制器 *

* * @author xn - * @since 2023-09-15 + * @since 2023-10-09 */ @RestController @RequestMapping("/dmSygd") public class DmSygdController { + @Resource + DmSygdService service; + + + + } diff --git a/src/main/java/com/dsic/gj_erp/controller/jhgk/DmSygdMxController.java b/src/main/java/com/dsic/gj_erp/controller/jhgk/DmSygdMxController.java index 0af45c7..be8388c 100644 --- a/src/main/java/com/dsic/gj_erp/controller/jhgk/DmSygdMxController.java +++ b/src/main/java/com/dsic/gj_erp/controller/jhgk/DmSygdMxController.java @@ -1,20 +1,64 @@ package com.dsic.gj_erp.controller.jhgk; +import com.dsic.gj_erp.annotation.AuthFunction; +import com.dsic.gj_erp.bean.ResultBean; +import com.dsic.gj_erp.bean.jhgk.DmSygd; +import com.dsic.gj_erp.bean.jhgk.DmSygdMx; +import com.dsic.gj_erp.service.jhgk.DmSygdMxService; +import com.dsic.gj_erp.service.sy.SYService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.List; + /** *

* 前端控制器 *

* * @author xn - * @since 2023-09-15 + * @since 2023-10-09 */ @RestController @RequestMapping("/dmSygdMx") public class DmSygdMxController { + @Autowired + private DmSygdMxService service; + + @Resource + SYService syService; + @RequestMapping("/getList") + @AuthFunction + public ResultBean getList(@RequestBody DmSygd sygd){ + String[] str=new String[50]; + String[] str1=new String[50]; + for (int i = 0; i < 50; i++) { + str[i]=syService.f_getpjh("DM", "SYSTEM", "BCHX"); + str1[i]=syService.f_getpjh("DM", "SYSTEM", "CLDE"); + } + for (String s:str){ + System.out.println(s); + } + + return new ResultBean(); + } + @RequestMapping("/sygdPC") + @AuthFunction + public ResultBean sygdPC(){ + return new ResultBean(service.sygdPC()); + } + + @RequestMapping("/saveByDcch") + @AuthFunction + public ResultBean saveByDcch(@RequestBody HashMap> map ){ + return new ResultBean(service.saveByDcch(map)); + } } diff --git a/src/main/java/com/dsic/gj_erp/listeners/ExcelQFListener.java b/src/main/java/com/dsic/gj_erp/listeners/ExcelQFListener.java new file mode 100644 index 0000000..73cd9e6 --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/listeners/ExcelQFListener.java @@ -0,0 +1,111 @@ +package com.dsic.gj_erp.listeners; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.dsic.gj_erp.bean.jhgk.excel.QfExcel; +import com.dsic.gj_erp.util.ObjConvertUtils; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * Excel通用监听器 + */ +public class ExcelQFListener extends AnalysisEventListener { + + private static final int BATCH_COUNT = 5; + + List objectList = new ArrayList<>(); + List headList = new ArrayList<>(); + private String sheetName; + + List datas = new ArrayList(); + + @Override + public void invoke(QfExcel excelDemo, AnalysisContext analysisContext) { + //每解析一行数据,就会调用该方法一次 + //正常在这里调用数据处理得办法 + + //一条数据添加到暂时存储的存储结构中 + + boolean b = ObjConvertUtils.checkObjAllFieldsIsNull(excelDemo); + String dcCh = excelDemo.getDcCh(); + String dcpl = excelDemo.getDcPl(); + String dcfd = excelDemo.getDcFd(); + if(!b && StringUtils.isNotBlank(dcCh) && StringUtils.isNotBlank(dcpl) && StringUtils.isNotBlank(dcfd)){ + datas.add(excelDemo); + } + + + + + + + // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM + if (datas.size() >= BATCH_COUNT) { + saveData(); + // 存储完成清理 list + datas.clear(); + } + } + + + + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + //获取sheetName + saveData(); + sheetName = context.readSheetHolder().getSheetName(); +// LOGGER.info("所有数据解析完成!"); + } + + //获取表头 + @Override + public void invokeHeadMap(Map headMap, AnalysisContext context) { + //把表头数据加入到存储结构中 + headList.add(headMap); + } + + /** + * 入库 + */ + private void saveData() { + //添加到返回的存储结构中,也可直接存储到数据库 + objectList.addAll(datas); + } + + public List getDatas() { + return datas; + } + + public void setDatas(List datas) { + this.datas = datas; + } + + public List getObjectList() { + return objectList; + } + + public void setObjectList(List objectList) { + this.objectList = objectList; + } + + public String getSheetName() { + return sheetName; + } + + public void setSheetName(String sheetName) { + this.sheetName = sheetName; + } + + public List getHeadList() { + return headList; + } + + public void setHeadList(List headList) { + this.headList = headList; + } +} diff --git a/src/main/java/com/dsic/gj_erp/listeners/ExcelSYListener.java b/src/main/java/com/dsic/gj_erp/listeners/ExcelSYListener.java new file mode 100644 index 0000000..9b41ed9 --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/listeners/ExcelSYListener.java @@ -0,0 +1,107 @@ +package com.dsic.gj_erp.listeners; + +import com.alibaba.excel.context.AnalysisContext; +import com.alibaba.excel.event.AnalysisEventListener; +import com.dsic.gj_erp.bean.jhgk.excel.SyExcel; +import com.dsic.gj_erp.util.ObjConvertUtils; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * Excel通用监听器 + */ +public class ExcelSYListener extends AnalysisEventListener { + + private static final int BATCH_COUNT = 5; + + List objectList = new ArrayList<>(); + List headList = new ArrayList<>(); + private String sheetName; + + List datas = new ArrayList(); + + @Override + public void invoke(SyExcel excelDemo, AnalysisContext analysisContext) { + //每解析一行数据,就会调用该方法一次 + //正常在这里调用数据处理得办法 + + //一条数据添加到暂时存储的存储结构中 + + boolean b = ObjConvertUtils.checkObjAllFieldsIsNull(excelDemo); + String dcCh = excelDemo.getDcCh1(); + String dcpl = excelDemo.getDcPl(); +// String dcfd = excelDemo.getDcFd(); && StringUtils.isNotBlank(dcfd) + if(!b && StringUtils.isNotBlank(dcCh) && StringUtils.isNotBlank(dcpl)){ + datas.add(excelDemo); + } + // 达到BATCH_COUNT了,需要去存储一次数据库,防止数据几万条数据在内存,容易OOM + if (datas.size() >= BATCH_COUNT) { + saveData(); + // 存储完成清理 list + datas.clear(); + } + + + } + + + + + @Override + public void doAfterAllAnalysed(AnalysisContext context) { + //获取sheetName + saveData(); + sheetName = context.readSheetHolder().getSheetName(); +// LOGGER.info("所有数据解析完成!"); + } + + //获取表头 + @Override + public void invokeHeadMap(Map headMap, AnalysisContext context) { + //把表头数据加入到存储结构中 + headList.add(headMap); + } + + /** + * 入库 + */ + private void saveData() { + //添加到返回的存储结构中,也可直接存储到数据库 + objectList.addAll(datas); + } + + public List getDatas() { + return datas; + } + + public void setDatas(List datas) { + this.datas = datas; + } + + public List getObjectList() { + return objectList; + } + + public void setObjectList(List objectList) { + this.objectList = objectList; + } + + public String getSheetName() { + return sheetName; + } + + public void setSheetName(String sheetName) { + this.sheetName = sheetName; + } + + public List getHeadList() { + return headList; + } + + public void setHeadList(List headList) { + this.headList = headList; + } +} diff --git a/src/main/java/com/dsic/gj_erp/mapper/jhgk/DmQfxqMapper.java b/src/main/java/com/dsic/gj_erp/mapper/jhgk/DmQfxqMapper.java new file mode 100644 index 0000000..68f0fa3 --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/mapper/jhgk/DmQfxqMapper.java @@ -0,0 +1,17 @@ +package com.dsic.gj_erp.mapper.jhgk; + + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.dsic.gj_erp.bean.jhgk.DmQfxq; + +/** + *

+ * Mapper 接口 + *

+ * + * @author xn + * @since 2023-09-18 + */ +public interface DmQfxqMapper extends BaseMapper { + +} diff --git a/src/main/java/com/dsic/gj_erp/mapper/jhgk/DmSygdMapper.java b/src/main/java/com/dsic/gj_erp/mapper/jhgk/DmSygdMapper.java index 1dacd00..ded14f8 100644 --- a/src/main/java/com/dsic/gj_erp/mapper/jhgk/DmSygdMapper.java +++ b/src/main/java/com/dsic/gj_erp/mapper/jhgk/DmSygdMapper.java @@ -10,7 +10,7 @@ import com.dsic.gj_erp.bean.jhgk.DmSygd; *

* * @author xn - * @since 2023-09-15 + * @since 2023-10-09 */ public interface DmSygdMapper extends BaseMapper { diff --git a/src/main/java/com/dsic/gj_erp/mapper/jhgk/DmSygdMxMapper.java b/src/main/java/com/dsic/gj_erp/mapper/jhgk/DmSygdMxMapper.java index b1f63ac..e17d425 100644 --- a/src/main/java/com/dsic/gj_erp/mapper/jhgk/DmSygdMxMapper.java +++ b/src/main/java/com/dsic/gj_erp/mapper/jhgk/DmSygdMxMapper.java @@ -10,7 +10,7 @@ import com.dsic.gj_erp.bean.jhgk.DmSygdMx; *

* * @author xn - * @since 2023-09-15 + * @since 2023-10-09 */ public interface DmSygdMxMapper extends BaseMapper { diff --git a/src/main/java/com/dsic/gj_erp/service/jhgk/DmQfxqService.java b/src/main/java/com/dsic/gj_erp/service/jhgk/DmQfxqService.java new file mode 100644 index 0000000..629bc6b --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/service/jhgk/DmQfxqService.java @@ -0,0 +1,23 @@ +package com.dsic.gj_erp.service.jhgk; + + +import com.baomidou.mybatisplus.extension.service.IService; +import com.dsic.gj_erp.bean.jhgk.DmQfxq; +import com.dsic.gj_erp.bean.jhgk.excel.QfExcel; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务类 + *

+ * + * @author xn + * @since 2023-09-18 + */ +public interface DmQfxqService extends IService { + + Map uploadQf(List list, String project, HttpServletRequest req); +} diff --git a/src/main/java/com/dsic/gj_erp/service/jhgk/DmSygdMxService.java b/src/main/java/com/dsic/gj_erp/service/jhgk/DmSygdMxService.java index ca4d401..b6f131f 100644 --- a/src/main/java/com/dsic/gj_erp/service/jhgk/DmSygdMxService.java +++ b/src/main/java/com/dsic/gj_erp/service/jhgk/DmSygdMxService.java @@ -3,14 +3,19 @@ package com.dsic.gj_erp.service.jhgk; import com.baomidou.mybatisplus.extension.service.IService; import com.dsic.gj_erp.bean.jhgk.DmSygdMx; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + /** *

* 服务类 *

* * @author xn - * @since 2023-09-15 + * @since 2023-10-09 */ public interface DmSygdMxService extends IService { - + public Map sygdPC(); + public List saveByDcch(HashMap> map); } diff --git a/src/main/java/com/dsic/gj_erp/service/jhgk/DmSygdService.java b/src/main/java/com/dsic/gj_erp/service/jhgk/DmSygdService.java index ed22dbf..4ef4afc 100644 --- a/src/main/java/com/dsic/gj_erp/service/jhgk/DmSygdService.java +++ b/src/main/java/com/dsic/gj_erp/service/jhgk/DmSygdService.java @@ -1,7 +1,13 @@ package com.dsic.gj_erp.service.jhgk; + import com.baomidou.mybatisplus.extension.service.IService; import com.dsic.gj_erp.bean.jhgk.DmSygd; +import com.dsic.gj_erp.bean.jhgk.DmSygdMx; +import com.dsic.gj_erp.bean.jhgk.DmZrcjh; + +import java.util.List; +import java.util.Map; /** *

@@ -9,8 +15,10 @@ import com.dsic.gj_erp.bean.jhgk.DmSygd; *

* * @author xn - * @since 2023-09-15 + * @since 2023-10-09 */ public interface DmSygdService extends IService { + public Map getSygds(); + } diff --git a/src/main/java/com/dsic/gj_erp/service/jhgk/impl/DmQfxqServiceImpl.java b/src/main/java/com/dsic/gj_erp/service/jhgk/impl/DmQfxqServiceImpl.java new file mode 100644 index 0000000..e5976a0 --- /dev/null +++ b/src/main/java/com/dsic/gj_erp/service/jhgk/impl/DmQfxqServiceImpl.java @@ -0,0 +1,50 @@ +package com.dsic.gj_erp.service.jhgk.impl; + + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DateUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dsic.gj_erp.bean.jhgk.DmQfxq; +import com.dsic.gj_erp.bean.jhgk.excel.QfExcel; +import com.dsic.gj_erp.mapper.jhgk.DmQfxqMapper; +import com.dsic.gj_erp.service.jhgk.DmQfxqService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.servlet.http.HttpServletRequest; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + *

+ * 服务实现类 + *

+ * + * @author xn + * @since 2023-09-18 + */ +@Service +public class DmQfxqServiceImpl extends ServiceImpl implements DmQfxqService { + + + @Override + @Transactional(rollbackFor = Exception.class) + public Map uploadQf(List list, String project, HttpServletRequest req) { + List listForSave=new ArrayList<>(); + for (QfExcel q:list) { + this.remove(new QueryWrapper() + .eq("DC_CH",q.getDcCh()) + .eq("DC_PL",q.getDcPl()) + .eq("DC_FD",q.getDcFd())); + DmQfxq a=new DmQfxq(); + BeanUtil.copyProperties(q,a); + a.setBzry((String) req.getAttribute("yhms")); + a.setBzrq(DateUtil.format(DateUtil.date(), "yyyy/MM/dd")); + listForSave.add(a); + } + this.saveBatch(listForSave); + return null; + } +} diff --git a/src/main/java/com/dsic/gj_erp/service/jhgk/impl/DmSygdMxServiceImpl.java b/src/main/java/com/dsic/gj_erp/service/jhgk/impl/DmSygdMxServiceImpl.java index 418515b..e33c99e 100644 --- a/src/main/java/com/dsic/gj_erp/service/jhgk/impl/DmSygdMxServiceImpl.java +++ b/src/main/java/com/dsic/gj_erp/service/jhgk/impl/DmSygdMxServiceImpl.java @@ -1,11 +1,24 @@ package com.dsic.gj_erp.service.jhgk.impl; +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.dsic.gj_erp.bean.jcsj.DmBom; import com.dsic.gj_erp.bean.jhgk.DmSygdMx; +import com.dsic.gj_erp.bean.jhgk.DmZrcjh; +import com.dsic.gj_erp.mapper.jcsj.DmBomMapper; import com.dsic.gj_erp.mapper.jhgk.DmSygdMxMapper; +import com.dsic.gj_erp.mapper.jhgk.DmZrcjhMapper; import com.dsic.gj_erp.service.jhgk.DmSygdMxService; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.*; +import java.util.stream.Collectors; /** *

@@ -13,9 +26,249 @@ import org.springframework.stereotype.Service; *

* * @author xn - * @since 2023-09-15 + * @since 2023-10-09 */ @Service public class DmSygdMxServiceImpl extends ServiceImpl implements DmSygdMxService { + @Resource + private DmZrcjhMapper zrcjhMapper; + @Resource + private DmBomMapper bomMapper; + + @Override + @Transactional + public Map sygdPC(){ + //1.接下来3个月的 中日程 数据 +// List zrcjhs= zrcjhMapper.selectList(new QueryWrapper() +// .select("DC_CH,DC_PL,gjks,gjjs_dz,gjjs_xz,jsq_tlt,jsq_lqb,dhqd") +// .between("gjks", +// "(SELECT CONVERT(varchar(10),DATEADD(m,1,DATEADD(dd,-DAY(GETDATE())+1,GETDATE())),111))", +// "(Select CONVERT(varchar(10), eomonth(GETDATE(),3), 111))") +// .groupBy("DC_CH,DC_PL,gjks,gjjs_dz,gjjs_xz,jsq_tlt,jsq_lqb,dhqd") +// ); +// if (zrcjhs.size()<1){ +// new Exception("中日程中没有未来三个月的数据!"); +// } + //todo 应该用结束时间排 or + //测试 + List zrcjhs= zrcjhMapper.selectList(new QueryWrapper() + .select("DC_CH,stuff( ( SELECT ' ' + c.DC_FD FROM dm_zrcjh c WHERE c.DC_CH=dm_zrcjh.DC_CH and c.DC_PL=dm_zrcjh.DC_PL FOR xml path ( '' ) ), 1, 1, '' ) AS dcFd," + + "DC_PL,gjks,gjjs_dz,gjjs_xz,jsq_tlt,jsq_lqb,dhqd") + .between("gjks", + "2023/08/01", + "2023/08/31") + .groupBy("DC_CH,DC_PL,gjks,gjjs_dz,gjjs_xz,jsq_tlt,jsq_lqb,dhqd") + ); + //2.用中日程中的 船号 批量 ,在BOM中找明细 + List mxList=new ArrayList<>(); + List no_tlt=new ArrayList<>(); + + for (DmZrcjh zrcjh : zrcjhs) { + //②BOM中对应数据是否齐全 + List bomList= bomMapper.selectList(new QueryWrapper() + .select("dcch,sjch,pl,tzbh,lqlb,zl,wpgg,wpcz,kw,hxcd,qgcd,\n" + + "pklx,pkcd,qbs,dmcd,ljsl") + .eq("dcch",zrcjh.getDcCh()) + .eq("pl",zrcjh.getDcPl().length()<3?"0"+zrcjh.getDcPl():zrcjh.getDcPl()) + .eq("cs",3) + .groupBy("dcch,sjch,pl,tzbh,lqlb,zl,wpgg,wpcz,kw,hxcd,qgcd,\n" + + "pklx,pkcd,qbs,dmcd,ljsl") + ); + if(bomList.size()<1){ + no_tlt.add(zrcjh); + }else { + bomToMx(zrcjh,bomList,mxList,"",zrcjh.getDcCh()); + } + } + Map map2= new HashMap(); + //根据有无套料图 分组 ,没有套料图的 获取船号list + Map> map=no_tlt.stream().collect(Collectors.groupingBy(DmZrcjh::getDcCh)); + if (map.size()>0){ + List no_tlt_ch=new ArrayList<>(); + for (String s:map.keySet()){ + DmSygdMx m=new DmSygdMx(); + m.setDcCh(s); + no_tlt_ch.add(m); + } + //BOM中有套料图的船 + List haveTltBoms= bomMapper.selectList(new QueryWrapper() + .select("dcch") + .eq("cs",3) + .groupBy("dcch")); + map2.put("no_tlt",no_tlt); + map2.put("no_tlt_ch",no_tlt_ch); + map2.put("haveTltBoms",haveTltBoms); + }else { + ypc(mxList); + } + + //3.给明细排产 + + //4.明细数据 统计到主表中 数据返回到前端页面 + + map2.put("mxList",mxList); + return map2; + } + + @Override + public List saveByDcch(HashMap> map) { + List zrcjhs = BeanUtil.copyToList(map.get("no_tlt"), DmZrcjh.class); + List mxList= BeanUtil.copyToList(map.get("mxList"),DmSygdMx.class); + List no_tlt_ch= BeanUtil.copyToList(map.get("no_tlt_ch"),DmSygdMx.class); + + //1. + for (DmZrcjh z:zrcjhs){ + for (DmSygdMx mx:no_tlt_ch){ + if (z.getDcCh().equals(mx.getDcCh())){ + List bomList= bomMapper.selectList(new QueryWrapper() + .select("dcch,sjch,pl,tzbh,lqlb,zl,wpgg,wpcz,kw,hxcd,qgcd,\n" + + "pklx,pkcd,qbs,dmcd,ljsl") + .eq("dcch",mx.getDcCh1()) + .eq("pl",z.getDcPl().length()<3?"0"+z.getDcPl():z.getDcPl()) + .eq("cs",3) + .groupBy("dcch,sjch,pl,tzbh,lqlb,zl,wpgg,wpcz,kw,hxcd,qgcd,\n" + + "pklx,pkcd,qbs,dmcd,ljsl") + ); + if(bomList.size()<1){ + DmSygdMx mx1=new DmSygdMx(); + zrcToMx(z,mx1); + mxList.add(mx1); + }else { + bomToMx(z,bomList,mxList,mx.getDcCh1(),""); + } + } + } + } + + ypc(mxList); + + return mxList; + } + + public void zrcToMx(DmZrcjh zrcjh, DmSygdMx m){ + m.setDcCh(zrcjh.getDcCh()); + m.setDcPl(zrcjh.getDcPl()); + m.setDcFd(zrcjh.getDcFd()); + m.setGjks(zrcjh.getGjks()); + m.setGjjsDz(zrcjh.getGjjsDz()); + m.setGjjsXz(zrcjh.getGjjsXz()); + m.setJsqTlt(zrcjh.getJsqTlt()); + m.setJsqLqb(zrcjh.getJsqLqb()); + m.setDhqd(zrcjh.getDhqd()); + + } + public List bomToMx(DmZrcjh zrcjh,List list,List mxList,String mbch,String dcch){ + + for (DmBom b:list){ + DmSygdMx mx=new DmSygdMx(); + zrcToMx(zrcjh,mx); + mx.setZl(b.getZl()); + mx.setTzbh(b.getTzbh()); + mx.setLqlb(b.getLqlb()); + mx.setLx(b.getTzbh().substring(4,5).equals("X")?"X":"B"); + mx.setWpgg(b.getWpgg()); + mx.setWpxh(b.getWpcz()); + //型材米数 + mx.setLjsl(b.getLjsl()); + //区域 +// mx.setQy(); + mx.setKw(b.getKw()); + //上料日期 + //上料人员 + //矫正标识 + //矫正设备 + //矫正人员 + mx.setPw(b.getPw()); + //抛丸设备 + //抛丸人员 + //抛丸日期 + mx.setHxcd(b.getHxcd()); + //划线空程 + //划线设备 + //划线人员 + //划线日期 + mx.setQgcd(b.getQgcd()); + //切割空程 + //切割设备 + //切割人员 + //切割日期 + mx.setPklx(b.getPklx()); + mx.setPkcd(b.getPkcd()); + //坡口设备 + //坡口人员 + //坡口日期 + mx.setQbs(b.getQbs()); + //曲加工设备 + //曲加工人员 + //曲加工日期 + mx.setDmcd(b.getDmcd()); + //打磨设备 + //打磨人员 + //打磨日期 + mx.setDcCh2(dcch); + mx.setDcCh1(mbch); + mx.setGxsj(DateUtil.now()); + //todo + if(b.getZl().equals("1110")){ + mx.setJssj(mx.getGjjsDz()); + } + if(b.getZl().equals("1010")){ + mx.setJssj(mx.getGjjsXz()); + } + + mxList.add(mx); + } + + return mxList; + + } + + public void ypc(List list){ + //排序 + list =list.stream().sorted(Comparator.comparing(DmSygdMx::getJssj,Comparator.nullsLast(Comparator.naturalOrder()))).collect(Collectors.toList()); + //上料 + list.forEach(l->{ + // + }); +// 校平 + //抛丸 + + //根据跨位分组 + Map> groupByKw=list.stream().collect(Collectors.groupingBy(x->Optional.ofNullable(x.getKw()).orElse("0") )); +// 7 1跨平直大板 + List k1pz=groupByKw.get("7"); + //排产 + k1pz.forEach(k->{ + //上料 校平 抛丸 理料 划线 切割 坡口 打磨 + + }); +// 8 1跨进线板 + List k1jx=groupByKw.get("8"); +// 11 2跨T型材腹板 + List k2tf=groupByKw.get("11"); +// 5 2跨T型材面板 + List k2tm=groupByKw.get("5"); +// 9 2跨超长超宽板 + List k2c=groupByKw.get("9"); +// 10 2跨超长超宽曲板 + List k2cq=groupByKw.get("10"); +// 12 2跨激光切割板 + List k2j=groupByKw.get("12"); +// 14 3跨厚板 + List k3h=groupByKw.get("14"); +// 6 3跨平铁 + List k3p=groupByKw.get("6"); +// 13 3跨曲板 + List k3q=groupByKw.get("13"); +// 15 4跨普通板 + List k4p=groupByKw.get("15"); +// 16 7跨型板 + List k7x=groupByKw.get("16"); +// 17 光电 + List gd=groupByKw.get("17"); + + System.out.println(groupByKw); + } + } diff --git a/src/main/java/com/dsic/gj_erp/service/jhgk/impl/DmSygdServiceImpl.java b/src/main/java/com/dsic/gj_erp/service/jhgk/impl/DmSygdServiceImpl.java index 41bcc43..f05ec9a 100644 --- a/src/main/java/com/dsic/gj_erp/service/jhgk/impl/DmSygdServiceImpl.java +++ b/src/main/java/com/dsic/gj_erp/service/jhgk/impl/DmSygdServiceImpl.java @@ -1,11 +1,34 @@ package com.dsic.gj_erp.service.jhgk.impl; - +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.bean.copier.BeanCopier; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; + +import com.dsic.gj_erp.bean.jcsj.DmBclqjbp; +import com.dsic.gj_erp.bean.jcsj.DmBom; import com.dsic.gj_erp.bean.jhgk.DmSygd; +import com.dsic.gj_erp.bean.jhgk.DmSygdMx; +import com.dsic.gj_erp.bean.jhgk.DmZrcjh; +import com.dsic.gj_erp.bean.sy.Dm_zhbmp; +import com.dsic.gj_erp.mapper.jcsj.DmBomMapper; import com.dsic.gj_erp.mapper.jhgk.DmSygdMapper; +import com.dsic.gj_erp.mapper.jhgk.DmZrcjhMapper; +import com.dsic.gj_erp.service.jcsj.DmBclqjbpService; import com.dsic.gj_erp.service.jhgk.DmSygdService; +import com.sun.el.stream.Stream; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** *

@@ -13,9 +36,79 @@ import org.springframework.stereotype.Service; *

* * @author xn - * @since 2023-09-15 + * @since 2023-10-09 */ @Service public class DmSygdServiceImpl extends ServiceImpl implements DmSygdService { + @Resource + private DmSygdMapper mapper; + + @Resource + private DmBclqjbpService bclqjbpService; + + + @Override + public Map getSygds(){ + + Map map= new HashMap(); + + return map; + } + + + + + + +// mx.setKwxx(b.getTzbh().substring(4,8)); +// mx.setKw(b.getTzbh().substring(4,7)); +// mx.setLqlb(b.getTzbh().substring(4,5).equals("N")?"1020": +// b.getTzbh().substring(4,5).equals("S")?"1010":"X"); +// if (b.getTzbh().substring(7,8).equals("D")){ +// //tlt.substring(7,8).equals("D")?"1110" 中大组立 +// mx.setZl("1110"); +// }else { +// if (b.getTzbh().substring(5,6).equals("8")){ +// //tlt.substring(5,6).equals("8")?"1120" 光电 +// mx.setZl("1120"); +// }else if(b.getTzbh().substring(6,8).equals("XX")){ +// //tlt.substring(6,8).equals("XX")?"4230" 焊接机器人肘板 +// mx.setZl("4230"); +// }else { +// //tlt.substring(7,8).equals("X")?"1010" 小组立 +// mx.setZl("1010"); +// } +// } + + // Map> kwxx = mxList.stream().collect(Collectors.groupingBy(DmSygdMx::getKwxx)); +// s.setMxList(mxList); +// s.setTltSl(mxList.size()); +// s.setSlSl(mxList.size()); +// s.setPwSl(mxList.size()); +// s.setN1ad(ObjectUtil.isNotEmpty(kwxx.get("N1AD"))?kwxx.get("N1AD").size():0); +// s.setN1ax(ObjectUtil.isNotEmpty(kwxx.get("N1AX"))?kwxx.get("N1AX").size():0); +// s.setN1ld(ObjectUtil.isNotEmpty(kwxx.get("N1LD"))?kwxx.get("N1LD").size():0); +// s.setN2bd(ObjectUtil.isNotEmpty(kwxx.get("N2BD"))?kwxx.get("N2BD").size():0); +// s.setN2bx(ObjectUtil.isNotEmpty(kwxx.get("N2BX"))?kwxx.get("N2BX").size():0); +// s.setN2cd(ObjectUtil.isNotEmpty(kwxx.get("N2CD"))?kwxx.get("N2CD").size():0); +// s.setN2cx(ObjectUtil.isNotEmpty(kwxx.get("N2CX"))?kwxx.get("N2CX").size():0); +// s.setN2jd(ObjectUtil.isNotEmpty(kwxx.get("N2JD"))?kwxx.get("N2JD").size():0); +// s.setN2jx(ObjectUtil.isNotEmpty(kwxx.get("N2JX"))?kwxx.get("N2JX").size():0); +// s.setN2td(ObjectUtil.isNotEmpty(kwxx.get("N2TD"))?kwxx.get("N2TD").size():0); +// s.setN2tx(ObjectUtil.isNotEmpty(kwxx.get("N2TX"))?kwxx.get("N2TX").size():0); +// s.setN3cd(ObjectUtil.isNotEmpty(kwxx.get("N3CD"))?kwxx.get("N3CD").size():0); +// s.setN3cx(ObjectUtil.isNotEmpty(kwxx.get("N3CX"))?kwxx.get("N3CX").size():0); +// s.setN3hd(ObjectUtil.isNotEmpty(kwxx.get("N3HD"))?kwxx.get("N3HD").size():0); +// s.setN3hx(ObjectUtil.isNotEmpty(kwxx.get("N3HX"))?kwxx.get("N3HX").size():0); +// s.setN4pd(ObjectUtil.isNotEmpty(kwxx.get("N4PD"))?kwxx.get("N4PD").size():0); +// s.setN4px(ObjectUtil.isNotEmpty(kwxx.get("N4PX"))?kwxx.get("N4PX").size():0); +// s.setN4xx(ObjectUtil.isNotEmpty(kwxx.get("N4XX"))?kwxx.get("N4XX").size():0); +// s.setS2td(ObjectUtil.isNotEmpty(kwxx.get("S2TD"))?kwxx.get("S2TD").size():0); +// s.setS2tx(ObjectUtil.isNotEmpty(kwxx.get("S2TX"))?kwxx.get("S2TX").size():0); +// s.setS3pd(ObjectUtil.isNotEmpty(kwxx.get("S3PD"))?kwxx.get("S3PD").size():0); +// s.setS3px(ObjectUtil.isNotEmpty(kwxx.get("S3PX"))?kwxx.get("S3PX").size():0); +// s.setS3xx(ObjectUtil.isNotEmpty(kwxx.get("S3XX"))?kwxx.get("S3XX").size():0); +// s.setX7xd(ObjectUtil.isNotEmpty(kwxx.get("N1AD"))?kwxx.get("N1AD").size():0); +// s.setX7xx(ObjectUtil.isNotEmpty(kwxx.get("N1AD"))?kwxx.get("N1AD").size():0); } diff --git a/src/main/resources/mappers/jhgk/DmQfxqMapper.xml b/src/main/resources/mappers/jhgk/DmQfxqMapper.xml new file mode 100644 index 0000000..7d32420 --- /dev/null +++ b/src/main/resources/mappers/jhgk/DmQfxqMapper.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/mappers/jhgk/DmSygdMapper.xml b/src/main/resources/mappers/jhgk/DmSygdMapper.xml index 6ce7b48..ef27c7b 100644 --- a/src/main/resources/mappers/jhgk/DmSygdMapper.xml +++ b/src/main/resources/mappers/jhgk/DmSygdMapper.xml @@ -5,44 +5,80 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/mappers/jhgk/DmSygdMxMapper.xml b/src/main/resources/mappers/jhgk/DmSygdMxMapper.xml index 4522434..cb82a3f 100644 --- a/src/main/resources/mappers/jhgk/DmSygdMxMapper.xml +++ b/src/main/resources/mappers/jhgk/DmSygdMxMapper.xml @@ -5,65 +5,39 @@ + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - - - - - + + + + + + + + + + + + + + + + +