فهرست منبع

面料损耗更新-逻辑整理

fenghaifu 2 سال پیش
والد
کامیت
d6ebeab3da
15فایلهای تغییر یافته به همراه1848 افزوده شده و 761 حذف شده
  1. 29 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/report/entity/FabricAssemVouchsOrgIn.java
  2. 73 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/report/entity/FabricCommonIn.java
  3. 4 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/report/entity/FabricCostCloth.java
  4. 9 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/report/entity/FabricCostInvoice.java
  5. 23 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/report/entity/FabricInPrice.java
  6. 179 13
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/report/entity/FabricMoOrderCK.java
  7. 16 2
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/report/entity/FabricMoOrderRK.java
  8. 2 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/report/entity/FabricOMOrder.java
  9. 63 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/report/entity/FabricPoOrder.java
  10. 21 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/report/entity/FabricPoOrderIn.java
  11. 36 1
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/report/entity/FabricPoOrderOut.java
  12. 25 9
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/report/mapper/FabricLossMapper.java
  13. 168 44
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/report/mapper/xml/FabricLossMapper.xml
  14. 1183 692
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/report/service/impl/FabricLossServiceImpl.java
  15. 17 0
      jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/util/DoubleOperation.java

+ 29 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/report/entity/FabricAssemVouchsOrgIn.java

@@ -0,0 +1,29 @@
+package org.jeecg.modules.report.entity;
+
+import lombok.Data;
+
+/**
+ * @author fenghaifu
+ * @version V1.0
+ * @Copyright: 上海萃颠信息科技有限公司. All rights reserved.
+ * @Title:FabricAssemVouchsOrgIn
+ * @projectName jeecg-boot-parent
+ * @Description:形态转换物料的原始入库书库
+ * @date: 2022-11-28 18:19
+ * @updatehistory: 2022-11-28 18:19 新增
+ */
+@Data
+public class FabricAssemVouchsOrgIn {
+	// 入库表名称rdrecords08:其他入库、转换入库,rdrecords01:采购入库,委外入库
+	private String cTableName;
+	// 入库单子表id
+	private Integer AutoId;
+	// 单据类型
+	private String cBusType;
+	// 转换前物料ID
+	private String cInvIdBefore;
+	// 转换后的物料
+	private String cInvIdAfter;
+	// 转换最终物料,用于匹配出库数据
+	private String cInvIdFinal;
+}

+ 73 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/report/entity/FabricCommonIn.java

@@ -0,0 +1,73 @@
+package org.jeecg.modules.report.entity;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * @author fenghaifu
+ * @version V1.0
+ * @Copyright: 上海萃颠信息科技有限公司. All rights reserved.
+ * @Title:FabricCommonIn
+ * @projectName jeecg-boot-parent
+ * @Description:通用的入库对象
+ * @date: 2022-11-28 16:44
+ * @updatehistory: 2022-11-28 16:44 新增
+ */
+@Data
+public class FabricCommonIn {
+	//入库单子表id
+	@ApiModelProperty(value = "入库单子表id")
+	private  int AutoId;
+	//入库单号
+	@ApiModelProperty(value = "单据号")
+	private  String cCode;
+	//入库单号
+	@ApiModelProperty(value = "计划号")
+	private  String cPlanCode;
+	//单据类型
+	@ApiModelProperty(value = "单据类型")
+	private  String cBusType;
+	@ApiModelProperty(value = "制造工艺")
+	private String  cVCName;
+	@ApiModelProperty(value = "材料入库供应商名称")
+	private  String cVenName;
+	@ApiModelProperty(value = "材料入库供应商简称")
+	private  String cVenAbbName;
+	@ApiModelProperty(value = "存货分类")
+	private  String cInvCCode;
+	//存货编码
+	@ApiModelProperty(value = "存货编码")
+	private  String cInvCode;
+	//存货名称
+	@ApiModelProperty(value = "存货名称")
+	private  String cInvName;
+	//颜色
+	@ApiModelProperty(value = "颜色")
+	private String cColor;
+	//批号
+	@ApiModelProperty(value = "批号")
+	private String cBatch;
+	//入库数量
+	@ApiModelProperty(value = "入库数量")
+	private Double iQuantity;
+	//含税单价-采购发票单价
+	@ApiModelProperty(value = "含税单价")
+	private Double iPrice;
+
+	// 委外订单子表id
+	private Integer MODetailsID;
+	// 采购订单子表id
+	private Integer PoDetailsID;
+
+	// 计算过程临时用到的,累计使用数量
+	private Double iTempUseSum;
+
+
+	public String getParentId(){
+		return cInvCode+cColor;
+	}
+	public String getInvId(){return cInvCode+cColor+cBatch;}
+}

+ 4 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/report/entity/FabricCostCloth.java

@@ -50,4 +50,8 @@ public class FabricCostCloth {
 
 	// 点击详情
 	List<FabricCostClothDetail> fabricCostClothDetailList;
+
+	public String getId(){
+		return cVenName+cSBVCode+cShipTime;
+	}
 }

+ 9 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/report/entity/FabricCostInvoice.java

@@ -50,4 +50,13 @@ public class FabricCostInvoice {
 	@ApiModelProperty(value = "批号")
 	private  String cBatch;
 
+	public String getId(){
+		return cVCName+cBusType+cVenAbbName;
+	}
+	// 排序号
+	int order;
+	public String getInvId(){
+		return cInvCode+cColor+cBatch;
+	}
+
 }

+ 23 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/report/entity/FabricInPrice.java

@@ -0,0 +1,23 @@
+package org.jeecg.modules.report.entity;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author fenghaifu
+ * @version V1.0
+ * @Copyright: 上海萃颠信息科技有限公司. All rights reserved.
+ * @Title:FabricInPrice
+ * @projectName jeecg-boot-parent
+ * @Description:获取采购入库或者其他入库价格信息
+ * @date: 2022-11-28 20:28
+ * @updatehistory: 2022-11-28 20:28 新增
+ */
+@Data
+public class FabricInPrice {
+	//入库单子表id
+	@ApiModelProperty(value = "入库单子表id")
+	private  int AutoId;
+	@ApiModelProperty(value = "含税单价")
+	private Double iPrice;
+}

+ 179 - 13
jeecg-boot-module-system/src/main/java/org/jeecg/modules/report/entity/FabricMoOrderCK.java

@@ -5,12 +5,22 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
+import org.jeecg.common.util.oConvertUtils;
+import org.jeecg.modules.system.util.DoubleOperation;
+
+import java.math.BigDecimal;
+import java.util.List;
+import java.util.Optional;
 
 @Data
 @EqualsAndHashCode(callSuper = false)
 @Accessors(chain = true)
 @ApiModel(value="面料损耗-委外订单-材料出库-超链接", description="面料损耗-委外订单-材料出库-超链接")
 public class FabricMoOrderCK {
+    @ApiModelProperty(value = "委外订单号")
+    private  String cOmCode;
+    @ApiModelProperty(value = "委外订单供应商缩写")
+    private  String cOmVenAbbName;
     @ApiModelProperty(value = "材料入库类型")
     private  String cBusType;
     @ApiModelProperty(value = "材料入库单号")
@@ -19,14 +29,10 @@ public class FabricMoOrderCK {
     private  String cVenName;
     @ApiModelProperty(value = "材料入库供应商简称")
     private  String cVenAbbName;
-//    @ApiModelProperty(value = "委外入库物料编码")
-//    private  String cInvCodeIn;
-//    @ApiModelProperty(value = "委外入库物料名称")
-//    private  String cInvNameIn;
-//    @ApiModelProperty(value = "委外入库名称颜色")
-//    private  String cColorIn;
-//    @ApiModelProperty(value = "委外入库批号")
-//    private  String cBatchIn;
+    @ApiModelProperty(value = "材料入库供应商类型")
+    private String  cVCName;
+    @ApiModelProperty(value = "出库存货分类")
+    private  String cInvCCodeOut;
     @ApiModelProperty(value = "材料出库物料编码")
     private  String cInvCodeOut;
     @ApiModelProperty(value = "材料出库物料名称")
@@ -45,8 +51,6 @@ public class FabricMoOrderCK {
     private  Double iQuantityIn;
     @ApiModelProperty(value = "使用数量")
     private  Double iQuantity;
-//    @ApiModelProperty(value = "材料采购入库单价")
-//    private  Double iPurchusePrice;
     @ApiModelProperty(value = "单个成本")
     private  Double iPrice;
     @ApiModelProperty(value = "计算单个成本")
@@ -56,15 +60,177 @@ public class FabricMoOrderCK {
     @ApiModelProperty(value = "是否异常")
     private Boolean abnormal;
     // 委外订单子表id
-    private String MODetailsID;
+    private Integer MODetailsID;
     // 入库物料编号+颜色
     private  String cInvCodeColorIn;
-    @ApiModelProperty(value = "制造工艺")
-    private String  cVCName;
+
     // 计划号,采购订单号或者委外订单号
     private String cPlanCode;
+    // 是否本计划入库物料
+    private Boolean bCurPlan;
+    // 计算过程临时用到的,累计使用数量
+    private Double iTempUseSum;
 
     public String getInvOutId(){
         return cInvCodeOut+cColorOut+cBatchOut;
     }
+
+    /**
+     * 根据采购入库生成记录
+     * @param editOmList
+     * @param poOrderIn
+     * @return
+     */
+    public FabricMoOrderCK getByPoIn(List<FabricOMOrder> editOmList, FabricPoOrderIn poOrderIn){
+        Double inSum = DoubleOperation.sub(poOrderIn.getIQuantity(),poOrderIn.getITempUseSum());
+        Double curSum = iQuantityOut>inSum?inSum:iQuantityOut;
+        iQuantityOut -= curSum;
+        poOrderIn.setITempUseSum(DoubleOperation.add(poOrderIn.getITempUseSum(),curSum));
+
+        FabricMoOrderCK retItem = new FabricMoOrderCK();
+        retItem.setCBusType(poOrderIn.getCBusType());
+        retItem.setCCode(poOrderIn.getCCode());
+        retItem.setCVenName(poOrderIn.getCVenName());
+        retItem.setCVenAbbName(poOrderIn.getCVenAbbName());
+        retItem.setCVCName(poOrderIn.getCVCName());
+        retItem.setCInvCodeColorIn(poOrderIn.getCInvCode()+poOrderIn.getCColor());
+        retItem.setCInvCCodeOut(this.getCInvCCodeOut());
+        retItem.setCInvCodeOut(this.getCInvCodeOut());
+        retItem.setCInvNameOut(this.getCInvNameOut());
+        retItem.setCColorOut(this.getCColorOut());
+        retItem.setCBatchOut(this.getCBatchOut());
+        retItem.setMODetailsID(this.getMODetailsID());
+        retItem.setCOmCode(this.getCOmCode());
+        retItem.setCOmVenAbbName(this.getCOmVenAbbName());
+        retItem.setCPlanCode(poOrderIn.getCPlanCode());
+        retItem.setIQuantity(DoubleOperation.getScale(curSum,4));
+        retItem.setIQuantityOut(retItem.getIQuantity());
+        retItem.setIQuantityIn(inSum);
+        Double iPrice = getSaveOmOutPrice(editOmList, retItem.getMODetailsID(), retItem.getInvOutId());
+        if (iPrice == null){
+            iPrice = poOrderIn.getIPrice();
+        }
+        retItem.setIMoney(DoubleOperation.mul(iPrice,curSum,2));
+        retItem.setIPrice(DoubleOperation.getScale(iPrice,4));
+        retItem.setICalPrice(retItem.getIPrice());
+        return retItem;
+    }
+
+    /**
+     * 根据通用入库生成记录
+     * @param editOmList
+     * @param commonIn
+     * @return
+     */
+    public FabricMoOrderCK getByCommonIn(List<FabricOMOrder> editOmList, FabricCommonIn commonIn){
+        Double inSum = DoubleOperation.sub(commonIn.getIQuantity(),commonIn.getITempUseSum());
+        Double curSum = iQuantityOut>inSum?inSum:iQuantityOut;
+        iQuantityOut -= curSum;
+        commonIn.setITempUseSum(DoubleOperation.add(commonIn.getITempUseSum(),curSum));
+
+        FabricMoOrderCK retItem = new FabricMoOrderCK();
+        retItem.setCBusType(commonIn.getCBusType());
+        retItem.setCCode(commonIn.getCCode());
+        retItem.setCVenName(commonIn.getCVenName());
+        retItem.setCVenAbbName(commonIn.getCVenAbbName());
+        retItem.setCVCName(commonIn.getCVCName());
+        retItem.setCInvCodeColorIn(commonIn.getCInvCode()+commonIn.getCColor());
+        retItem.setCInvCCodeOut(this.getCInvCCodeOut());
+        retItem.setCInvCodeOut(this.getCInvCodeOut());
+        retItem.setCInvNameOut(this.getCInvNameOut());
+        retItem.setCColorOut(this.getCColorOut());
+        retItem.setCBatchOut(this.getCBatchOut());
+        retItem.setMODetailsID(this.getMODetailsID());
+        retItem.setCOmCode(this.getCOmCode());
+        retItem.setCOmVenAbbName(this.getCOmVenAbbName());
+        retItem.setCPlanCode(commonIn.getCPlanCode());
+        retItem.setIQuantity(DoubleOperation.getScale(curSum,4));
+        retItem.setIQuantityOut(retItem.getIQuantity());
+        retItem.setIQuantityIn(inSum);
+        Double iPrice = getSaveOmOutPrice(editOmList, retItem.getMODetailsID(), retItem.getInvOutId());
+        if (iPrice == null){
+            iPrice = commonIn.getIPrice();
+        }
+        retItem.setIMoney(DoubleOperation.mul(iPrice,curSum,2));
+        retItem.setIPrice(DoubleOperation.getScale(iPrice,4));
+        retItem.setICalPrice(retItem.getIPrice());
+        return retItem;
+    }
+    /**
+     * 根据委外入库生成记录
+     * @param editOmList
+     * @param moIn
+     * @return
+     */
+    public FabricMoOrderCK getByMoIn(List<FabricOMOrder> editOmList, FabricMoOrderRK moIn){
+        Double inSum = DoubleOperation.sub(moIn.getIQuantityIn(),moIn.getITempUseSum());
+        Double curSum = iQuantityOut>inSum?inSum:iQuantityOut;
+        iQuantityOut -= curSum;
+        moIn.setITempUseSum(DoubleOperation.add(moIn.getITempUseSum(),curSum));
+
+        FabricMoOrderCK retItem = new FabricMoOrderCK();
+        retItem.setCBusType("委外加工");
+        retItem.setCCode(moIn.getCCode());
+        retItem.setCVenName(moIn.getCVenName());
+        retItem.setCVenAbbName(moIn.getCVenAbbName());
+        retItem.setCVCName(moIn.getCVCName());
+        retItem.setCInvCodeColorIn(moIn.getCInvCode()+moIn.getCColor());
+        retItem.setCInvCCodeOut(this.getCInvCCodeOut());
+        retItem.setCInvCodeOut(this.getCInvCodeOut());
+        retItem.setCInvNameOut(this.getCInvNameOut());
+        retItem.setCColorOut(this.getCColorOut());
+        retItem.setCBatchOut(this.getCBatchOut());
+        retItem.setMODetailsID(this.getMODetailsID());
+        retItem.setCOmCode(this.getCOmCode());
+        retItem.setCOmVenAbbName(this.getCOmVenAbbName());
+        retItem.setCPlanCode(moIn.getCPlanCode());
+        retItem.setIQuantity(DoubleOperation.getScale(curSum,4));
+        retItem.setIQuantityOut(retItem.getIQuantity());
+        retItem.setIQuantityIn(inSum);
+        Double iPrice = getSaveOmOutPrice(editOmList, retItem.getMODetailsID(), retItem.getInvOutId());
+        if (iPrice == null){
+            iPrice = moIn.getIPrice();
+        }
+        retItem.setIMoney(DoubleOperation.mul(iPrice,curSum,2));
+        retItem.setIPrice(DoubleOperation.getScale(iPrice,4));
+        retItem.setICalPrice(retItem.getIPrice());
+        return retItem;
+    }
+
+    /**
+     * 获取用户保存的出库单价,根据委外订单id,出库物料id获取
+     * @param editOmList
+     * @param modetailsID
+     * @param invOutId
+     * @return
+     */
+    public static Double getSaveOmOutPrice(List<FabricOMOrder> editOmList, Integer modetailsID, String invOutId){
+        Optional<FabricOMOrder> findOpt = editOmList.stream().filter(e->e.getMODetailsID().indexOf(modetailsID.toString())>-1).findFirst();
+        if (findOpt.isPresent()){
+            FabricOMOrder findItem = findOpt.get();
+            List<FabricMoOrderCK> ckList = findItem.getFabricMoOrderCKList();
+            if (oConvertUtils.listIsNotEmpty(ckList)){
+                Optional<FabricMoOrderCK> findCkOpt = ckList.stream().filter(e->e.getInvOutId().equalsIgnoreCase(invOutId)).findFirst();
+                if (findCkOpt.isPresent()){
+                    FabricMoOrderCK findCkItem = findCkOpt.get();
+                    if (!findCkItem.getIPrice().equals(findCkItem.getICalPrice())){
+                        return findCkOpt.get().getIPrice();
+                    }
+
+                }
+            }
+        }
+        return null;
+    }
+
+    /**
+     * 判断是否是采购里面需要展示的物料,物料分类以01,02,03,04开头的是
+     * @return
+     */
+    public boolean isPoInventory(){
+        return cInvCCodeOut.startsWith("01") ||
+                cInvCCodeOut.startsWith("02") ||
+                cInvCCodeOut.startsWith("03") ||
+                cInvCCodeOut.startsWith("04");
+    }
 }

+ 16 - 2
jeecg-boot-module-system/src/main/java/org/jeecg/modules/report/entity/FabricMoOrderRK.java

@@ -11,8 +11,18 @@ import lombok.experimental.Accessors;
 @Accessors(chain = true)
 @ApiModel(value="面料损耗-委外订单-采购入库-超链接", description="面料损耗-委外订单-采购入库-超链接")
 public class FabricMoOrderRK {
-    @ApiModelProperty(value = "委外订单号")
+    @ApiModelProperty(value = "入库单号")
     private  String cCode;
+    @ApiModelProperty(value = "委外订单号")
+    private  String cPlanCode;
+    @ApiModelProperty(value = "供应商分类")
+    private String  cVCName;
+    @ApiModelProperty(value = "供应商名称")
+    private  String cVenName;
+    @ApiModelProperty(value = "供应商简称")
+    private  String cVenAbbName;
+    @ApiModelProperty(value = "存货分类")
+    private  String cInvCCode;
     @ApiModelProperty(value = "物料编码")
     private  String cInvCode;
     @ApiModelProperty(value = "物料名称")
@@ -38,5 +48,9 @@ public class FabricMoOrderRK {
     @ApiModelProperty(value = "成本")
     private  Double iPrice;
     // 委外订单子表id
-    private String MODetailsID;
+    private Integer MODetailsID;
+    // 计算过程临时用到的,累计使用数量
+    private Double iTempUseSum;
+
+    public String getInvId(){return cInvCode+cColor+cBatch;}
 }

+ 2 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/report/entity/FabricOMOrder.java

@@ -66,6 +66,8 @@ public class FabricOMOrder {
     private List<Map<String,Object>>childrens=new ArrayList<>();
     @ApiModelProperty(value = "委外类型")
     private  String motype;
+    // 顺序号
+    private int order;
 
     // 委外订单出库详情
     List<FabricMoOrderCK> fabricMoOrderCKList;

+ 63 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/report/entity/FabricPoOrder.java

@@ -5,8 +5,13 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
+import org.jeecg.modules.system.util.DoubleOperation;
 
+import java.math.BigDecimal;
+import java.util.ArrayList;
 import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
 
 //面料损耗-采购订单
 @Data
@@ -70,4 +75,62 @@ public class FabricPoOrder {
     List<FabricPoOrderIn> fabricPoOrderInList;
     // 被其他委外订单使用情况
     List<FabricPoOrderOut> fabricPoOrderOutList;
+
+    public String getId(){
+        return cInvCode+cColor;
+    }
+
+    /**
+     * 来源余纱和其他入库的纱,根据物料(物料+颜色)分组
+     * @param poOrderOutList
+     * @param cPOID - 来源余料 和 其他入库的纱
+     * @return
+     */
+    public static List<FabricPoOrder> getByPoOrderOutList(List<FabricPoOrderOut> poOrderOutList, String cPOID){
+        // 出库单根据委外订单号,物料,批号分组,用来展示明细
+        List<FabricPoOrderOut> poOrderOutGroupList = new ArrayList<>();
+        for (FabricPoOrderOut poOrderOut : poOrderOutList) {
+            Optional<FabricPoOrderOut> findOpt = poOrderOutGroupList.stream().filter(e -> e.getGroupId().equalsIgnoreCase(poOrderOut.getGroupId())).findFirst();
+            // 已有,计划号逗号分割相加,计算数量,金额,单价
+            if (findOpt.isPresent()) {
+                FabricPoOrderOut findItem = findOpt.get();
+                if (findItem.getCPlanCode().indexOf(poOrderOut.getCPlanCode()) == -1 && poOrderOut.getCPlanCode().length()>0){
+                    findItem.setCPlanCode(findItem.getCPlanCode()+","+poOrderOut.getCPlanCode());
+                }
+                findItem.setIQuantity(DoubleOperation.add(findItem.getIQuantity(),poOrderOut.getIQuantity()));
+                findItem.setIMoney(DoubleOperation.add(findItem.getIMoney(),poOrderOut.getIMoney()));
+                findItem.setIPrice(DoubleOperation.div(findItem.getIMoney(),findItem.getIQuantity(),4));
+            }else{  // 新增
+                poOrderOutGroupList.add(poOrderOut);
+            }
+        }
+
+        List<FabricPoOrder> ret = new ArrayList<>();
+        // 分组出库数据,根据物料(编号+颜色)分组,多个供应商逗号分割
+        for (FabricPoOrderOut poOrderOut : poOrderOutGroupList) {
+            Optional<FabricPoOrder> findOpt = ret.stream().filter(e -> e.getId().equalsIgnoreCase(poOrderOut.getParentId())).findFirst();
+            // 已存在,合并供应商,增加数量金额
+            if (findOpt.isPresent()){
+                FabricPoOrder findItem = findOpt.get();
+                findItem.setIQuantityOut(DoubleOperation.add(findItem.getIQuantityOut(),poOrderOut.getIQuantity()));
+                findItem.setIQuantityIn(DoubleOperation.add(findItem.getIQuantityIn(),poOrderOut.getIQuantity()));
+                if (findItem.getOmcVenAbbName().indexOf(poOrderOut.getCVenAbbName()) == -1){
+                    findItem.setOmcVenAbbName(findItem.getOmcVenAbbName()+","+poOrderOut.getCVenAbbName());
+                }
+            }else{
+                FabricPoOrder poOrder = new FabricPoOrder();
+                poOrder.setCInvName(poOrderOut.getCInvName()+" "+poOrderOut.getCColor());
+                poOrder.setCPOID(cPOID);
+                poOrder.setCColor(poOrderOut.getCColor());
+                poOrder.setCInvCode(poOrderOut.getCInvCode());
+                poOrder.setOmcVenAbbName(poOrderOut.getCVenAbbName());
+                poOrder.setIQuantityIn(poOrderOut.getIQuantity());
+                poOrder.setIQuantityOut(poOrderOut.getIQuantity());
+                List<FabricPoOrderOut> findOutList = poOrderOutGroupList.stream().filter(e->e.getParentId().equals(poOrder.getId())).collect(Collectors.toList());
+                poOrder.setFabricPoOrderOutList(findOutList);
+                ret.add(poOrder);
+            }
+        }
+        return ret;
+    }
 }

+ 21 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/report/entity/FabricPoOrderIn.java

@@ -27,6 +27,9 @@ public class FabricPoOrderIn {
 	//单据类型
 	@ApiModelProperty(value = "单据类型")
 	private  String cBusType;
+
+	@ApiModelProperty(value = "存货分类")
+	private  String cInvCCode;
 	//存货编码
 	@ApiModelProperty(value = "存货编码")
 	private  String cInvCode;
@@ -45,6 +48,9 @@ public class FabricPoOrderIn {
 	//含税单价-采购发票单价
 	@ApiModelProperty(value = "含税单价")
 	private Double iPrice;
+	//采购金额
+	@ApiModelProperty(value = "采购金额")
+	private Double iPurchuseMoney;
 	//开票数量
 	@ApiModelProperty(value = "开票数量")
 	private Double iQuantityInvoice;
@@ -60,4 +66,19 @@ public class FabricPoOrderIn {
 
 	@ApiModelProperty(value = "制造工艺")
 	private String  cVCName;
+
+	@ApiModelProperty(value = "供应商")
+	private String  cVenName;
+	@ApiModelProperty(value = "供应商缩写")
+	private String  cVenAbbName;
+	// 计划号
+	private String cPlanCode;
+
+	// 计算过程临时用到的,累计使用数量
+	private Double iTempUseSum;
+
+	public String getParentId(){
+		return cInvCode+cColor;
+	}
+	public String getInvId(){return cInvCode+cColor+cBatch;}
 }

+ 36 - 1
jeecg-boot-module-system/src/main/java/org/jeecg/modules/report/entity/FabricPoOrderOut.java

@@ -5,6 +5,7 @@ import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.experimental.Accessors;
+import org.jeecg.modules.system.util.DoubleOperation;
 
 /**
  * @author fenghaifu
@@ -45,6 +46,40 @@ public class FabricPoOrderOut {
 	String cWhCode;
 	@ApiModelProperty(value = "仓库名称")
 	String cWhName;
-	@ApiModelProperty(value = "供应商简称")
+	@ApiModelProperty(value = "委外供应商简称")
 	String cVenAbbName;
+
+	public String getParentId(){
+		return cInvCode+cColor;
+	}
+	public String getInvId(){return cInvCode+cColor+cBatch;}
+	// 来源余纱和其他入库的纱,明细展示时,根据委外订单号和物料分组
+	public String getGroupId(){return cCode+getInvId();}
+
+	/**
+	 * 根据委外出库单生成其他入库纱和来源余纱
+	 * @param moOrderCK
+	 */
+	public static FabricPoOrderOut getByMoOut(FabricMoOrderCK moOrderCK){
+		FabricPoOrderOut orderOut = new FabricPoOrderOut();
+		orderOut.setCPlanCode(moOrderCK.getCPlanCode());
+		orderOut.setCCode(moOrderCK.getCOmCode());
+		orderOut.setIQuantity(moOrderCK.getIQuantityOut());
+		orderOut.setIPrice(moOrderCK.getIPrice());
+		orderOut.setIMoney(DoubleOperation.mul(orderOut.getIPrice(), orderOut.getIQuantity(), 2));
+		orderOut.setCInvName(moOrderCK.getCInvNameOut());
+		orderOut.setCInvCode(moOrderCK.getCInvCodeOut());
+		orderOut.setCColor(moOrderCK.getCColorOut());
+		orderOut.setCBatch(moOrderCK.getCBatchOut());
+		orderOut.setCWhCode("");
+		orderOut.setCWhName("");
+		orderOut.setCVenAbbName(moOrderCK.getCOmVenAbbName());
+		if ("期初".equalsIgnoreCase(orderOut.getCBatch())){
+			orderOut.setCPlanCode("期初");
+		}else if ("杂纱".equalsIgnoreCase(orderOut.getCInvName())){
+			orderOut.setCPlanCode("杂纱");
+		}
+		return orderOut;
+
+	}
 }

+ 25 - 9
jeecg-boot-module-system/src/main/java/org/jeecg/modules/report/mapper/FabricLossMapper.java

@@ -58,18 +58,18 @@ public interface FabricLossMapper extends BaseMapper<FabricLoss> {
 	List<FabricPoOrder> getPurchaseList(@Param("code")String code);
 
 	//其他入库纱,找委外订单的材料出库单,获取物料号+批号,物料号+批号再其他入库单
-	@DS("multi-three")
-	List<FabricPoOrderOut> getPurchaseListOtherInList(@Param("code")String code);
+//	@DS("multi-three")
+//	List<FabricPoOrderOut> getPurchaseListOtherInList(@Param("code")String code);
 
 	//来源余纱,找委外订单的材料出库单,获取物料号+批号。如果物料号+批号在形态转换单中,取转换前物料+批号。判断物料+批号,是否在其他采购入库里
-	@DS("multi-three")
-	List<FabricPoOrderOut> getPurchaseListOtherPurInList(@Param("code")String code);
+//	@DS("multi-three")
+//	List<FabricPoOrderOut> getPurchaseListOtherPurInList(@Param("code")String code);
 	// 获取所有委外订单
 	@DS("multi-three")
 	List<FabricOMOrder> getOmOrderListAll(@Param("code")String code);
-	// 获取销售出库委外订单:物料+颜色在销售出库表中
+	// 获取销售出库委外订单子表id
 	@DS("multi-three")
-	List<FabricOMOrder> getOmOrderListGw(@Param("code")String code);
+	List<String> getOmOrderListGw(@Param("code")String code);
 	// 获取委外材料出库单,已核销的取核销数量
 	@DS("multi-three")
 	List<Map<String,Object>> getOmOutList(@Param("code")String code);
@@ -157,11 +157,11 @@ public interface FabricLossMapper extends BaseMapper<FabricLoss> {
 	List<FabricAccident> getAccidentList(@Param("code")String code);
 
 	// 获取形态转换入库的原始入库单,可能存在多次形态转换,需要多次调用
-	@DS("multi-three")
-	List<Map<String,Object>> getOrgInList(@Param("invIdList")List<String> invIdList);
+//	@DS("multi-three")
+//	List<Map<String,Object>> getOrgInList(@Param("invIdList")List<String> invIdList);
 	// 根据委外订单子表id,获取处理费,入库数量,出库物料id,出库数量
 	@DS("multi-three")
-	List<Map<String,Object>> getOmInOutInfoListByDetailId(@Param("detailIdList")List<String> detailIdList);
+	List<Map<String,Object>> getOmInOutInfoListByDetailId(@Param("detailIdList")List<Integer> detailIdList);
 
 	// 获取委外入库物料被其他委外订单使用明细
 	@DS("multi-three")
@@ -172,4 +172,20 @@ public interface FabricLossMapper extends BaseMapper<FabricLoss> {
 	// 获取本次委外入库的形态转换
 	@DS("multi-three")
 	List<Map<String,Object>> getMoAssemVouchList(@Param("code")String code);
+
+	// 获取形态转换物料的原始入库单
+	@DS("multi-three")
+	List<FabricAssemVouchsOrgIn> getAssemVouchsOrgInList(@Param("invIdList")List<String> invIdList);
+	// 根据入库单子表id获取采购入库价格
+	@DS("multi-three")
+	List<FabricInPrice> getPoInPriceList(@Param("autoIdList")List<Integer> autoIdList);
+	// 根据入库单子表id获取其他入库价格
+	@DS("multi-three")
+	List<FabricInPrice> getOtherInPriceList(@Param("autoIdList")List<Integer> autoIdList);
+	// 根据委外订单子表id获取委外出库信息,用于计算其他委外订单
+	@DS("multi-three")
+	List<FabricMoOrderCK> getOmRowOutListByDetailId(@Param("detailIdList")List<Integer> detailIdList);
+	// 采购入库、委外入库、转换入库、其他入库
+	@DS("multi-three")
+	List<FabricCommonIn> getInListByInvId(@Param("invIdList")List<String> invIdList);
 }

+ 168 - 44
jeecg-boot-module-system/src/main/java/org/jeecg/modules/report/mapper/xml/FabricLossMapper.xml

@@ -15,6 +15,7 @@
 		and
 		exists (select x.cVenCode from Vendor x where x.cVenCode=om_momain.cVenCode and x.cVCCode='0105')
 		and cCode like CONCAT(#{code},'%')
+		and (cCloser is null or cCloser='asuser')
 	</select>
 	<!-- 制单人 103的委外发票制单人 -->
 	<select id="getMakingPeople" resultType="java.lang.String">
@@ -25,6 +26,7 @@
 			exists (select x.moid from om_mobody x inner join Inventory y on x.cinvcode=y.cinvcode where x.moid=om_momain.moid and
 			(y.cInvCCode like '01%' or y.cInvCCode like '02%' or y.cInvCCode like '03%' or y.cInvCCode like '04%')   )
 			and cCode like CONCAT(#{code},'%')
+			and (cCloser is null or cCloser='asuser')
 		)
 		)
 	</select>
@@ -80,6 +82,7 @@
 		) as t1 group by cVenName,cVenAbbName,cPOID,cInvCode,cInvName,cColor<!--,cBatch-->
 	</select>
 	<!-- 其他入库纱,找委外订单的材料出库单,获取物料号+批号,物料号+批号再其他入库单 -->
+	<!--
 	<select id="getPurchaseListOtherInList" resultType="org.jeecg.modules.report.entity.FabricPoOrderOut">
 		(
 			SELECT
@@ -184,8 +187,9 @@
 				a.comcode LIKE CONCAT(#{code},'%') and
 				d.cinvname='杂纱' and a.iquantity>0
 		)
-	</select>
+	</select>-->
 	<!-- 来源余纱,找委外订单的材料出库单,获取物料号+批号。如果物料号+批号在形态转换单中,取转换前物料+批号。判断物料+批号,是否在其他采购入库里 -->
+	<!--
 	<select id="getPurchaseListOtherPurInList" resultType="org.jeecg.modules.report.entity.FabricPoOrderOut">
 
 		(
@@ -280,7 +284,7 @@
 					where d.cPOID like CONCAT(#{code},'%') and a.cbustype='普通采购')
 			) and a.iQuantity&lt;&gt;0
 		)
-	</select>
+	</select>-->
 	<!--获取所有委外订单 cComUnitCode : 计量单位,02(PCS)根,04(M)米-->
 	<select id="getOmOrderListAll" resultType="org.jeecg.modules.report.entity.FabricOMOrder">
 
@@ -301,18 +305,10 @@
 			order by e.cVCName,d.cVenName,c.cInvCode,c.cInvName,c.cComUnitCode,b.cFree1,b.cdefine30
 
 	</select>
-	<!--获取销售出库委外订单:物料+颜色在销售出库表中,cComUnitCode : 计量单位,02(PCS)根,04(M)米-->
-	<select id="getOmOrderListGw" resultType="org.jeecg.modules.report.entity.FabricOMOrder">
-		select cVCName,cVenName ,cVenAbbName ,cVenCode ,cColorNumber,cInvCode,cInvName,cComUnitCode,cColor,
-			isnull(sum(iQuantityOut),0) as iQuantityOut,
-			isnull(sum(iQuantity),0) as iQuantity,
-			isnull(sum(iQuantityIn),0) as iQuantityIn
-		from
-		(
-			SELECT e.cVCName,d.cVenName ,d.cVenAbbName ,a.cVenCode ,c.cInvCode,c.cInvName,c.cComUnitCode,b.cFree1 as cColor,
-				(select sum(iQuantity) from rdrecords11 x where x.iOMoDID=b.MODetailsID) as iQuantityOut,
-				(select sum(iQuantity) from RdRecords01 x where x.iOMoDID=b.MODetailsID) as iQuantityIn,
-				b.iQuantity,b.MODetailsID,isnull(b.cdefine30,'') as cColorNumber
+	<!--获取销售出库委外订单行id-->
+	<select id="getOmOrderListGw" resultType="String">
+
+			SELECT b.MODetailsID
 			FROM
 				om_momain a
 				INNER JOIN OM_MODetails b ON a.moid = b.moid
@@ -325,8 +321,6 @@
 				and b.cInvCode+isnull(b.cFree1,'') in (
 				select cInvCode+isnull(cFree1,'') from rdrecords32 where cbatch like CONCAT(#{code},'%')
 				)
-		) as t1 group by cVCName,cVenName,cVenAbbName,cVenCode,cColorNumber,cInvCode,cInvName,cComUnitCode,cColor
-		order by cVCName,cVenName,cColorNumber,cInvCode,cInvName,cComUnitCode,cColor
 
 	</select>
 	<!--获取本次采购入库的委外材料出库单,已核销的取核销数量-->
@@ -385,14 +379,18 @@
 	</select>
 	<!--获取本次采购入库单,含发票和结算数据-->
 	<select id="getPurchaseInList" resultType="org.jeecg.modules.report.entity.FabricPoOrderIn">
-		select a.cCode,a.cBusType,b.cInvCode,isnull(b.cFree1,'') as cColor,b.cBatch,b.iQuantity,e.cInvName,
-		isnull((select sum(iPBVQuantity ) from PurBillVouchs x where x.RdsId =b.autoid),0) as iQuantityInvoice,
-		isnull(isnull((select sum(iSum)/sum(iPBVQuantity ) from PurBillVouchs  x where x.RdsId =b.autoid),b.iSum/b.iQuantity),0) as iPrice,
-		isnull((select sum(iSVQuantity) from PurSettleVouchs  x where x.iRdsID=b.autoid),0) as iQuantitySettle
+		select a.cCode,a.cBusType,b.cInvCode,isnull(b.cFree1,'') as cColor,isnull(b.cBatch,'') as cBatch,b.iQuantity,e.cInvName,
+		isnull(b.iSumBillQuantity,0) as iQuantityInvoice,
+		isnull(isnull((select sum(x.iSum)/sum(x.iPBVQuantity ) from PurBillVouchs  x where x.RdsId =b.autoid),b.iSum/b.iQuantity),0) as iPrice,
+		isnull(isnull((select sum(x.iSum) from PurBillVouchs  x where x.RdsId =b.autoid),b.iSum ),0) as iPurchuseMoney,
+		isnull(b.iSQuantity,0) as iQuantitySettle,
+		g.cVCName,f.cVenName ,f.cVenAbbName,isnull(d.cPOID,'') as cPlanCode,e.cInvCCode
 		from RdRecord01 a inner join RdRecords01 b on a.id=b.id
 		inner join PO_Podetails c on  b.iposid=c.id
 		inner join PO_Pomain d on d.poid=c.poid
 		inner join Inventory e on b.cinvcode=e.cinvcode
+		inner join Vendor f on f.cVenCode=a.cVenCode
+		inner join VendorClass g on g.cVCCode =f.cVCCode
 		where d.cPOID like CONCAT(#{code},'%')
 	</select>
 	<!--获取费用支出-->
@@ -602,20 +600,24 @@
 	</select>-->
 	<!--委外订单-采购入库详情-->
 	<select id="getOmInDetailList" resultType="org.jeecg.modules.report.entity.FabricMoOrderRK">
-		select a.cCode,b.MODetailsID,
-			 x.cInvCode as cInvCode,y.cInvName as cInvName,x.cFree1 as cColor,x.cBatch as cBatch,
+		select isnull(a.cCode,'') as cPlanCode,z.cCode,b.MODetailsID,
+		d.cVCName,c.cVenName,c.cVenAbbName,
+			 x.cInvCode as cInvCode,y.cInvName as cInvName,isnull(x.cFree1,'') as cColor,isnull(x.cBatch,'') as cBatch,
 			 isnull(x.iQuantity,0) as iQuantityIn,
 			 isnull(isnull((select  sum(n.iSum) from  PurBillVouchs  n where n.RdsId =x.autoid),x.iProcessFee),0) as iProcessFee,
 			 isnull(x.iSumBillQuantity,0) as iSumBillQuantity,isnull(x.iSQuantity,0) as iSQuantity,
-			 (select sum(isnull(iquantity,0)) as iQuantityOut from rdrecords11 d where d.iOMoDID=b.MODetailsID) as iQuantityOut
+			 (select sum(isnull(iquantity,0)) as iQuantityOut from rdrecords11 d where d.iOMoDID=b.MODetailsID) as iQuantityOut,
+			 y.cInvCCode
 		FROM
 		om_momain a
 		INNER JOIN OM_MODetails b ON a.moid = b.moid
-		INNER JOIN Inventory c ON b.cinvcode = c.cinvcode
 		inner join RdRecords01 x on x.iOMoDID=b.MODetailsID
+		inner join rdrecord01 z on  x.id=z.id
 		INNER JOIN Inventory y ON x.cinvcode = y.cinvcode
+		inner join Vendor c on c.cVenCode=z.cVenCode
+			inner join VendorClass d on d.cVCCode =c.cVCCode
 		WHERE
-		c.cInvCCode NOT LIKE '19%'
+		y.cInvCCode NOT LIKE '19%'
 		AND a.cCode LIKE CONCAT(#{code},'%')
 
 	</select>
@@ -643,7 +645,7 @@
 	<!-- 获取委外订单行id,入库物料编号+颜色,处理费用,入库数量 -->
 	<select id="getOmRowInfoList" resultType="map">
 		select b.MODetailsID,
-			 (select top 1  x.cInvCode+isnull(x.cFree1,'') from  rdrecords01 x where x.iOMoDID=b.MODetailsID) as cInvCodeColorIn,
+			 b.cinvcode+isnull(b.cfree1,'') as cInvCodeColorIn,
 			 isnull((select  isnull(sum(y.iSum),sum(x.iProcessFee)) from  rdrecords01 x inner join PurBillVouchs  y on y.RdsId =x.autoid where x.iOMoDID=b.MODetailsID),0) as iProcessFee,
 			 isnull((select  sum(x.iQuantity) from  rdrecords01 x where x.iOMoDID=b.MODetailsID),0) as iQuantityIn
 
@@ -654,25 +656,27 @@
 		WHERE
 		c.cInvCCode NOT LIKE '19%'
 		AND a.cCode LIKE CONCAT(#{code},'%')
-		and exists (select * from  rdrecords01 x where x.iOMoDID=b.MODetailsID)
+		<!--and exists (select * from  rdrecords01 x where x.iOMoDID=b.MODetailsID)-->
 	</select>
 	<!-- 获取委外订单行id,出库物料信息,出库数量 -->
 	<select id="getOmRowOutList" resultType="org.jeecg.modules.report.entity.FabricMoOrderCK">
 		select b.MODetailsID,
 			 d.cInvCode as cInvCodeOut,z.cInvName as cInvNameOut,isnull(d.cFree1,'') as cColorOut,
 			 isnull(d.cBatch,'') as cBatchOut,
-			 isnull(sum(d.iQuantity),0) as iQuantityOut
+			 isnull(sum(d.iQuantity),0) as iQuantityOut,
+			 c.cInvCCode as cInvCCodeOut,a.cCode as cOmCode,x.cVenAbbName as cOmVenAbbName
 		FROM
 		om_momain a
 		INNER JOIN OM_MODetails b ON a.moid = b.moid
 		INNER JOIN Inventory c ON b.cinvcode = c.cinvcode
 		inner join rdrecords11 d on d.iOMoDID=b.MODetailsID
 		INNER JOIN Inventory z ON d.cinvcode = z.cinvcode
+		inner join Vendor x on x.cVenCode=a.cVenCode
 		WHERE
 		c.cInvCCode NOT LIKE '19%'
 		AND a.cCode LIKE CONCAT(#{code},'%')
 		group by b.MODetailsID,
-			 d.cInvCode,z.cInvName,d.cFree1,d.cBatch
+			 d.cInvCode,z.cInvName,d.cFree1,d.cBatch,c.cInvCCode,a.cCode,x.cVenAbbName
 			 having sum(d.iQuantity)>0
 	</select>
 	<!-- 获取委外订单出库物料的入库物料信息:包含采购入库、委外入库 -->
@@ -858,7 +862,7 @@
 	</select>
 	<!-- 获取委外订单国内出库数量 -->
 	<select id="getOmInGnOutList" resultType="org.jeecg.modules.report.entity.FabricPoOrderOut">
-		select b.cInvCode,b.cFree1 as cColor,b.cBatch,b.iQuantity from rdrecord09 a inner join rdrecords09 b
+		select b.cInvCode,isnull(b.cFree1,'') as cColor,isnull(b.cBatch,'') as cBatch,b.iQuantity from rdrecord09 a inner join rdrecords09 b
 		on a.id=b.id where a.cbustype='调拨出库'
 		and b.cinvCode+isnull(cfree1,'')+isnull(cbatch,'') in
 		<foreach  item="item" collection="invIdList" index="index"  open="(" separator="," close=")">
@@ -868,7 +872,7 @@
 	</select>
 	<!-- 获取委外订单国外出库数量 -->
 	<select id="getOmInGwOutList" resultType="org.jeecg.modules.report.entity.FabricPoOrderOut">
-		select b.cInvCode,b.cFree1 as cColor,b.cBatch,b.iQuantity from rdrecord32  a inner join rdrecords32 b
+		select b.cInvCode,isnull(b.cFree1,'') as cColor,isnull(b.cBatch,'') as cBatch,b.iQuantity from rdrecord32  a inner join rdrecords32 b
 		on a.id=b.id
 		where b.cinvCode+isnull(cfree1,'')+isnull(cbatch,'') in
 		<foreach  item="item" collection="invIdList" index="index"  open="(" separator="," close=")">
@@ -889,27 +893,28 @@
 
 	</select>
 	<!-- 获取形态转换入库的原始入库单,可能存在多次形态转换,需要多次调用 -->
-	<select id="getOrgInList" resultType="map">
+	<!--
+	<select id="getOrgInList" resultType="org.jeecg.modules.report.entity.FabricCommonIn">
 
 		(
-		select  b.autoid,a.cBusType,b.cInvCode+isnull(b.cFree1,'')+isnull(b.cBatch,'') as cInvIdBefore,b.iQuantity,
+		select  b.AutoId,a.cBusType,b.cInvCode+isnull(b.cFree1,'')+isnull(b.cBatch,'') as cInvIdBefore,b.iQuantity,
 		case when a.cbustype='委外加工' then 0 else
 		isnull(isnull((select sum(iSum) from PurBillVouchs  x where x.RdsId =b.autoid),iSum ),0)
 		end as iPurchuseMoney,
-		c.cInvCode2+c.cColor2+c.cAVBatch2 as cInvIdAfter
-
-		from VIEW_FabricLoss_AssemVouchs c,rdrecords01 b,rdrecord01 a
-		where a.id=b.id
+		c.cInvCode2+c.cColor2+c.cAVBatch2 as cInvIdAfter,b.cPOID as cCode,isnull(b.iOMoDID,0) as iOMoDID,
+		d.cVenName,d.cVenAbbName,e.cVCName
+		from VIEW_FabricLoss_AssemVouchs c,rdrecords01 b,rdrecord01 a,Vendor d, VendorClass e
+		where a.id=b.id and d.cVenCode=a.cVenCode and d.cVCCode =e.cVCCode
 		and c.cinvcode+ccolor+cavbatch=b.cinvcode +isnull(b.cFree1,'')+isnull(b.cBatch,'') and b.iQuantity &lt;&gt; 0
 		and c.cInvCode2+c.cColor2+c.cAVBatch2 in
 		<foreach  item="item" collection="invIdList" index="index"  open="(" separator="," close=")">
 			#{item}
 		</foreach>
 		) union all (
-		select  b.autoid,a.cBusType,b.cInvCode+isnull(b.cFree1,'')+isnull(b.cBatch,'') as cInvIdBefore,b.iQuantity,
+		select  b.AutoId,a.cBusType,b.cInvCode+isnull(b.cFree1,'')+isnull(b.cBatch,'') as cInvIdBefore,b.iQuantity,
 		isnull(case when a.cMaker='王行乔' then b.iPrice else b.iPrice*1.13 end,0) as iPurchuseMoney,
-		c.cInvCode2+c.cColor2+c.cAVBatch2 as cInvIdAfter
-
+		c.cInvCode2+c.cColor2+c.cAVBatch2 as cInvIdAfter,'' as cCode,0 as iOMoDID
+		'' as cVenName,'' as cVenAbbName,'' as cVCName
 		from VIEW_FabricLoss_AssemVouchs c,rdrecords08 b,rdrecord08 a
 		where a.id=b.id
 		and c.cinvcode+ccolor+cavbatch=b.cinvcode +isnull(b.cFree1,'')+isnull(b.cBatch,'') and a.cbustype &lt;&gt; '调拨入库'
@@ -921,6 +926,69 @@
 		)
 
 
+	</select>-->
+	<!-- 获取形态转换物料的原始入库单 -->
+	<select id="getAssemVouchsOrgInList" resultType="org.jeecg.modules.report.entity.FabricAssemVouchsOrgIn">
+
+		(
+		select  'rdrecords01' as cTableName,b.AutoId,a.cBusType,
+		b.cInvCode+isnull(b.cFree1,'')+isnull(b.cBatch,'') as cInvIdBefore,
+		c.cInvCode2+c.cColor2+c.cAVBatch2 as cInvIdAfter
+		from VIEW_FabricLoss_AssemVouchs c,rdrecords01 b,rdrecord01 a,Vendor d, VendorClass e
+		where a.id=b.id and d.cVenCode=a.cVenCode and d.cVCCode =e.cVCCode
+		and c.cinvcode+ccolor+cavbatch=b.cinvcode +isnull(b.cFree1,'')+isnull(b.cBatch,'') and b.iQuantity &lt;&gt; 0
+		and c.cInvCode2+c.cColor2+c.cAVBatch2 in
+		<foreach  item="item" collection="invIdList" index="index"  open="(" separator="," close=")">
+			#{item}
+		</foreach>
+		) union all (
+		select  'rdrecords08' as cTableName,b.AutoId,a.cBusType,
+		b.cInvCode+isnull(b.cFree1,'')+isnull(b.cBatch,'') as cInvIdBefore,
+		c.cInvCode2+c.cColor2+c.cAVBatch2 as cInvIdAfter
+		from VIEW_FabricLoss_AssemVouchs c,rdrecords08 b,rdrecord08 a
+		where a.id=b.id
+		and c.cinvcode+ccolor+cavbatch=b.cinvcode +isnull(b.cFree1,'')+isnull(b.cBatch,'') and a.cbustype= '其他入库'
+		and b.iQuantity &lt;&gt; 0
+		and c.cInvCode2+c.cColor2+c.cAVBatch2 in
+		<foreach  item="item" collection="invIdList" index="index"  open="(" separator="," close=")">
+			#{item}
+		</foreach>
+		) union all (
+		select  'rdrecords08' as cTableName,b.AutoId,a.cBusType,
+		b.cInvCode+isnull(b.cFree1,'')+isnull(b.cBatch,'') as cInvIdBefore,
+		c.cInvCode2+c.cColor2+c.cAVBatch2 as cInvIdAfter
+		from VIEW_FabricLoss_AssemVouchs c,rdrecords08 b,rdrecord08 a
+		where a.id=b.id
+		and c.cinvcode+ccolor+cavbatch=b.cinvcode +isnull(b.cFree1,'')+isnull(b.cBatch,'') and a.cbustype = '转换入库'
+		and b.iQuantity &lt;&gt; 0
+		and c.cInvCode2+c.cColor2+c.cAVBatch2 in
+		<foreach  item="item" collection="invIdList" index="index"  open="(" separator="," close=")">
+			#{item}
+		</foreach>
+		)
+
+
+	</select>
+	<!-- 根据入库单子表id获取采购入库价格 -->
+	<select id="getPoInPriceList" resultType="org.jeecg.modules.report.entity.FabricInPrice">
+		select  b.AutoId,
+		isnull(isnull((select sum(iSum)/sum(iPBVQuantity ) from PurBillVouchs  x where x.RdsId =b.autoid),b.iSum/b.iQuantity),0) as iPrice
+		from rdrecords01 b
+		where b.autoId in
+		<foreach  item="item" collection="autoIdList" index="index"  open="(" separator="," close=")">
+			#{item}
+		</foreach>
+	</select>
+	<!-- 根据入库单子表id获取其他入库价格 -->
+	<select id="getOtherInPriceList" resultType="org.jeecg.modules.report.entity.FabricInPrice">
+		select  b.AutoId,
+		isnull(case when a.cMaker='王行乔' then b.iPrice/b.iQuantity else b.iPrice*1.13/b.iQuantity end,0) as iPrice
+		from rdrecords08 b
+		inner join rdrecord08 a on  a.id=b.id
+		where b.autoId in
+		<foreach  item="item" collection="autoIdList" index="index"  open="(" separator="," close=")">
+			#{item}
+		</foreach>
 	</select>
 	<!-- 根据委外订单子表id,获取处理费,入库数量,出库物料id,出库数量 -->
 	<select id="getOmInOutInfoListByDetailId" resultType="map">
@@ -949,7 +1017,7 @@
 		select b.cinvcode+isnull(b.cfree1,'')+isnull(b.cbatch,'') from RdRecords01 b
 		INNER JOIN OM_MODetails e on b.iOMoDID=e.MODetailsID
 		inner join om_momain f on f.moid = e.moid
-		where f.cCode like CONCAT(#{code},'%')
+		where f.cCode like CONCAT(#{code},'%') and (f.cCloser is null or f.cCloser='asuser')
 		)
 		or cInvCode+isnull(cFree1,'')+isnull(cbatch,'') in (
 		select cInvCode2+isnull(cColor2,'')+isnull(cAVBatch2,'') from VIEW_FabricLoss_AssemVouchs where
@@ -957,7 +1025,7 @@
 		select b.cinvcode+isnull(b.cfree1,'')+isnull(b.cbatch,'') from RdRecords01 b
 		INNER JOIN OM_MODetails e on b.iOMoDID=e.MODetailsID
 		inner join om_momain f on f.moid = e.moid
-		where f.cCode like CONCAT(#{code},'%')
+		where f.cCode like CONCAT(#{code},'%') and (f.cCloser is null or f.cCloser='asuser')
 		)
 		)
 		)
@@ -976,7 +1044,7 @@
 				inner join OM_MODetails p on o.moid  =p.moid
 				inner join Inventory q on p.cInvCode=q.cInvCode
 				inner join RdRecords01 r on r.iOMoDID=p.MODetailsID
-				where o.cCode like CONCAT(#{code},'%')
+				where o.cCode like CONCAT(#{code},'%') and (o.cCloser is null or o.cCloser='asuser')
 		)
 	</select>
 	<!--获取本次委外入库的形态转换-->
@@ -987,8 +1055,64 @@
 			select cInvCode+isnull(cBatch,'')+isnull(cFree1,'')  from RdRecords01
 			where iOMoDID in (
 			select b.MODetailsID from om_momain a inner join OM_MODetails b on a.moid  =b.moid
-			and a.cCode like CONCAT(#{code},'%')
+			and a.cCode like CONCAT(#{code},'%') and (a.cCloser is null or a.cCloser='asuser')
 			)
 		)
 	</select>
+	<!-- 根据委外订单子表id获取委外出库信息,用于计算其他委外订单 -->
+	<select id="getOmRowOutListByDetailId" resultType="org.jeecg.modules.report.entity.FabricMoOrderCK">
+		select b.MODetailsID,
+			 d.cInvCode as cInvCodeOut,z.cInvName as cInvNameOut,isnull(d.cFree1,'') as cColorOut,
+			 isnull(d.cBatch,'') as cBatchOut,
+			 isnull(sum(d.iQuantity),0) as iQuantityOut,z.cInvCCode as cInvCCodeOut
+		FROM
+		OM_MODetails b
+		INNER JOIN Inventory c ON b.cinvcode = c.cinvcode
+		inner join rdrecords11 d on d.iOMoDID=b.MODetailsID
+		INNER JOIN Inventory z ON d.cinvcode = z.cinvcode
+		WHERE
+		b.MODetailsID in
+		<foreach  item="item" collection="detailIdList" index="index"  open="(" separator="," close=")">
+			#{item}
+		</foreach>
+		group by  b.MODetailsID,d.cInvCode,z.cInvName,d.cFree1,d.cBatch,z.cInvCCode
+	</select>
+	<!-- 根据物料id获取入库信息:采购入库、委外入库、转换入库、其他入库 -->
+	<select id="getInListByInvId" resultType="org.jeecg.modules.report.entity.FabricCommonIn">
+
+		(
+		select  b.AutoId,a.cCode,isnull(b.cPOID,'') as cPlanCode,a.cBusType,e.cVCName,d.cVenName,d.cVenAbbName,
+		b.cInvCode,isnull(b.cFree1,'') as cColor,isnull(b.cBatch,'') as cBatch,f.cInvName,b.iQuantity,
+		case when a.cbustype='委外加工' then 0 else
+		isnull(isnull((select sum(iSum)/sum(iPBVQuantity ) from PurBillVouchs  x where x.RdsId =b.autoid),b.iSum/b.iQuantity),0)  end
+		as iPrice,
+		isnull(b.iOMoDID,0) as MODetailsID,isnull(b.iPOsID,0) as PoDetailsID,f.cInvCCode
+
+		from rdrecords01 b
+			inner join rdrecord01 a on  a.id=b.id
+			inner join Vendor d on d.cVenCode=a.cVenCode
+			inner join VendorClass e on d.cVCCode =e.cVCCode
+			inner join Inventory  f ON b.cinvcode = f.cinvcode
+		where  b.cInvCode + isnull(b.cFree1,'') + isnull(b.cBatch,'')  in
+		<foreach  item="item" collection="invIdList" index="index"  open="(" separator="," close=")">
+			#{item}
+		</foreach>
+		) union all (
+		select  b.AutoId,a.cCode, isnull(a.cdefine9,'') as cPlanCode,a.cBusType,'' as cVCName,'' as cVenName,'' as cVenAbbName,
+		b.cInvCode,isnull(b.cFree1,'') as cColor,isnull(b.cBatch,'') as cBatch,f.cInvname,b.iQuantity,
+		isnull(case when a.cMaker='王行乔' then b.iPrice/b.iQuantity else b.iPrice*1.13/b.iQuantity end,0) as iPrice,
+		0 as MODetailsID, 0 as PoDetailsID,f.cInvCCode
+		from rdrecords08 b
+		inner join rdrecord08 a on  a.id=b.id
+		inner join Inventory  f ON b.cinvcode = f.cinvcode
+		where  b.iQuantity&lt;&gt;0 and a.cbustype &lt;&gt; '调拨入库' and
+		b.cInvCode + isnull(b.cFree1,'') + isnull(b.cBatch,'')  in
+		<foreach  item="item" collection="invIdList" index="index"  open="(" separator="," close=")">
+			#{item}
+		</foreach>
+
+		)
+
+
+	</select>
 </mapper>

+ 1183 - 692
jeecg-boot-module-system/src/main/java/org/jeecg/modules/report/service/impl/FabricLossServiceImpl.java

@@ -78,198 +78,19 @@ public class FabricLossServiceImpl extends ServiceImpl<FabricLossMapper, FabricL
 			ret.setSuccess(true);
 			ret.setCCode(code);
 
-			List<String> lstContractNo = new ArrayList<>(); // 成衣合同号
-			List<String> lstCdefine22 = new ArrayList<>();  // 款号
-			List<String> lstCpersonName = new ArrayList<>(); // 业务员
-
-			List<FabricLoss> fabricLossList = fabricLossMapper.getFabricLossData(code);
-			for (FabricLoss fabricLoss : fabricLossList){
-				if (oConvertUtils.isNotEmpty(fabricLoss.getContractNo()) &&
-						!lstContractNo.contains(fabricLoss.getContractNo())){
-					lstContractNo.add(fabricLoss.getContractNo());
-				}
-				if (oConvertUtils.isNotEmpty(fabricLoss.getCDefine22()) &&
-						!lstCdefine22.contains(fabricLoss.getCDefine22())){
-					lstCdefine22.add(fabricLoss.getCDefine22());
-				}
-				if (oConvertUtils.isNotEmpty(fabricLoss.getCPersonName()) &&
-						!lstCpersonName.contains(fabricLoss.getCPersonName())){
-					lstCpersonName.add(fabricLoss.getCPersonName());
-				}
-			}
-			if (lstContractNo.size()>0){
-				ret.setContractNo(String.join(",",lstContractNo));
-			}
-			if (lstCdefine22.size()>0){
-				ret.setCDefine22(String.join(",",lstCdefine22));
-			}
-			if (lstCpersonName.size()>0){
-				ret.setCPersonName(String.join(",",lstCpersonName));
-			}
-			//制单人
-			LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
-			ret.setMakingPeople(sysUser.getRealname());
-			/*
-			List<String> makingPeople = fabricLossMapper.getMakingPeople(code);
-			if (oConvertUtils.listIsNotEmpty(makingPeople)){
-				ret.setMakingPeople(String.join(",", makingPeople));
-			}*/
-			//计划员
-			List<String> planner = fabricLossMapper.getPlanner(code);
-			if (oConvertUtils.listIsNotEmpty(planner)){
-				ret.setPlanner(String.join(",", planner));
-			}
-			// 日期
-			ret.setDateTime(DateUtils.getDate());
-			// 排单数量
-			ret.setNumber(oConvertUtils.getDouble(fabricLossMapper.getNumber(code),0));
-			// 销售出库数量
-			Double dOutSum = oConvertUtils.getDouble(fabricLossMapper.getSaleOutSum(code),0);
-			if (dOutSum>ret.getNumber()) {
-				dOutSum = ret.getNumber();
-			}
-			ret.setOutboundNumber(dOutSum);
-			// 销售订单附件
-			List<AccessorItem> accessorItemList = fabricLossMapper.getSoAccList(ret.getContractNo());
-			accessorItemList.forEach(e->e.setFileurl("/report/FabricLoss/getFile?fileId="+e.getCFileId()+"&filename="+e.getFilename()));
-			ret.setAccessorItemList(accessorItemList);
-			// 委外订单附件
-			List<AccessorItem> omAccList = fabricLossMapper.getOmAccList(code);
-			omAccList.forEach(e->e.setFileurl("/report/FabricLoss/getFile?fileId="+e.getCFileId()+"&filename="+e.getFilename()));
-
-			// 采购入库数据
-			List<FabricPoOrder> fabricPoOrderListTmp = fabricLossMapper.getPurchaseList(code);
-			//采购数据把不同订单合并
-			List<FabricPoOrder> fabricPoOrderList= new ArrayList<>();
-			for (FabricPoOrder fabricPoOrder: fabricPoOrderListTmp){
-				String cInvName = fabricPoOrder.getCInvName();
-				Optional<FabricPoOrder> findItemOpt = fabricPoOrderList.stream().filter(e->e.getCInvName().equals(cInvName)).findFirst();
-				if (findItemOpt.isPresent()){
-					FabricPoOrder findItem = findItemOpt.get();
-					BigDecimal bNum = new BigDecimal(findItem.getIQuantityIn()+fabricPoOrder.getIQuantityIn());
-					findItem.setIQuantityIn(bNum.setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue());
-					bNum = new BigDecimal(findItem.getIQuantity()+fabricPoOrder.getIQuantity());
-					findItem.setIQuantity(bNum.setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue());
-					findItem.setCPOID(findItem.getCPOID()+","+fabricPoOrder.getCPOID());
-					if (findItem.getCVenAbbName().indexOf(fabricPoOrder.getCVenAbbName()) == -1){
-						findItem.setCVenAbbName(findItem.getCVenAbbName()+","+fabricPoOrder.getCVenAbbName());
-					}
-					if (findItem.getCVenName().indexOf(fabricPoOrder.getCVenName()) == -1){
-						findItem.setCVenName(findItem.getCVenName()+","+fabricPoOrder.getCVenName());
-					}
-				}else{
-					fabricPoOrderList.add(fabricPoOrder);
-				}
-			}
-			// 获取委外材料出库单,已核销的取核销数量
-			List<Map<String,Object>> fabricOmOutList = fabricLossMapper.getOmOutList(code);
-			// 获取本次采购入库的形态转换
-			List<Map<String,Object>> fabricAssemVouchList = fabricLossMapper.getAssemVouchList(code);
-			// 获取本次采购入库详情
-			List<FabricPoOrderIn> fabricPoOrderInList = fabricLossMapper.getPurchaseInList(code);
-			for (FabricPoOrderIn fabricPoOrderIn: fabricPoOrderInList){
-				BigDecimal bNum = new BigDecimal(fabricPoOrderIn.getIQuantity()-fabricPoOrderIn.getIQuantityInvoice());
-				fabricPoOrderIn.setIQuantityNInvoice(bNum.setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue());
-				bNum = new BigDecimal(fabricPoOrderIn.getIQuantity()-fabricPoOrderIn.getIQuantitySettle());
-				fabricPoOrderIn.setIQuantityNSettle(bNum.setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue());
-				bNum = new BigDecimal(fabricPoOrderIn.getIPrice());
-				fabricPoOrderIn.setIPrice(bNum.setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue());
-			}
-			// 采购入库被其他委外订单使用的信息
-			List<FabricPoOrderOut> fabricPoOrderOutList = fabricLossMapper.getPoOrderInToOther(code);
-			// 采购入库仓库库存
-			List<FabricPoOrderOut> poOrderStockList = fabricLossMapper.getPurchaseStockList(code);
-			// 采购订单设置分配数量、委外供应商、余纱、采购损耗
-			for (FabricPoOrder fabricPoOrder : fabricPoOrderList){
-				// 获取采购形态转换物料
-				List<Map<String, Object>> tmpAssemVouchList = fabricAssemVouchList.stream().filter(e->
-						oConvertUtils.getString(e.get("cInvCode")).equals(fabricPoOrder.getCInvCode()) &&
-						oConvertUtils.getString(e.get("cColor")).equals(fabricPoOrder.getCColor())).collect(Collectors.toList());
-				//&&
-				//								fabricPoOrder.getCBatch().indexOf(oConvertUtils.getString(e.get("cAVBatch")))>-1
-				// 未形态转换物料
-				List<Map<String, Object>> tmpOmOutList1 = fabricOmOutList.stream().filter(e->
-						oConvertUtils.getString(e.get("cInvCode")).equals(fabricPoOrder.getCInvCode()) &&
-						oConvertUtils.getString(e.get("cColor")).equals(fabricPoOrder.getCColor())).collect(Collectors.toList());
-				// &&
-				//								fabricPoOrder.getCBatch().indexOf(oConvertUtils.getString(e.get("cBatch")))>-1
-
-				// 形态转换物料
-				List<Map<String, Object>> tmpOmOutList2 = fabricOmOutList.stream().filter(out->{
-				return tmpAssemVouchList.stream().filter(e ->
-						oConvertUtils.getString(e.get("cInvCode2")).equals(oConvertUtils.getString(out.get("cInvCode"))) &&
-						oConvertUtils.getString(e.get("cColor2")).equals(oConvertUtils.getString(out.get("cColor")))
-				).count() > 0;
-				}).collect(Collectors.toList());
-				// &&
-				//								oConvertUtils.getString(e.get("cAVBatch2")).equals(oConvertUtils.getString(out.get("cBatch")))
-
-				tmpOmOutList1.addAll(tmpOmOutList2);
-
-				List<String> omcVenAbbNameList = new ArrayList<>();
-				double outSum = 0;
-				for (Map<String, Object> out : tmpOmOutList1){
-					outSum += oConvertUtils.getDouble(out.get("iQuantity").toString(),0);
-					String omcVenAbbName = oConvertUtils.getString(out.get("cVenAbbName").toString());
-					if (!omcVenAbbNameList.contains(omcVenAbbName)){
-						omcVenAbbNameList.add(omcVenAbbName);
-					}
-				}
-				if (omcVenAbbNameList.size()>0){
-					fabricPoOrder.setOmcVenAbbName(String.join(",", omcVenAbbNameList));
-				}
-
-				BigDecimal bOutSum = new BigDecimal(outSum);
-				outSum = bOutSum.setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue();
-				fabricPoOrder.setIQuantityOut(outSum);
-				double leftSum = fabricPoOrder.getIQuantityIn()-fabricPoOrder.getIQuantityOut();
-				BigDecimal bLeftSum = new BigDecimal(leftSum);
-				leftSum = bLeftSum.setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue();
-				fabricPoOrder.setIQuantityLeft(leftSum);
-				double leftRate = 0;
-				if (fabricPoOrder.getIQuantityIn() != 0) {
-					leftRate = leftSum / fabricPoOrder.getIQuantityIn();
-				}
-				BigDecimal bLeftRate = new BigDecimal(leftRate);
-				leftRate = bLeftRate.setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue();
-				fabricPoOrder.setIQuantityLeftRate(leftRate);
-
-				// 设置入库信息
-				List<FabricPoOrderIn> tmpFabricPoOrderInList = fabricPoOrderInList.stream().filter(e->
-						e.getCInvCode().equals(fabricPoOrder.getCInvCode()) &&
-						oConvertUtils.getString(e.getCColor()).equals(oConvertUtils.getString(fabricPoOrder.getCColor()))).collect(Collectors.toList());
-				fabricPoOrder.setFabricPoOrderInList(tmpFabricPoOrderInList);
-				// 设置被其他委外订单使用信息
-				List<FabricPoOrderOut> findFabricPoOrderOutList = fabricPoOrderOutList.stream().filter(e->
-						oConvertUtils.getString(e.getCInvCode()).equals(oConvertUtils.getString(fabricPoOrder.getCInvCode())) &&
-						oConvertUtils.getString(e.getCColor()).equals(oConvertUtils.getString(fabricPoOrder.getCColor()))).collect(Collectors.toList());
-				// 设置计划号,单价
-				for (FabricPoOrderOut item : findFabricPoOrderOutList){
-					String cCode = item.getCCode();
-					int index1 = cCode.indexOf("SY");
-					if (index1 == -1) {
-						continue;
-					}
-					int index2 = cCode.indexOf("-", index1);
-					if (index2 == -1) {
-						index2 = cCode.length();
-					}
-					item.setCPlanCode(cCode.substring(index1,index2));
-					if (tmpFabricPoOrderInList.size()>0){
-						item.setIPrice(tmpFabricPoOrderInList.get(0).getIPrice());
-						item.setIMoney(item.getIPrice()*item.getIQuantity());
-					}
-
-				}
-				// 设置仓库库存
-				List<FabricPoOrderOut> findPoOrderStockList = poOrderStockList.stream().filter(e->
-						fabricPoOrder.getCInvCode().equals(e.getCInvCode()) &&
-								oConvertUtils.getString(fabricPoOrder.getCColor()).equals(e.getCColor())).collect(Collectors.toList());
-				findFabricPoOrderOutList.addAll(findPoOrderStockList);
-
-				fabricPoOrder.setFabricPoOrderOutList(findFabricPoOrderOutList);
+			// 设置面损表头、不含总成本
+			setHeadInfo(ret);
+			// 设置采购入库订单,不含来源余纱和其他入库的纱。分配数量、余纱、采购损耗不设置,等委外出库使用再算
+			setPoOrderList(ret);
+			// 设置委外订单
+			setOmOrderList(ret, editData);
+			if (!ret.isSuccess()){
+				return ret;
 			}
+			// 根据委外订单设置分配数量、余纱、采购损耗,来源余纱、其他入库的纱
+			setPoOrderListByOmOrderList(ret);
 
+/*
 			// 采购入库-来源余纱
 			List<FabricPoOrder> lyysList = getPoOrderLyys(code);
 			fabricPoOrderList.addAll(lyysList);
@@ -346,106 +167,20 @@ public class FabricLossServiceImpl extends ServiceImpl<FabricLossMapper, FabricL
 								all.getCColor().equals(gw.getCColor())).count() >0;
 			}).collect(Collectors.toList());
 			ret.setFabricOMOrderList1(fabricOMOrderListGn);
-			ret.setFabricOMOrderList2(fabricOMOrderListGw);
+			ret.setFabricOMOrderList2(fabricOMOrderListGw);*/
 			// 费用支出单
 			List<FabricExpenses> fabricExpensesList = fabricLossMapper.getExpensesList(code);
 			ret.setFabricExpensesList(fabricExpensesList);
-			// 获取采购入库价格列表
-			List<FabricCostInvoice> fabricCostInvoiceList1 = fabricLossMapper.getPurchuseInPriceList(code);
-			List<FabricCostInvoice> fabricCostInvoiceList = new ArrayList<>();
-			for (FabricCostInvoice fabricCostInvoice : fabricCostInvoiceList1){
-				Optional<FabricCostInvoice> findItem = fabricCostInvoiceList.stream().filter(e->
-						e.getCVCName().equals(fabricCostInvoice.getCVCName())&&
-						e.getCVenAbbName().equals(fabricCostInvoice.getCVenAbbName())).findFirst();
-				FabricCostInvoice newItem = new FabricCostInvoice();
-				if (findItem.isPresent()) {
-					newItem = findItem.get();
-				}else{
-					newItem.setCBusType(fabricCostInvoice.getCBusType());
-					newItem.setIMoney(new Double(0));
-					newItem.setCVCName(fabricCostInvoice.getCVCName());
-					newItem.setCVenName(fabricCostInvoice.getCVenName());
-					newItem.setCVenAbbName(fabricCostInvoice.getCVenAbbName());
-					fabricCostInvoiceList.add(newItem);
-				}
-
-				Double money = newItem.getIMoney();
-				for (FabricOMOrder omOrder : fabricOMOrderList1){
-					List<FabricMoOrderCK> ckList = omOrder.getFabricMoOrderCKList();
-					if (ckList != null) {
-						List<FabricMoOrderCK> findList1 = ckList.stream().filter(e->
-								e.getCInvCodeOut().equals(fabricCostInvoice.getCInvCode()) &&
-										e.getCColorOut().equals(fabricCostInvoice.getCColor()) &&
-								e.getCBatchOut().equalsIgnoreCase(fabricCostInvoice.getCBatch())).collect(Collectors.toList());
-
-						for (FabricMoOrderCK ckItem : findList1) {
-							money+=ckItem.getIMoney();
-						}
-					}
-
-				}
-				BigDecimal bdValue = new BigDecimal(money);
-				newItem.setIMoney(bdValue.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
-
-			}
-
-			//获取委外订单发票金额
-			List<FabricCostInvoice> fabricCostInvoiceList2 = fabricLossMapper.getOmInvoiceMoneyList(code);
-			fabricCostInvoiceList.addAll(fabricCostInvoiceList2);
-			//获取委外订单运费发票金额
-			List<FabricCostInvoice> fabricCostInvoiceList3 = fabricLossMapper.getOmInvoiceMoneyYfList(code);
-			fabricCostInvoiceList.addAll(fabricCostInvoiceList3);
-			// 织、染、印排序
-			List<FabricCostInvoice> fabricCostInvoiceListOrder = new ArrayList<>();
-			List<FabricCostInvoice> fabricCostInvoiceListTmp = fabricCostInvoiceList.stream().filter(e->e.getCVCName().indexOf("织")==0).collect(Collectors.toList());
-			if (fabricCostInvoiceListTmp.size()>0){
-				fabricCostInvoiceListOrder.addAll(fabricCostInvoiceListTmp);
-			}
-			fabricCostInvoiceListTmp = fabricCostInvoiceList.stream().filter(e->e.getCVCName().indexOf("染")==0).collect(Collectors.toList());
-			if (fabricCostInvoiceListTmp.size()>0){
-				fabricCostInvoiceListOrder.addAll(fabricCostInvoiceListTmp);
-			}
-			fabricCostInvoiceListTmp = fabricCostInvoiceList.stream().filter(e->e.getCVCName().indexOf("印")==0).collect(Collectors.toList());
-			if (fabricCostInvoiceListTmp.size()>0){
-				fabricCostInvoiceListOrder.addAll(fabricCostInvoiceListTmp);
-			}
-			fabricCostInvoiceListTmp = fabricCostInvoiceList.stream().filter(e-> {
-				return fabricCostInvoiceListOrder.stream().filter(x->x.getCVCName().equals(e.getCVCName())).count()==0;
-			}).collect(Collectors.toList());
-			if (fabricCostInvoiceListTmp.size()>0){
-				fabricCostInvoiceListOrder.addAll(fabricCostInvoiceListTmp);
-			}
-			fabricCostInvoiceList = fabricCostInvoiceListOrder;
-			// 转入成本
-			fabricCostInvoiceList.addAll(getInCost(ret.getFabricPoOrderList(), fabricOMOrderListGn, fabricOMOrderListGw));
-			// 转出成本
-			List<FabricCostInvoice> outCostList = getOutCost(ret.getFabricPoOrderList(), fabricOMOrderListGn, fabricOMOrderListGw);
-			// 设置修改的工厂
-			if (editData != null){
-				List<FabricCostInvoice> editCostList = editData.getFabricCostInvoiceList();
-				if (oConvertUtils.listIsNotEmpty(editCostList)){
-					for (FabricCostInvoice item : outCostList){
-						Optional<FabricCostInvoice> findOpt = editCostList.stream().filter(e->e.getCVCName().equalsIgnoreCase(item.getCVCName()) &&
-								"转出成本".equalsIgnoreCase(e.getCBusType())).findFirst();
-						if (findOpt.isPresent()){
-							item.setCVenAbbName(findOpt.get().getCVenAbbName());
-						}
-					}
-				}
-			}
-			fabricCostInvoiceList.addAll(outCostList);
-
-
-			ret.setFabricCostInvoiceList(fabricCostInvoiceList);
+			// 成本发票
+			setCostInvoiceList(ret, editData);
 			// 计算单件成本
-			Double costInTotal = fabricCostInvoiceList.stream().mapToDouble(FabricCostInvoice::getIMoney).sum();
+			Double costInTotal = ret.getFabricCostInvoiceList().stream().mapToDouble(FabricCostInvoice::getIMoney).sum();
 			BigDecimal dVal = new BigDecimal(costInTotal);
 			ret.setActualMoney(dVal.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
 			BigDecimal bdPriceReal = new BigDecimal(0);
 			if (ret.getNumber()>0) {
-				bdPriceReal = new BigDecimal(costInTotal / ret.getNumber());
+				ret.setActualPrice(DoubleOperation.div(costInTotal, ret.getNumber(),4));
 			}
-			ret.setActualPrice(bdPriceReal.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
 			//开票成本 - 成衣
 			List<FabricCostClothes> fabricCostClothesList = fabricLossMapper.getCostClothesList(code);
 			ret.setFabricCostClothesList(fabricCostClothesList);
@@ -458,11 +193,9 @@ public class FabricLossServiceImpl extends ServiceImpl<FabricLossMapper, FabricL
 				FabricCostClothesDetail fabricCostClothesDetail = new FabricCostClothesDetail();
 
 				fabricCostClothesDetail.setIQuantityInvoice(fabricCostClothes.getIPBVQuantity());
-				BigDecimal bdValue = new BigDecimal(fabricCostClothes.getIQuantity()-fabricCostClothes.getIPBVQuantity());
-				fabricCostClothesDetail.setIQuantityInvoiceN(bdValue.setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue());
+				fabricCostClothesDetail.setIQuantityInvoiceN(DoubleOperation.sub(fabricCostClothes.getIQuantity(),fabricCostClothes.getIPBVQuantity()));
 				fabricCostClothesDetail.setIQuantitySettle(fabricCostClothes.getISQuantity());
-				bdValue = new BigDecimal(fabricCostClothes.getIQuantity()-fabricCostClothes.getISQuantity());
-				fabricCostClothesDetail.setIQuantitySettleN(bdValue.setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue());
+				fabricCostClothesDetail.setIQuantitySettleN(DoubleOperation.sub(fabricCostClothes.getIQuantity(),fabricCostClothes.getISQuantity()));
 				fabricCostClothesDetailList.add(fabricCostClothesDetail);
 				fabricCostClothes.setFabricCostClothesDetailList(fabricCostClothesDetailList);
 
@@ -473,11 +206,9 @@ public class FabricLossServiceImpl extends ServiceImpl<FabricLossMapper, FabricL
 				List<FabricCostAssistDetail> fabricCostAssistDetailList = new ArrayList<>();
 				FabricCostAssistDetail fabricCostAssistDetail = new FabricCostAssistDetail();
 				fabricCostAssistDetail.setIQuantityInvoice(fabricCostAssist.getIQuantityInvoice());
-				BigDecimal bdValue = new BigDecimal(fabricCostAssist.getIQuantityIn()-fabricCostAssist.getIQuantityInvoice());
-				fabricCostAssistDetail.setIQuantityInvoiceN(bdValue.setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue());
+				fabricCostAssistDetail.setIQuantityInvoiceN(DoubleOperation.sub(fabricCostAssist.getIQuantityIn(),fabricCostAssist.getIQuantityInvoice()));
 				fabricCostAssistDetail.setIQuantitySettle(fabricCostAssist.getIQuantitySettle());
-				bdValue = new BigDecimal(fabricCostAssist.getIQuantityIn()-fabricCostAssist.getIQuantitySettle());
-				fabricCostAssistDetail.setIQuantitySettleN(bdValue.setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue());
+				fabricCostAssistDetail.setIQuantitySettleN(DoubleOperation.sub(fabricCostAssist.getIQuantityIn(),fabricCostAssist.getIQuantitySettle()));
 				fabricCostAssistDetailList.add(fabricCostAssistDetail);
 				fabricCostAssist.setFabricCostAssistDetailList(fabricCostAssistDetailList);
 			}
@@ -488,9 +219,7 @@ public class FabricLossServiceImpl extends ServiceImpl<FabricLossMapper, FabricL
 			List<FabricCostCloth> fabricCostClothGroupList = new ArrayList<>();
 			for (FabricCostCloth fabricCostCloth : fabricCostClothList){
 				FabricCostCloth fabricCostClothGroup = new FabricCostCloth();
-				Optional<FabricCostCloth> findObject = fabricCostClothGroupList.stream().filter(e->e.getCVenName().equals(fabricCostCloth.getCVenName()) &&
-						e.getCSBVCode().equals(fabricCostCloth.getCSBVCode()) &&
-						e.getCShipTime().equals(fabricCostCloth.getCShipTime())).findFirst();
+				Optional<FabricCostCloth> findObject = fabricCostClothGroupList.stream().filter(e->e.getId().equalsIgnoreCase(fabricCostCloth.getId())).findFirst();
 				if (findObject.isPresent()){
 					fabricCostClothGroup = findObject.get();
 					fabricCostClothGroup.setINatSum(fabricCostClothGroup.getINatSum()+fabricCostCloth.getINatSum());
@@ -549,6 +278,7 @@ public class FabricLossServiceImpl extends ServiceImpl<FabricLossMapper, FabricL
 	 * @param editData - 要设置内容的面损
 	 * @return
 	 */
+	/*
 	private List<FabricOMOrder> setFabricOMOrderOutDetail(List<FabricOMOrder> fabricOMOrderList, String code,
 	                                                      FabricLoss editData){
 		// 设置用户修改内容的数据
@@ -701,13 +431,14 @@ public class FabricLossServiceImpl extends ServiceImpl<FabricLossMapper, FabricL
 
 		return fabricOMOrderList;
 	}
-
+*/
 	/**
 	 * 设置委外订单入库详情
 	 * @param fabricOMOrderList - 委外订单列表
 	 * @param code - 计划号
 	 * @return
 	 */
+	/*
 	private List<FabricOMOrder> setFabricOMOrderInDetail(List<FabricOMOrder> fabricOMOrderList, String code){
 		List<FabricMoOrderRK> fabricMoOrderRKList = fabricLossMapper.getOmInDetailList(code);
 
@@ -743,7 +474,7 @@ public class FabricLossServiceImpl extends ServiceImpl<FabricLossMapper, FabricL
 		}
 
 		return fabricOMOrderList;
-	}
+	}*/
 
 	/**
 	 * 获取采购订单-其他入库的纱
@@ -751,6 +482,7 @@ public class FabricLossServiceImpl extends ServiceImpl<FabricLossMapper, FabricL
 	 * @param lyysList - 来源余纱,去掉这部分物料
 	 * @return
 	 */
+	/*
 	private List<FabricPoOrder> getPoOrderQtrk(String code,List<FabricPoOrder> lyysList){
 		// 来源余纱所有物料批次
 		List<FabricPoOrderOut> lyysOutList = new ArrayList<>();
@@ -832,12 +564,13 @@ public class FabricLossServiceImpl extends ServiceImpl<FabricLossMapper, FabricL
 		}
 		return fabricPoOrderList;
 	}
-
+*/
 	/**
 	 * 获取采购订单-来源余纱
 	 * @param code
 	 * @return
 	 */
+	/*
 	private List<FabricPoOrder> getPoOrderLyys(String code){
 		List<FabricPoOrderOut> fabricPoOrderTempList1 = fabricLossMapper.getPurchaseListOtherPurInList(code);
 		List<FabricPoOrderOut> fabricPoOrderTempList = new ArrayList<>();
@@ -943,7 +676,7 @@ public class FabricLossServiceImpl extends ServiceImpl<FabricLossMapper, FabricL
 
 
 		return fabricPoOrderList;
-	}
+	}*/
 
 	/**
 	 * 计算委外订单成本
@@ -953,6 +686,7 @@ public class FabricLossServiceImpl extends ServiceImpl<FabricLossMapper, FabricL
 	 * @param rowInListWithAV - 形态转换前的材料入库信息
 	 * @return
 	 */
+	/*
 	private List<FabricMoOrderCK> getFabricMoOrderCKList(List<Map<String,Object>> rowInfoList,
 	                                             List<FabricMoOrderCK> rowOutList,
 	                                             List<Map<String,Object>> rowInList,
@@ -1194,220 +928,8 @@ public class FabricLossServiceImpl extends ServiceImpl<FabricLossMapper, FabricL
 
 		return ret;
 	}
+*/
 
-	/**
-	 * 根据采购入库详情,委外订单详情,获取转出成本。(入库数量-出库数量) * 单价
-	 * @param poOrderList - 采购入库详情
-	 * @param omOrderListGn - 委外订单国内
-	 * @param omOrderListGw - 委外订单国外
-	 * @return
-	 */
-	private List<FabricCostInvoice> getOutCost(List<FabricPoOrder> poOrderList, List<FabricOMOrder> omOrderListGn, List<FabricOMOrder> omOrderListGw){
-		// 采购出入库去掉末尾两行:来源余纱、其他入库纱
-		List<FabricPoOrder> poOrderListReal = poOrderList.stream().filter(e->!e.getCPOID().equals("来源余料") &&
-				!e.getCPOID().equals("其他入库")).collect(Collectors.toList());
-		// 合并所有采购入库+委外入库的物料批次。借用FabricPoOrderIn类
-		List<FabricPoOrderIn> allInList = new ArrayList<>();
-		for (FabricPoOrder item : poOrderListReal){
-			List<FabricPoOrderIn> inList = item.getFabricPoOrderInList();
-			if (oConvertUtils.listIsNotEmpty(inList)){
-				for (FabricPoOrderIn itemIn : inList){
-					Optional<FabricPoOrderIn> findItemOpt = allInList.stream().filter(e->
-							e.getCInvCode().equalsIgnoreCase(itemIn.getCInvCode()) &&
-							e.getCColor().equalsIgnoreCase(itemIn.getCColor()) &&
-							e.getCBatch().equalsIgnoreCase(itemIn.getCBatch())).findFirst();
-					if (findItemOpt.isPresent()){
-						FabricPoOrderIn formatItem = findItemOpt.get();
-						Double dMoney = formatItem.getIPrice()*formatItem.getIQuantity()+itemIn.getIPrice()*itemIn.getIQuantity();
-						Double dQuantity = formatItem.getIQuantity()+itemIn.getIQuantity();
-						formatItem.setIPrice(dMoney/dQuantity);
-						formatItem.setIQuantity(dQuantity);
-
-					}else {
-						FabricPoOrderIn formatItem = new FabricPoOrderIn();
-						formatItem.setCInvCode(itemIn.getCInvCode());
-						formatItem.setCColor(itemIn.getCColor());
-						formatItem.setCBatch(itemIn.getCBatch());
-						formatItem.setIQuantity(itemIn.getIQuantity());
-						formatItem.setIPrice(itemIn.getIPrice());
-						formatItem.setCInvName(itemIn.getCInvName());
-						allInList.add(formatItem);
-					}
-				}
-			}
-		}
-
-		for (FabricOMOrder item : omOrderListGn){
-			List<FabricMoOrderRK> inList = item.getFabricMoOrderRKList();
-			if (oConvertUtils.listIsNotEmpty(inList)){
-				for (FabricMoOrderRK itemIn : inList){
-					FabricPoOrderIn formatItem = new FabricPoOrderIn();
-					formatItem.setCInvCode(item.getCInvCode());
-					formatItem.setCColor(item.getCColor());
-					formatItem.setCBatch(itemIn.getCBatch());
-					formatItem.setIQuantity(itemIn.getIQuantityIn());
-					formatItem.setIPrice(itemIn.getIPrice());
-					formatItem.setCBusType("1");        // 国内
-					formatItem.setCInvName(itemIn.getCInvName()+" "+itemIn.getCColor());
-					allInList.add(formatItem);
-				}
-			}
-		}
-
-		for (FabricOMOrder item : omOrderListGw){
-			List<FabricMoOrderRK> inList = item.getFabricMoOrderRKList();
-			if (oConvertUtils.listIsNotEmpty(inList)){
-				for (FabricMoOrderRK itemIn : inList){
-					FabricPoOrderIn formatItem = new FabricPoOrderIn();
-					formatItem.setCInvCode(item.getCInvCode());
-					formatItem.setCColor(item.getCColor());
-					formatItem.setCBatch(itemIn.getCBatch());
-					formatItem.setIQuantity(itemIn.getIQuantityIn());
-					formatItem.setIPrice(itemIn.getIPrice());
-					formatItem.setCBusType("2");        // 国外
-					formatItem.setCInvName(itemIn.getCInvName()+" "+itemIn.getCColor());
-					allInList.add(formatItem);
-				}
-			}
-		}
-
-		List<String> invIdGnList = new ArrayList<>();// 国内入库物料编码
-		List<String> invIdGwList = new ArrayList<>();// 国外入库物料编码
-		for (FabricOMOrder omOrder : omOrderListGn){
-			List<FabricMoOrderRK> omRkList = omOrder.getFabricMoOrderRKList();
-			if (oConvertUtils.listIsNotEmpty(omRkList)) {
-				for (FabricMoOrderRK rkItem : omRkList) {
-					invIdGnList.add(omOrder.getCInvCode() + omOrder.getCColor() + rkItem.getCBatch());
-				}
-			}
-		}
-		for (FabricOMOrder omOrder : omOrderListGw){
-			List<FabricMoOrderRK> omRkList = omOrder.getFabricMoOrderRKList();
-			if (oConvertUtils.listIsNotEmpty(omRkList)) {
-				for (FabricMoOrderRK rkItem : omRkList) {
-					invIdGwList.add(omOrder.getCInvCode() + omOrder.getCColor() + rkItem.getCBatch());
-				}
-			}
-		}
-		List<FabricPoOrderOut> invOutGnList = new ArrayList<>();
-		if (invIdGnList.size()>0){
-			invOutGnList = fabricLossMapper.getOmInGnOutList(invIdGnList);   //国内出库数量
-		}
-		List<FabricPoOrderOut> invOutGwList = new ArrayList<>();
-		if (invIdGwList.size()>0){
-			invOutGwList = fabricLossMapper.getOmInGwOutList(invIdGwList);   //国外出库数量
-		}
-
-		// 扣减出库数量
-		List<FabricOMOrder> omOrderListAll = new ArrayList<>();
-		omOrderListAll.addAll(omOrderListGn);
-		omOrderListAll.addAll(omOrderListGw);
-		// 转换国内外出库数量
-		List<FabricMoOrderCK> omOutListAll = new ArrayList<>();
-		for (FabricOMOrder omOrder : omOrderListAll){
-			List<FabricMoOrderCK> outList = omOrder.getFabricMoOrderCKList();
-			for (FabricMoOrderCK omOut:outList){
-				FabricMoOrderCK outCopy = new FabricMoOrderCK();
-				outCopy.setCBatchOut(omOut.getCBatchOut());
-				outCopy.setCInvCodeOut(omOut.getCInvCodeOut());
-				outCopy.setCColorOut(omOut.getCColorOut());
-				outCopy.setIQuantity(omOut.getIQuantity());
-				omOutListAll.add(outCopy);
-			}
-
-		}
-		for (FabricPoOrderIn itemIn : allInList){
-			boolean bOmFind = false;
-
-			double inLeft = itemIn.getIQuantity();
-			for (FabricMoOrderCK outItem : omOutListAll){
-				if (outItem.getCBatchOut().equalsIgnoreCase(itemIn.getCBatch()) &&
-					outItem.getCInvCodeOut().equalsIgnoreCase(itemIn.getCInvCode()) &&
-					outItem.getCColorOut().equalsIgnoreCase(itemIn.getCColor())){
-					double outLeft = outItem.getIQuantity();
-					bOmFind = true;
-					inLeft -= outLeft;
-					if (inLeft<0){
-						outLeft = inLeft*-1;
-					}else{
-						outLeft = 0;
-					}
-					outItem.setIQuantity(outLeft);
-					if (inLeft<=0){
-						break;
-					}
-				}
-
-			}
-			itemIn.setIQuantity(inLeft);
-			if (!bOmFind){
-				List<FabricPoOrderOut> useOutList = null;
-				// 国内
-				if ("1".equals(itemIn.getCBusType())){
-					useOutList = invOutGnList;
-				}
-				// 国外
-				else if ("2".equals(itemIn.getCBusType())){
-					useOutList = invOutGwList;
-				}
-				if (useOutList != null){
-					for (FabricPoOrderOut outItem : useOutList){
-						if (outItem.getCBatch().equalsIgnoreCase(itemIn.getCBatch()) &&
-								outItem.getCInvCode().equalsIgnoreCase(itemIn.getCInvCode()) &&
-								outItem.getCColor().equalsIgnoreCase(itemIn.getCColor())){
-							double outLeft = outItem.getIQuantity();
-							inLeft -= outLeft;
-							if (inLeft<0){
-								outLeft = inLeft*-1;
-							}else{
-								outLeft = 0;
-							}
-							outItem.setIQuantity(outLeft);
-							if (inLeft<=0){
-								break;
-							}
-						}
-
-					}
-					itemIn.setIQuantity(inLeft);
-
-				}
-			}
-		}
-		List<FabricCostInvoice> costInvoiceList = new ArrayList<>();
-		// 计算总转入成本
-		for (FabricPoOrderIn itemIn : allInList){
-			if (itemIn.getIQuantity()>0){
-				FabricCostInvoice fabricCostInvoice = new FabricCostInvoice();
-				fabricCostInvoice.setCVCName(itemIn.getCInvName());
-				fabricCostInvoice.setCVenAbbName("");
-				fabricCostInvoice.setCBusType("转出成本");
-				BigDecimal bdVal = new BigDecimal(itemIn.getIQuantity()*itemIn.getIPrice()*-1);
-				fabricCostInvoice.setIMoney(bdVal.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
-				if (fabricCostInvoice.getIMoney()!=0) {
-					costInvoiceList.add(fabricCostInvoice);
-				}
-			}
-		}
-
-		// 分组
-		List<FabricCostInvoice> costInvoiceListGroup = new ArrayList<>();
-		for (FabricCostInvoice fabricCostInvoice : costInvoiceList){
-			Optional<FabricCostInvoice> findOpt = costInvoiceListGroup.stream().filter(e->
-					e.getCVCName().equals(fabricCostInvoice.getCVCName()) &&
-							e.getCVenAbbName().equals(fabricCostInvoice.getCVenAbbName())).findFirst();
-			if (findOpt.isPresent()){
-				FabricCostInvoice find = findOpt.get();
-				BigDecimal bdVal = new BigDecimal(find.getIMoney()+fabricCostInvoice.getIMoney());
-				find.setIMoney(bdVal.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
-			}else{
-				costInvoiceListGroup.add(fabricCostInvoice);
-			}
-		}
-
-		return costInvoiceListGroup;
-
-	}
 	// 根据文件id,获取文件内容
 	@Override
 	public byte[] getFileContent(String fileId){
@@ -1462,188 +984,13 @@ public class FabricLossServiceImpl extends ServiceImpl<FabricLossMapper, FabricL
 		}
 	}
 
+
+
+
 	/**
-	 * 委外出库材料,找出不在采购入库和委外入库中,计算转入成本
-	 * @param poOrderList - 采购入库详情
-	 * @param omOrderListGn - 委外订单国内
-	 * @param omOrderListGw - 委外订单国外
-	 * @return
-	 */
-	private List<FabricCostInvoice> getInCost(List<FabricPoOrder> poOrderList, List<FabricOMOrder> omOrderListGn, List<FabricOMOrder> omOrderListGw){
-		// 采购出入库去掉末尾两行:来源余纱、其他入库纱
-		List<FabricPoOrder> poOrderListReal = poOrderList.stream().filter(e->!e.getCPOID().equals("来源余料") &&
-				!e.getCPOID().equals("其他入库")).collect(Collectors.toList());
-		// 合并所有采购入库+委外入库的物料批次。借用FabricPoOrderIn类
-		List<FabricPoOrderIn> allInList = new ArrayList<>();
-		for (FabricPoOrder item : poOrderListReal){
-			List<FabricPoOrderIn> inList = item.getFabricPoOrderInList();
-			if (oConvertUtils.listIsNotEmpty(inList)){
-				for (FabricPoOrderIn itemIn : inList){
-					Optional<FabricPoOrderIn> findItemOpt = allInList.stream().filter(e->
-							e.getCInvCode().equalsIgnoreCase(itemIn.getCInvCode()) &&
-									e.getCColor().equalsIgnoreCase(itemIn.getCColor()) &&
-									e.getCBatch().equalsIgnoreCase(itemIn.getCBatch())).findFirst();
-					if (findItemOpt.isPresent()){
-						FabricPoOrderIn formatItem = findItemOpt.get();
-						Double dMoney = formatItem.getIPrice()*formatItem.getIQuantity()+itemIn.getIPrice()*itemIn.getIQuantity();
-						Double dQuantity = formatItem.getIQuantity()+itemIn.getIQuantity();
-						formatItem.setIPrice(dMoney/dQuantity);
-						formatItem.setIQuantity(dQuantity);
-
-					}else {
-						FabricPoOrderIn formatItem = new FabricPoOrderIn();
-						formatItem.setCInvCode(itemIn.getCInvCode());
-						formatItem.setCColor(itemIn.getCColor());
-						formatItem.setCBatch(itemIn.getCBatch());
-						formatItem.setIQuantity(itemIn.getIQuantity());
-						formatItem.setIPrice(itemIn.getIPrice());
-						allInList.add(formatItem);
-					}
-				}
-			}
-		}
-
-		for (FabricOMOrder item : omOrderListGn){
-			List<FabricMoOrderRK> inList = item.getFabricMoOrderRKList();
-			if (oConvertUtils.listIsNotEmpty(inList)){
-				for (FabricMoOrderRK itemIn : inList){
-					FabricPoOrderIn formatItem = new FabricPoOrderIn();
-					formatItem.setCInvCode(item.getCInvCode());
-					formatItem.setCColor(item.getCColor());
-					formatItem.setCBatch(itemIn.getCBatch());
-					formatItem.setIQuantity(itemIn.getIQuantityIn());
-					formatItem.setIPrice(itemIn.getIPrice());
-					allInList.add(formatItem);
-				}
-			}
-		}
-
-		for (FabricOMOrder item : omOrderListGw){
-			List<FabricMoOrderRK> inList = item.getFabricMoOrderRKList();
-			if (oConvertUtils.listIsNotEmpty(inList)){
-				for (FabricMoOrderRK itemIn : inList){
-					FabricPoOrderIn formatItem = new FabricPoOrderIn();
-					formatItem.setCInvCode(item.getCInvCode());
-					formatItem.setCColor(item.getCColor());
-					formatItem.setCBatch(itemIn.getCBatch());
-					formatItem.setIQuantity(itemIn.getIQuantityIn());
-					formatItem.setIPrice(itemIn.getIPrice());
-					allInList.add(formatItem);
-				}
-			}
-		}
-
-		// 合并所有出的
-		List<FabricOMOrder> omOrderListAll = new ArrayList<>();
-		omOrderListAll.addAll(omOrderListGn);
-		omOrderListAll.addAll(omOrderListGw);
-		List<FabricMoOrderCK> omOutListAll = new ArrayList<>();
-		for (FabricOMOrder omOrder : omOrderListAll){
-			List<FabricMoOrderCK> outList = omOrder.getFabricMoOrderCKList();
-			for (FabricMoOrderCK omOut:outList){
-				FabricMoOrderCK outCopy = new FabricMoOrderCK();
-				outCopy.setCBatchOut(omOut.getCBatchOut());
-				outCopy.setCInvCodeOut(omOut.getCInvCodeOut());
-				outCopy.setCColorOut(omOut.getCColorOut());
-				outCopy.setIQuantity(omOut.getIQuantity());
-				outCopy.setIPrice(omOut.getIPrice());
-				outCopy.setCVCName(omOrder.getCVCName());
-				outCopy.setCVenAbbName(omOrder.getCVenAbbName());
-				outCopy.setCPlanCode(omOut.getCPlanCode());
-
-				omOutListAll.add(outCopy);
-			}
-
-		}
-		for (FabricMoOrderCK itemOut : omOutListAll){
-
-			double outLeft = itemOut.getIQuantity();
-			for (FabricPoOrderIn itemIn : allInList){
-				if (itemOut.getCBatchOut().equalsIgnoreCase(itemIn.getCBatch()) &&
-						itemOut.getCInvCodeOut().equalsIgnoreCase(itemIn.getCInvCode()) &&
-						itemOut.getCColorOut().equalsIgnoreCase(itemIn.getCColor())){
-					double inLeft = itemIn.getIQuantity();
-
-					outLeft -= inLeft;
-					if (outLeft<0){
-						inLeft = outLeft*-1;
-					}else{
-						inLeft = 0;
-					}
-					itemIn.setIQuantity(inLeft);
-					if (outLeft<=0){
-						break;
-					}
-				}
-
-			}
-			itemOut.setIQuantity(outLeft);
-		}
-		List<FabricCostInvoice> costInvoiceList = new ArrayList<>();
-
-		// 计算总转入成本
-		for (FabricMoOrderCK itemOut : omOutListAll){
-			if (itemOut.getIQuantity()>0){
-				FabricCostInvoice fabricCostInvoice = new FabricCostInvoice();
-				fabricCostInvoice.setCVCName(itemOut.getCVCName());
-				fabricCostInvoice.setCVenAbbName(itemOut.getCPlanCode()+" "+itemOut.getCVenAbbName());
-				fabricCostInvoice.setCBusType("转入成本");
-				BigDecimal bdVal = new BigDecimal(itemOut.getIQuantity()*itemOut.getIPrice());
-				fabricCostInvoice.setIMoney(bdVal.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
-				if (fabricCostInvoice.getIMoney()!=0) {
-					costInvoiceList.add(fabricCostInvoice);
-				}
-			}
-		}
-		// 分组
-		List<FabricCostInvoice> costInvoiceListGroup = new ArrayList<>();
-		for (FabricCostInvoice fabricCostInvoice : costInvoiceList){
-			Optional<FabricCostInvoice> findOpt = costInvoiceListGroup.stream().filter(e->
-					e.getCVCName().equals(fabricCostInvoice.getCVCName()) &&
-					e.getCVenAbbName().equals(fabricCostInvoice.getCVenAbbName())).findFirst();
-			if (findOpt.isPresent()){
-				FabricCostInvoice find = findOpt.get();
-				BigDecimal bdVal = new BigDecimal(find.getIMoney()+fabricCostInvoice.getIMoney());
-				find.setIMoney(bdVal.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
-			}else{
-				costInvoiceListGroup.add(fabricCostInvoice);
-			}
-		}
-
-
-		return costInvoiceListGroup;
-
-	}
-
-	/**
-	 * 委外订单分组,根据供应商分类,供应商名称,供应商简称,供应商编码,物料编号,物料名称,颜色,计量单位,染厂色号,
-	 *  计算委外订单数量,材料出库数量,委外入库数量
-	 *  同时把委外订单子表id逗号分割,放到MODetailsID字段
-	 * @param omOrderList
-	 * @return
-	 */
-	private List<FabricOMOrder> groupOmOrderList(List<FabricOMOrder> omOrderList){
-		List<FabricOMOrder> ret = new ArrayList<>();
-		for (FabricOMOrder omOrder : omOrderList){
-			Optional<FabricOMOrder> findOpt = ret.stream().filter(e->e.getGroupId().equals(omOrder.getGroupId())).findFirst();
-			if (findOpt.isPresent()){
-				FabricOMOrder find = findOpt.get();
-				find.setIQuantityOut(DoubleOperation.add(find.getIQuantityOut(), omOrder.getIQuantityOut()));
-				find.setIQuantity(DoubleOperation.add(find.getIQuantity(), omOrder.getIQuantity()));
-				find.setIQuantityIn(DoubleOperation.add(find.getIQuantityIn(), omOrder.getIQuantityIn()));
-				find.setMODetailsID(find.getMODetailsID()+","+omOrder.getMODetailsID());
-			}else{
-				ret.add(omOrder);
-			}
-		}
-		return ret;
-
-	}
-
-	/**
-	 * 设置委外订单余料数据
-	 * @param fabricOMOrderList
-	 * @param code
+	 * 设置委外订单余料数据
+	 * @param fabricOMOrderList
+	 * @param code
 	 * @return
 	 */
 
@@ -1651,9 +998,9 @@ public class FabricLossServiceImpl extends ServiceImpl<FabricLossMapper, FabricL
 		// 获取本次委外入库的形态转换
 		List<Map<String,Object>> fabricAssemVouchList = fabricLossMapper.getMoAssemVouchList(code);
 
-		// 采购入库被其他委外订单使用的信息
+		// 委外入库被其他委外订单使用的信息
 		List<FabricPoOrderOut> fabricPoOrderOutList = fabricLossMapper.getMoOrderInToOther(code);
-		// 采购入库仓库库存
+		// 委外入库仓库库存
 		List<FabricPoOrderOut> poOrderStockList = fabricLossMapper.getMoStockList(code);
 		// 采购订单设置分配数量、委外供应商、余纱、采购损耗
 		for (FabricOMOrder omOrder : fabricOMOrderList){
@@ -1754,4 +1101,1148 @@ public class FabricLossServiceImpl extends ServiceImpl<FabricLossMapper, FabricL
 		return null;
 	}
 
+	/**
+	 * 设置表头信息,不含总成本
+	 * @param ret
+	 */
+	private void setHeadInfo(FabricLoss ret){
+		List<String> lstContractNo = new ArrayList<>(); // 成衣合同号
+		List<String> lstCdefine22 = new ArrayList<>();  // 款号
+		List<String> lstCpersonName = new ArrayList<>(); // 业务员
+		String code = ret.getCCode();
+
+		List<FabricLoss> fabricLossList = fabricLossMapper.getFabricLossData(code);
+		for (FabricLoss fabricLoss : fabricLossList){
+			if (oConvertUtils.isNotEmpty(fabricLoss.getContractNo()) &&
+					!lstContractNo.contains(fabricLoss.getContractNo())){
+				lstContractNo.add(fabricLoss.getContractNo());
+			}
+			if (oConvertUtils.isNotEmpty(fabricLoss.getCDefine22()) &&
+					!lstCdefine22.contains(fabricLoss.getCDefine22())){
+				lstCdefine22.add(fabricLoss.getCDefine22());
+			}
+			if (oConvertUtils.isNotEmpty(fabricLoss.getCPersonName()) &&
+					!lstCpersonName.contains(fabricLoss.getCPersonName())){
+				lstCpersonName.add(fabricLoss.getCPersonName());
+			}
+		}
+		if (lstContractNo.size()>0){
+			ret.setContractNo(String.join(",",lstContractNo));
+		}
+		if (lstCdefine22.size()>0){
+			ret.setCDefine22(String.join(",",lstCdefine22));
+		}
+		if (lstCpersonName.size()>0){
+			ret.setCPersonName(String.join(",",lstCpersonName));
+		}
+		//制单人
+		LoginUser sysUser = (LoginUser) SecurityUtils.getSubject().getPrincipal();
+		ret.setMakingPeople(sysUser.getRealname());
+		//计划员
+		List<String> planner = fabricLossMapper.getPlanner(code);
+		if (oConvertUtils.listIsNotEmpty(planner)){
+			ret.setPlanner(String.join(",", planner));
+		}
+		// 日期
+		ret.setDateTime(DateUtils.getDate());
+		// 排单数量
+		ret.setNumber(oConvertUtils.getDouble(fabricLossMapper.getNumber(code),0));
+		// 销售出库数量
+		Double dOutSum = oConvertUtils.getDouble(fabricLossMapper.getSaleOutSum(code),0);
+		if (dOutSum>ret.getNumber()) {
+			dOutSum = ret.getNumber();
+		}
+		ret.setOutboundNumber(dOutSum);
+		// 销售订单附件
+		List<AccessorItem> accessorItemList = fabricLossMapper.getSoAccList(ret.getContractNo());
+		accessorItemList.forEach(e->e.setFileurl("/report/FabricLoss/getFile?fileId="+e.getCFileId()+"&filename="+e.getFilename()));
+		ret.setAccessorItemList(accessorItemList);
+	}
+
+	/**
+	 * 设置采购入库订单,不含来源余纱和其他入库的纱。分配数量、余纱、采购损耗不设置,等委外出库使用再算
+	 * @param ret
+	 */
+	private void setPoOrderList(FabricLoss ret){
+		String code = ret.getCCode();
+		// 采购订单数据
+		List<FabricPoOrder> fabricPoOrderListTmp = fabricLossMapper.getPurchaseList(code);
+		//采购订购单数据把不同订单合并
+		List<FabricPoOrder> fabricPoOrderList= new ArrayList<>();
+		for (FabricPoOrder fabricPoOrder: fabricPoOrderListTmp){
+			String cInvName = fabricPoOrder.getCInvName();
+			Optional<FabricPoOrder> findItemOpt = fabricPoOrderList.stream().filter(e->e.getCInvName().equals(cInvName)).findFirst();
+			if (findItemOpt.isPresent()){
+				FabricPoOrder findItem = findItemOpt.get();
+				findItem.setIQuantityIn(DoubleOperation.add(findItem.getIQuantityIn(),fabricPoOrder.getIQuantityIn()));
+				findItem.setIQuantity(DoubleOperation.add(findItem.getIQuantity(),fabricPoOrder.getIQuantity()));
+				findItem.setCPOID(findItem.getCPOID()+","+fabricPoOrder.getCPOID());
+				if (findItem.getCVenAbbName().indexOf(fabricPoOrder.getCVenAbbName()) == -1){
+					findItem.setCVenAbbName(findItem.getCVenAbbName()+","+fabricPoOrder.getCVenAbbName());
+				}
+				if (findItem.getCVenName().indexOf(fabricPoOrder.getCVenName()) == -1){
+					findItem.setCVenName(findItem.getCVenName()+","+fabricPoOrder.getCVenName());
+				}
+			}else{
+				fabricPoOrderList.add(fabricPoOrder);
+			}
+		}
+		// 获取本次采购入库详情
+		List<FabricPoOrderIn> fabricPoOrderInList = fabricLossMapper.getPurchaseInList(code);
+		// 设置未开票数量和未结算数量,采购单价
+		for (FabricPoOrderIn fabricPoOrderIn: fabricPoOrderInList){
+			fabricPoOrderIn.setIQuantityNInvoice(DoubleOperation.sub(fabricPoOrderIn.getIQuantity(),fabricPoOrderIn.getIQuantityInvoice()));
+			fabricPoOrderIn.setIQuantityNSettle(DoubleOperation.sub(fabricPoOrderIn.getIQuantity(),fabricPoOrderIn.getIQuantitySettle()));
+			BigDecimal bNum = new BigDecimal(fabricPoOrderIn.getIPrice());
+			fabricPoOrderIn.setIPrice(bNum.setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue());
+		}
+
+		// 采购入库仓库库存
+		List<FabricPoOrderOut> poOrderStockList = fabricLossMapper.getPurchaseStockList(code);
+		// 采购入库被其他委外订单使用的信息
+		List<FabricPoOrderOut> fabricPoOrderOutList = fabricLossMapper.getPoOrderInToOther(code);
+		// 设置入库信息,及库存
+		for (FabricPoOrder fabricPoOrder : fabricPoOrderList){
+
+			// 设置入库信息
+			List<FabricPoOrderIn> tmpFabricPoOrderInList = fabricPoOrderInList.stream().filter(e->
+							fabricPoOrder.getId().equalsIgnoreCase(e.getParentId())).collect(Collectors.toList());
+			fabricPoOrder.setFabricPoOrderInList(tmpFabricPoOrderInList);
+
+			// 设置被其他委外订单使用信息
+			List<FabricPoOrderOut> findFabricPoOrderOutList = fabricPoOrderOutList.stream().filter(e->
+					oConvertUtils.getString(e.getCInvCode()).equals(oConvertUtils.getString(fabricPoOrder.getCInvCode())) &&
+							oConvertUtils.getString(e.getCColor()).equals(oConvertUtils.getString(fabricPoOrder.getCColor()))).collect(Collectors.toList());
+			// 设置计划号,单价
+			for (FabricPoOrderOut item : findFabricPoOrderOutList){
+				String cCode = item.getCCode();
+				int index1 = cCode.indexOf("SY");
+				if (index1 == -1) {
+					continue;
+				}
+				int index2 = cCode.indexOf("-", index1);
+				if (index2 == -1) {
+					index2 = cCode.length();
+				}
+				item.setCPlanCode(cCode.substring(index1,index2));
+				if (tmpFabricPoOrderInList.size()>0){
+					item.setIPrice(tmpFabricPoOrderInList.get(0).getIPrice());
+					item.setIMoney(item.getIPrice()*item.getIQuantity());
+				}
+
+			}
+			// 设置仓库库存
+			List<FabricPoOrderOut> findPoOrderStockList = poOrderStockList.stream().filter(e->
+							fabricPoOrder.getId().equalsIgnoreCase(e.getParentId())).collect(Collectors.toList());
+
+			fabricPoOrder.setFabricPoOrderOutList(findPoOrderStockList);
+		}
+		ret.setFabricPoOrderList(fabricPoOrderList);
+
+/*
+		// 获取委外材料出库单,已核销的取核销数量
+		List<Map<String,Object>> fabricOmOutList = fabricLossMapper.getOmOutList(code);
+		// 获取本次采购入库的形态转换
+		List<Map<String,Object>> fabricAssemVouchList = fabricLossMapper.getAssemVouchList(code);
+
+
+		// 采购入库被其他委外订单使用的信息
+		List<FabricPoOrderOut> fabricPoOrderOutList = fabricLossMapper.getPoOrderInToOther(code);
+		// 采购入库仓库库存
+		List<FabricPoOrderOut> poOrderStockList = fabricLossMapper.getPurchaseStockList(code);
+		// 采购订单设置分配数量、委外供应商、余纱、采购损耗
+		for (FabricPoOrder fabricPoOrder : fabricPoOrderList){
+			// 获取采购形态转换物料
+			List<Map<String, Object>> tmpAssemVouchList = fabricAssemVouchList.stream().filter(e->
+					oConvertUtils.getString(e.get("cInvCode")).equals(fabricPoOrder.getCInvCode()) &&
+							oConvertUtils.getString(e.get("cColor")).equals(fabricPoOrder.getCColor())).collect(Collectors.toList());
+			//&&
+			//								fabricPoOrder.getCBatch().indexOf(oConvertUtils.getString(e.get("cAVBatch")))>-1
+			// 未形态转换物料
+			List<Map<String, Object>> tmpOmOutList1 = fabricOmOutList.stream().filter(e->
+					oConvertUtils.getString(e.get("cInvCode")).equals(fabricPoOrder.getCInvCode()) &&
+							oConvertUtils.getString(e.get("cColor")).equals(fabricPoOrder.getCColor())).collect(Collectors.toList());
+			// &&
+			//								fabricPoOrder.getCBatch().indexOf(oConvertUtils.getString(e.get("cBatch")))>-1
+
+			// 形态转换物料
+			List<Map<String, Object>> tmpOmOutList2 = fabricOmOutList.stream().filter(out->{
+				return tmpAssemVouchList.stream().filter(e ->
+						oConvertUtils.getString(e.get("cInvCode2")).equals(oConvertUtils.getString(out.get("cInvCode"))) &&
+								oConvertUtils.getString(e.get("cColor2")).equals(oConvertUtils.getString(out.get("cColor")))
+				).count() > 0;
+			}).collect(Collectors.toList());
+			// &&
+			//								oConvertUtils.getString(e.get("cAVBatch2")).equals(oConvertUtils.getString(out.get("cBatch")))
+
+			tmpOmOutList1.addAll(tmpOmOutList2);
+
+			List<String> omcVenAbbNameList = new ArrayList<>();
+			double outSum = 0;
+			for (Map<String, Object> out : tmpOmOutList1){
+				outSum += oConvertUtils.getDouble(out.get("iQuantity").toString(),0);
+				String omcVenAbbName = oConvertUtils.getString(out.get("cVenAbbName").toString());
+				if (!omcVenAbbNameList.contains(omcVenAbbName)){
+					omcVenAbbNameList.add(omcVenAbbName);
+				}
+			}
+			if (omcVenAbbNameList.size()>0){
+				fabricPoOrder.setOmcVenAbbName(String.join(",", omcVenAbbNameList));
+			}
+
+			BigDecimal bOutSum = new BigDecimal(outSum);
+			outSum = bOutSum.setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue();
+			fabricPoOrder.setIQuantityOut(outSum);
+			double leftSum = fabricPoOrder.getIQuantityIn()-fabricPoOrder.getIQuantityOut();
+			BigDecimal bLeftSum = new BigDecimal(leftSum);
+			leftSum = bLeftSum.setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue();
+			fabricPoOrder.setIQuantityLeft(leftSum);
+			double leftRate = 0;
+			if (fabricPoOrder.getIQuantityIn() != 0) {
+				leftRate = leftSum / fabricPoOrder.getIQuantityIn();
+			}
+			BigDecimal bLeftRate = new BigDecimal(leftRate);
+			leftRate = bLeftRate.setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue();
+			fabricPoOrder.setIQuantityLeftRate(leftRate);
+
+			// 设置入库信息
+			List<FabricPoOrderIn> tmpFabricPoOrderInList = fabricPoOrderInList.stream().filter(e->
+					e.getCInvCode().equals(fabricPoOrder.getCInvCode()) &&
+							oConvertUtils.getString(e.getCColor()).equals(oConvertUtils.getString(fabricPoOrder.getCColor()))).collect(Collectors.toList());
+			fabricPoOrder.setFabricPoOrderInList(tmpFabricPoOrderInList);
+			// 设置被其他委外订单使用信息
+			List<FabricPoOrderOut> findFabricPoOrderOutList = fabricPoOrderOutList.stream().filter(e->
+					oConvertUtils.getString(e.getCInvCode()).equals(oConvertUtils.getString(fabricPoOrder.getCInvCode())) &&
+							oConvertUtils.getString(e.getCColor()).equals(oConvertUtils.getString(fabricPoOrder.getCColor()))).collect(Collectors.toList());
+			// 设置计划号,单价
+			for (FabricPoOrderOut item : findFabricPoOrderOutList){
+				String cCode = item.getCCode();
+				int index1 = cCode.indexOf("SY");
+				if (index1 == -1) {
+					continue;
+				}
+				int index2 = cCode.indexOf("-", index1);
+				if (index2 == -1) {
+					index2 = cCode.length();
+				}
+				item.setCPlanCode(cCode.substring(index1,index2));
+				if (tmpFabricPoOrderInList.size()>0){
+					item.setIPrice(tmpFabricPoOrderInList.get(0).getIPrice());
+					item.setIMoney(item.getIPrice()*item.getIQuantity());
+				}
+
+			}
+			// 设置仓库库存
+			List<FabricPoOrderOut> findPoOrderStockList = poOrderStockList.stream().filter(e->
+					fabricPoOrder.getCInvCode().equals(e.getCInvCode()) &&
+							oConvertUtils.getString(fabricPoOrder.getCColor()).equals(e.getCColor())).collect(Collectors.toList());
+			findFabricPoOrderOutList.addAll(findPoOrderStockList);
+
+			fabricPoOrder.setFabricPoOrderOutList(findFabricPoOrderOutList);
+		}*/
+	}
+
+	private final String[] CVCOrderKeyList = {"织","染","印"};
+	/**
+	 * 设置委外信息
+	 * @param ret
+	 */
+	private void setOmOrderList(FabricLoss ret, FabricLoss editData){
+		String code = ret.getCCode();
+
+		List<FabricOMOrder> fabricOMOrderListAll = fabricLossMapper.getOmOrderListAll(code);
+		if (fabricOMOrderListAll.size() == 0){
+			ret.setSuccess(false);
+			ret.setMessage("本计划没有面料委外,无面损表");
+		}
+
+		// 委外订单分组,MODetailsID会包含多个号,逗号分割
+		fabricOMOrderListAll = groupOmOrderList(fabricOMOrderListAll);
+		// 织、染、印、其他排序
+		fabricOMOrderListAll.forEach(e->{
+			e.setOrder(-1);
+			for (int i=0; i<CVCOrderKeyList.length;i++){
+				if (e.getCVCName().indexOf(CVCOrderKeyList[i])==0){
+					e.setOrder(i);
+				}
+			}
+			if (e.getOrder() == -1){
+				e.setOrder(CVCOrderKeyList.length);
+			}
+		});
+		List<FabricOMOrder> omOrderListOrderAllList = fabricOMOrderListAll.stream().sorted(Comparator.comparing(FabricOMOrder::getOrder)).collect(Collectors.toList());
+
+		// 设置详情及成本
+		/*
+		omOrderListOrderAllList = setFabricOMOrderOutDetail(omOrderListOrderAllList, code, editData);
+		omOrderListOrderAllList = setFabricOMOrderInDetail(omOrderListOrderAllList, code);*/
+		setOmOrderDetail(code, omOrderListOrderAllList, ret.getFabricPoOrderList(), editData);
+		// 设置余料去向
+		omOrderListOrderAllList = setFabricOMOrderLeftDetail(omOrderListOrderAllList, code);
+
+		// 委外订单附件
+		List<AccessorItem> omAccList = fabricLossMapper.getOmAccList(code);
+		omAccList.forEach(e->e.setFileurl("/report/FabricLoss/getFile?fileId="+e.getCFileId()+"&filename="+e.getFilename()));
+
+		// 设置附件
+		omOrderListOrderAllList.forEach(e->{
+			List<AccessorItem> accessorItemList1 = omAccList.stream().filter(a->a.getCInvId().equals(e.getCInvCode()+e.getCColor())).collect(Collectors.toList());
+			e.setAccessorItemList(accessorItemList1);
+		});
+		// 多发/少发,根/米,损耗设置
+		for (FabricOMOrder fabricOMOrder : omOrderListOrderAllList){
+			double dLoss = 0;
+			if (fabricOMOrder.getIQuantityOut()!=0) {
+				dLoss = (1 - fabricOMOrder.getIQuantityIn() / fabricOMOrder.getIQuantityOut()) * 100;
+			}
+
+			if ("02".equals(fabricOMOrder.getCComUnitCode())){  // 根
+				fabricOMOrder.setIQuantityPCS(fabricOMOrder.getIQuantityIn());
+			}else if ("04".equals(fabricOMOrder.getCComUnitCode())){    // 米
+				fabricOMOrder.setIQuantityM(fabricOMOrder.getIQuantityIn());
+			}
+			BigDecimal bDLoss = new BigDecimal(dLoss);
+			fabricOMOrder.setCQuantityLoss(bDLoss.setScale(2, BigDecimal.ROUND_HALF_UP).toString()+"%");
+			fabricOMOrder.setIQuantityMoreLess(DoubleOperation.sub(fabricOMOrder.getIQuantityIn(),fabricOMOrder.getIQuantity()));
+		}
+		// 委外订单国外子表id
+		List<String> omDetailIdListGw = fabricLossMapper.getOmOrderListGw(code);
+		List<FabricOMOrder> fabricOMOrderListGn = omOrderListOrderAllList.stream().filter(all->{
+			return omDetailIdListGw.stream().filter(detailId->all.getMODetailsID().indexOf(detailId)>-1).count()==0;
+		}).collect(Collectors.toList());
+		List<FabricOMOrder> fabricOMOrderListGw = omOrderListOrderAllList.stream().filter(all->{
+			return omDetailIdListGw.stream().filter(detailId->all.getMODetailsID().indexOf(detailId)>-1).count()>0;
+		}).collect(Collectors.toList());
+		ret.setFabricOMOrderList1(fabricOMOrderListGn);
+		ret.setFabricOMOrderList2(fabricOMOrderListGw);
+		
+	}
+
+	/**
+	 * 委外订单分组,根据供应商分类,供应商名称,供应商简称,供应商编码,物料编号,物料名称,颜色,计量单位,染厂色号,
+	 *  计算委外订单数量,材料出库数量,委外入库数量
+	 *  同时把委外订单子表id逗号分割,放到MODetailsID字段
+	 * @param omOrderList
+	 * @return
+	 */
+	private List<FabricOMOrder> groupOmOrderList(List<FabricOMOrder> omOrderList){
+		List<FabricOMOrder> ret = new ArrayList<>();
+		for (FabricOMOrder omOrder : omOrderList){
+			Optional<FabricOMOrder> findOpt = ret.stream().filter(e->e.getGroupId().equals(omOrder.getGroupId())).findFirst();
+			if (findOpt.isPresent()){
+				FabricOMOrder find = findOpt.get();
+				find.setIQuantityOut(DoubleOperation.add(find.getIQuantityOut(), omOrder.getIQuantityOut()));
+				find.setIQuantity(DoubleOperation.add(find.getIQuantity(), omOrder.getIQuantity()));
+				find.setIQuantityIn(DoubleOperation.add(find.getIQuantityIn(), omOrder.getIQuantityIn()));
+				find.setMODetailsID(find.getMODetailsID()+","+omOrder.getMODetailsID());
+			}else{
+				ret.add(omOrder);
+			}
+		}
+		return ret;
+
+	}
+
+	/**
+	 * 设置成本发票
+	 * @param ret
+	 */
+	private void setCostInvoiceList(FabricLoss ret, FabricLoss editData){
+		String code = ret.getCCode();
+		// 委外订单所有
+		List<FabricOMOrder> omOrderList = new ArrayList<>();
+		omOrderList.addAll(ret.getFabricOMOrderList1());
+		omOrderList.addAll(ret.getFabricOMOrderList2());
+		// 获取要计算成本的采购入库
+		List<FabricCostInvoice> fabricCostInvoiceList1 = fabricLossMapper.getPurchuseInPriceList(code);
+		// 根据类型、工厂、采购类型分组。根据委外出库,获取出库成本。
+		List<FabricCostInvoice> fabricCostInvoiceList = new ArrayList<>();
+		for (FabricCostInvoice fabricCostInvoice : fabricCostInvoiceList1){
+			Optional<FabricCostInvoice> findItem = fabricCostInvoiceList.stream().filter(e->
+					e.getId().equals(fabricCostInvoice.getId())).findFirst();
+			FabricCostInvoice newItem = new FabricCostInvoice();
+			if (findItem.isPresent()) {
+				newItem = findItem.get();
+			}else{
+				newItem.setCBusType(fabricCostInvoice.getCBusType());
+				newItem.setIMoney(new Double(0));
+				newItem.setCVCName(fabricCostInvoice.getCVCName());
+				newItem.setCVenName(fabricCostInvoice.getCVenName());
+				newItem.setCVenAbbName(fabricCostInvoice.getCVenAbbName());
+				fabricCostInvoiceList.add(newItem);
+			}
+
+			Double money = newItem.getIMoney();
+			for (FabricOMOrder omOrder : omOrderList){
+				List<FabricMoOrderCK> ckList = omOrder.getFabricMoOrderCKList();
+				if (ckList != null) {
+					List<FabricMoOrderCK> findList1 = ckList.stream().filter(e->
+							e.getInvOutId().equalsIgnoreCase(fabricCostInvoice.getInvId())).collect(Collectors.toList());
+					for (FabricMoOrderCK ckItem : findList1) {
+						money+=ckItem.getIMoney();
+					}
+				}
+
+			}
+			BigDecimal bdValue = new BigDecimal(money);
+			newItem.setIMoney(bdValue.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
+
+		}
+
+		//获取委外订单发票金额
+		List<FabricCostInvoice> fabricCostInvoiceList2 = fabricLossMapper.getOmInvoiceMoneyList(code);
+		fabricCostInvoiceList.addAll(fabricCostInvoiceList2);
+		//获取委外订单运费发票金额
+		List<FabricCostInvoice> fabricCostInvoiceList3 = fabricLossMapper.getOmInvoiceMoneyYfList(code);
+		fabricCostInvoiceList.addAll(fabricCostInvoiceList3);
+		// 织、染、印排序
+		fabricCostInvoiceList.forEach(e->{
+			e.setOrder(-1);
+			for (int i=0; i<CVCOrderKeyList.length;i++){
+				if (e.getCVCName().indexOf(CVCOrderKeyList[i])==0){
+					e.setOrder(i);
+				}
+			}
+			if (e.getOrder() == -1){
+				e.setOrder(CVCOrderKeyList.length);
+			}
+		});
+		fabricCostInvoiceList = fabricCostInvoiceList.stream().sorted(Comparator.comparing(FabricCostInvoice::getOrder)).collect(Collectors.toList());
+
+		// 转入成本
+		fabricCostInvoiceList.addAll(getInCost(ret.getFabricPoOrderList(), omOrderList));
+		// 转出成本
+		List<FabricCostInvoice> outCostList = getOutCost(ret.getFabricPoOrderList(), ret.getFabricOMOrderList1(), ret.getFabricOMOrderList2());
+		// 设置修改的工厂
+		if (editData != null){
+			List<FabricCostInvoice> editCostList = editData.getFabricCostInvoiceList();
+			if (oConvertUtils.listIsNotEmpty(editCostList)){
+				for (FabricCostInvoice item : outCostList){
+					Optional<FabricCostInvoice> findOpt = editCostList.stream().filter(e->e.getCVCName().equalsIgnoreCase(item.getCVCName()) &&
+							"转出成本".equalsIgnoreCase(e.getCBusType())).findFirst();
+					if (findOpt.isPresent()){
+						item.setCVenAbbName(findOpt.get().getCVenAbbName());
+					}
+				}
+			}
+		}
+		fabricCostInvoiceList.addAll(outCostList);
+
+		ret.setFabricCostInvoiceList(fabricCostInvoiceList);
+	}
+
+	/**
+	 * 委外出库材料,找出不在采购入库和委外入库中,计算转入成本
+	 * @param poOrderList - 采购入库详情
+	 * @param omOrderList - 委外订单
+	 * @return
+	 */
+	private List<FabricCostInvoice> getInCost(List<FabricPoOrder> poOrderList, List<FabricOMOrder> omOrderList){
+		// 采购出入库去掉末尾两行:来源余纱、其他入库纱
+		List<FabricPoOrder> poOrderListReal = poOrderList.stream().filter(e->!e.getCPOID().equals("来源余料") &&
+				!e.getCPOID().equals("其他入库")).collect(Collectors.toList());
+		// 合并所有采购入库物料批次。借用FabricPoOrderIn类
+		List<FabricPoOrderIn> allInList = new ArrayList<>();
+		for (FabricPoOrder item : poOrderListReal){
+			List<FabricPoOrderIn> inList = item.getFabricPoOrderInList();
+			if (oConvertUtils.listIsNotEmpty(inList)){
+				for (FabricPoOrderIn itemIn : inList){
+					Optional<FabricPoOrderIn> findItemOpt = allInList.stream().filter(e->
+							e.getInvId().equalsIgnoreCase(itemIn.getInvId())).findFirst();
+					if (findItemOpt.isPresent()){
+						FabricPoOrderIn formatItem = findItemOpt.get();
+						Double dMoney = formatItem.getIPrice()*formatItem.getIQuantity()+itemIn.getIPrice()*itemIn.getIQuantity();
+						Double dQuantity = formatItem.getIQuantity()+itemIn.getIQuantity();
+						formatItem.setIPrice(dMoney/dQuantity);
+						formatItem.setIQuantity(dQuantity);
+
+					}else {
+						FabricPoOrderIn formatItem = new FabricPoOrderIn();
+						formatItem.setCInvCode(itemIn.getCInvCode());
+						formatItem.setCColor(itemIn.getCColor());
+						formatItem.setCBatch(itemIn.getCBatch());
+						formatItem.setIQuantity(itemIn.getIQuantity());
+						formatItem.setIPrice(itemIn.getIPrice());
+						allInList.add(formatItem);
+					}
+				}
+			}
+		}
+		// 合并所有委外入库物料批次。借用FabricPoOrderIn类
+		for (FabricOMOrder item : omOrderList){
+			List<FabricMoOrderRK> inList = item.getFabricMoOrderRKList();
+			if (oConvertUtils.listIsNotEmpty(inList)){
+				for (FabricMoOrderRK itemIn : inList){
+					Optional<FabricPoOrderIn> findItemOpt = allInList.stream().filter(e->
+							e.getInvId().equalsIgnoreCase(itemIn.getInvId())).findFirst();
+					if (findItemOpt.isPresent()){
+						FabricPoOrderIn formatItem = findItemOpt.get();
+						Double dMoney = formatItem.getIPrice()*formatItem.getIQuantity()+itemIn.getIPrice()*itemIn.getIQuantityIn();
+						Double dQuantity = formatItem.getIQuantity()+itemIn.getIQuantityIn();
+						formatItem.setIPrice(dMoney/dQuantity);
+						formatItem.setIQuantity(dQuantity);
+					}else {
+						FabricPoOrderIn formatItem = new FabricPoOrderIn();
+						formatItem.setCInvCode(item.getCInvCode());
+						formatItem.setCColor(item.getCColor());
+						formatItem.setCBatch(itemIn.getCBatch());
+						formatItem.setIQuantity(itemIn.getIQuantityIn());
+						formatItem.setIPrice(itemIn.getIPrice());
+						allInList.add(formatItem);
+					}
+				}
+			}
+		}
+
+
+		// 合并所有出的
+		List<FabricMoOrderCK> omOutListAll = new ArrayList<>();
+		for (FabricOMOrder omOrder : omOrderList){
+			List<FabricMoOrderCK> outList = omOrder.getFabricMoOrderCKList();
+			if (oConvertUtils.listIsNotEmpty(outList)) {
+				for (FabricMoOrderCK omOut : outList) {
+					FabricMoOrderCK outCopy = new FabricMoOrderCK();
+					outCopy.setCBatchOut(omOut.getCBatchOut());
+					outCopy.setCInvCodeOut(omOut.getCInvCodeOut());
+					outCopy.setCColorOut(omOut.getCColorOut());
+					outCopy.setIQuantity(omOut.getIQuantity());
+					outCopy.setIPrice(omOut.getIPrice());
+					outCopy.setCVCName(omOrder.getCVCName());
+					outCopy.setCVenAbbName(omOrder.getCVenAbbName());
+					outCopy.setCPlanCode(omOut.getCPlanCode());
+
+					omOutListAll.add(outCopy);
+				}
+			}
+
+		}
+		// 出-入
+		for (FabricMoOrderCK itemOut : omOutListAll){
+
+			double outLeft = itemOut.getIQuantity();
+			for (FabricPoOrderIn itemIn : allInList){
+				if (itemOut.getInvOutId().equalsIgnoreCase(itemIn.getInvId())){
+					double inLeft = itemIn.getIQuantity();
+					outLeft -= inLeft;
+					if (outLeft<0){
+						inLeft = outLeft*-1;
+					}else{
+						inLeft = 0;
+					}
+					itemIn.setIQuantity(inLeft);
+					if (outLeft<=0){
+						break;
+					}
+				}
+
+			}
+			itemOut.setIQuantity(outLeft);
+		}
+		List<FabricCostInvoice> costInvoiceList = new ArrayList<>();
+
+		// 计算总转入成本
+		for (FabricMoOrderCK itemOut : omOutListAll){
+			if (itemOut.getIQuantity()>0){
+				FabricCostInvoice fabricCostInvoice = new FabricCostInvoice();
+				fabricCostInvoice.setCVCName(itemOut.getCVCName());
+				fabricCostInvoice.setCVenAbbName(itemOut.getCPlanCode()+" "+itemOut.getCVenAbbName());
+				fabricCostInvoice.setCBusType("转入成本");
+				fabricCostInvoice.setIMoney(DoubleOperation.mul(itemOut.getIQuantity(),itemOut.getIPrice(), 2));
+				if (fabricCostInvoice.getIMoney()!=0) {
+					costInvoiceList.add(fabricCostInvoice);
+				}
+			}
+		}
+		// 分组
+		List<FabricCostInvoice> costInvoiceListGroup = new ArrayList<>();
+		for (FabricCostInvoice fabricCostInvoice : costInvoiceList){
+			Optional<FabricCostInvoice> findOpt = costInvoiceListGroup.stream().filter(e->
+					e.getId().equalsIgnoreCase(fabricCostInvoice.getId())).findFirst();
+			if (findOpt.isPresent()){
+				FabricCostInvoice find = findOpt.get();
+				BigDecimal bdVal = new BigDecimal(find.getIMoney()+fabricCostInvoice.getIMoney());
+				find.setIMoney(bdVal.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
+			}else{
+				costInvoiceListGroup.add(fabricCostInvoice);
+			}
+		}
+		return costInvoiceListGroup;
+	}
+
+	/**
+	 * 根据采购入库详情,委外订单详情,获取转出成本。(入库数量-出库数量) * 单价
+	 * @param poOrderList - 采购入库详情
+	 * @param omOrderListGn - 委外订单国内
+	 * @param omOrderListGw - 委外订单国外
+	 * @return
+	 */
+	private List<FabricCostInvoice> getOutCost(List<FabricPoOrder> poOrderList, List<FabricOMOrder> omOrderListGn, List<FabricOMOrder> omOrderListGw){
+		// 采购出入库去掉末尾两行:来源余纱、其他入库纱
+		List<FabricPoOrder> poOrderListReal = poOrderList.stream().filter(e->!e.getCPOID().equals("来源余料") &&
+				!e.getCPOID().equals("其他入库")).collect(Collectors.toList());
+		// 合并所有采购入库+委外入库的物料批次。借用FabricPoOrderIn类
+		List<FabricPoOrderIn> allInList = new ArrayList<>();
+		for (FabricPoOrder item : poOrderListReal){
+			List<FabricPoOrderIn> inList = item.getFabricPoOrderInList();
+			if (oConvertUtils.listIsNotEmpty(inList)){
+				for (FabricPoOrderIn itemIn : inList){
+					Optional<FabricPoOrderIn> findItemOpt = allInList.stream().filter(e->
+							e.getInvId().equalsIgnoreCase(itemIn.getInvId())).findFirst();
+					if (findItemOpt.isPresent()){
+						FabricPoOrderIn formatItem = findItemOpt.get();
+						Double dMoney = formatItem.getIPrice()*formatItem.getIQuantity()+itemIn.getIPrice()*itemIn.getIQuantity();
+						Double dQuantity = formatItem.getIQuantity()+itemIn.getIQuantity();
+						formatItem.setIPrice(dMoney/dQuantity);
+						formatItem.setIQuantity(dQuantity);
+
+					}else {
+						FabricPoOrderIn formatItem = new FabricPoOrderIn();
+						formatItem.setCInvCode(itemIn.getCInvCode());
+						formatItem.setCColor(itemIn.getCColor());
+						formatItem.setCBatch(itemIn.getCBatch());
+						formatItem.setIQuantity(itemIn.getIQuantity());
+						formatItem.setIPrice(itemIn.getIPrice());
+						formatItem.setCInvName(itemIn.getCInvName());
+						allInList.add(formatItem);
+					}
+				}
+			}
+		}
+
+		for (FabricOMOrder item : omOrderListGn){
+			List<FabricMoOrderRK> inList = item.getFabricMoOrderRKList();
+			if (oConvertUtils.listIsNotEmpty(inList)){
+				for (FabricMoOrderRK itemIn : inList){
+					FabricPoOrderIn formatItem = new FabricPoOrderIn();
+					formatItem.setCInvCode(item.getCInvCode());
+					formatItem.setCColor(item.getCColor());
+					formatItem.setCBatch(itemIn.getCBatch());
+					formatItem.setIQuantity(itemIn.getIQuantityIn());
+					formatItem.setIPrice(itemIn.getIPrice());
+					formatItem.setCBusType("1");        // 国内
+					formatItem.setCInvName(itemIn.getCInvName()+" "+itemIn.getCColor());
+					allInList.add(formatItem);
+				}
+			}
+		}
+
+		for (FabricOMOrder item : omOrderListGw){
+			List<FabricMoOrderRK> inList = item.getFabricMoOrderRKList();
+			if (oConvertUtils.listIsNotEmpty(inList)){
+				for (FabricMoOrderRK itemIn : inList){
+					FabricPoOrderIn formatItem = new FabricPoOrderIn();
+					formatItem.setCInvCode(item.getCInvCode());
+					formatItem.setCColor(item.getCColor());
+					formatItem.setCBatch(itemIn.getCBatch());
+					formatItem.setIQuantity(itemIn.getIQuantityIn());
+					formatItem.setIPrice(itemIn.getIPrice());
+					formatItem.setCBusType("2");        // 国外
+					formatItem.setCInvName(itemIn.getCInvName()+" "+itemIn.getCColor());
+					allInList.add(formatItem);
+				}
+			}
+		}
+
+		List<String> invIdGnList = new ArrayList<>();// 国内入库物料编码
+		List<String> invIdGwList = new ArrayList<>();// 国外入库物料编码
+		for (FabricOMOrder omOrder : omOrderListGn){
+			List<FabricMoOrderRK> omRkList = omOrder.getFabricMoOrderRKList();
+			if (oConvertUtils.listIsNotEmpty(omRkList)) {
+				for (FabricMoOrderRK rkItem : omRkList) {
+					invIdGnList.add(omOrder.getCInvCode() + omOrder.getCColor() + rkItem.getCBatch());
+				}
+			}
+		}
+		for (FabricOMOrder omOrder : omOrderListGw){
+			List<FabricMoOrderRK> omRkList = omOrder.getFabricMoOrderRKList();
+			if (oConvertUtils.listIsNotEmpty(omRkList)) {
+				for (FabricMoOrderRK rkItem : omRkList) {
+					invIdGwList.add(omOrder.getCInvCode() + omOrder.getCColor() + rkItem.getCBatch());
+				}
+			}
+		}
+		List<FabricPoOrderOut> invOutGnList = new ArrayList<>();
+		if (invIdGnList.size()>0){
+			invOutGnList = fabricLossMapper.getOmInGnOutList(invIdGnList);   //国内出库数量
+		}
+		List<FabricPoOrderOut> invOutGwList = new ArrayList<>();
+		if (invIdGwList.size()>0){
+			invOutGwList = fabricLossMapper.getOmInGwOutList(invIdGwList);   //国外出库数量
+		}
+
+		// 扣减出库数量
+		List<FabricOMOrder> omOrderListAll = new ArrayList<>();
+		omOrderListAll.addAll(omOrderListGn);
+		omOrderListAll.addAll(omOrderListGw);
+		// 转换国内外出库数量
+		List<FabricMoOrderCK> omOutListAll = new ArrayList<>();
+		for (FabricOMOrder omOrder : omOrderListAll){
+			List<FabricMoOrderCK> outList = omOrder.getFabricMoOrderCKList();
+			if (oConvertUtils.listIsNotEmpty(outList)) {
+				for (FabricMoOrderCK omOut : outList) {
+					FabricMoOrderCK outCopy = new FabricMoOrderCK();
+					outCopy.setCBatchOut(omOut.getCBatchOut());
+					outCopy.setCInvCodeOut(omOut.getCInvCodeOut());
+					outCopy.setCColorOut(omOut.getCColorOut());
+					outCopy.setIQuantity(omOut.getIQuantity());
+					omOutListAll.add(outCopy);
+				}
+			}
+
+		}
+		for (FabricPoOrderIn itemIn : allInList){
+			boolean bOmFind = false;
+
+			double inLeft = itemIn.getIQuantity();
+			for (FabricMoOrderCK outItem : omOutListAll){
+				if (outItem.getInvOutId().equalsIgnoreCase(itemIn.getInvId())){
+					double outLeft = outItem.getIQuantity();
+					bOmFind = true;
+					inLeft -= outLeft;
+					if (inLeft<0){
+						outLeft = inLeft*-1;
+					}else{
+						outLeft = 0;
+					}
+					outItem.setIQuantity(outLeft);
+					if (inLeft<=0){
+						break;
+					}
+				}
+
+			}
+			itemIn.setIQuantity(inLeft);
+			if (!bOmFind){
+				List<FabricPoOrderOut> useOutList = null;
+				// 国内
+				if ("1".equals(itemIn.getCBusType())){
+					useOutList = invOutGnList;
+				}
+				// 国外
+				else if ("2".equals(itemIn.getCBusType())){
+					useOutList = invOutGwList;
+				}
+				if (useOutList != null){
+					for (FabricPoOrderOut outItem : useOutList){
+						if (outItem.getInvId().equalsIgnoreCase(itemIn.getInvId())){
+							double outLeft = outItem.getIQuantity();
+							inLeft -= outLeft;
+							if (inLeft<0){
+								outLeft = inLeft*-1;
+							}else{
+								outLeft = 0;
+							}
+							outItem.setIQuantity(outLeft);
+							if (inLeft<=0){
+								break;
+							}
+						}
+
+					}
+					itemIn.setIQuantity(inLeft);
+
+				}
+			}
+		}
+		List<FabricCostInvoice> costInvoiceList = new ArrayList<>();
+		// 计算总转入成本
+		for (FabricPoOrderIn itemIn : allInList){
+			if (itemIn.getIQuantity()>0){
+				FabricCostInvoice fabricCostInvoice = new FabricCostInvoice();
+				fabricCostInvoice.setCVCName(itemIn.getCInvName());
+				fabricCostInvoice.setCVenAbbName("");
+				fabricCostInvoice.setCBusType("转出成本");
+				BigDecimal bdVal = new BigDecimal(itemIn.getIQuantity()*itemIn.getIPrice()*-1);
+				fabricCostInvoice.setIMoney(bdVal.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
+				if (fabricCostInvoice.getIMoney()!=0) {
+					costInvoiceList.add(fabricCostInvoice);
+				}
+			}
+		}
+
+		// 分组
+		List<FabricCostInvoice> costInvoiceListGroup = new ArrayList<>();
+		for (FabricCostInvoice fabricCostInvoice : costInvoiceList){
+			Optional<FabricCostInvoice> findOpt = costInvoiceListGroup.stream().filter(e->
+					e.getId().equalsIgnoreCase(fabricCostInvoice.getId())).findFirst();
+			if (findOpt.isPresent()){
+				FabricCostInvoice find = findOpt.get();
+				BigDecimal bdVal = new BigDecimal(find.getIMoney()+fabricCostInvoice.getIMoney());
+				find.setIMoney(bdVal.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
+			}else{
+				costInvoiceListGroup.add(fabricCostInvoice);
+			}
+		}
+
+		return costInvoiceListGroup;
+
+	}
+
+	/**
+	 * 设置委外订单详情,包含成本
+	 * @param code - 计划号
+	 * @param omOrderList - 待计算的委外订单
+	 * @param poOrderList - 采购订单-取采购入库数据
+	 * @param editData - 用户修改的数据
+	 */
+	private void setOmOrderDetail(String code,
+	                                             List<FabricOMOrder> omOrderList,
+			                                     List<FabricPoOrder> poOrderList,
+	                                             FabricLoss editData){
+		// 设置用户修改内容的数据
+		List<FabricOMOrder> editOmList = new ArrayList<>();
+		if (editData != null){
+			if (editData.getFabricOMOrderList1() != null){
+				editOmList.addAll(editData.getFabricOMOrderList1());
+			}
+			if (editData.getFabricOMOrderList2() != null){
+				editOmList.addAll(editData.getFabricOMOrderList2());
+			}
+		}
+		// 获取采购入库单
+		List<FabricPoOrderIn> poOrderInList = new ArrayList<>();
+		for (FabricPoOrder order : poOrderList){
+			poOrderInList.addAll(order.getFabricPoOrderInList());
+		}
+		poOrderInList.forEach(e->e.setITempUseSum(0.0));
+		// 获取材料出库
+		// 获取委外订单行id,出库物料信息,出库数量
+		List<FabricMoOrderCK> rowOutList = fabricLossMapper.getOmRowOutList(code);
+		rowOutList.forEach(e->e.setBCurPlan(false));
+		// 委外入库
+		List<FabricMoOrderRK> rowInList = fabricLossMapper.getOmInDetailList(code);
+		rowInList.forEach(e->e.setITempUseSum(0.0));
+		// 设置是否本计划入库标识
+		List<String> otherInInvId = new ArrayList<>();  // 其他入库的物料
+		for (FabricMoOrderCK outItem : rowOutList){
+			if (poOrderInList.stream().filter(e->e.getInvId().equalsIgnoreCase(outItem.getInvOutId())).count()>0 ||
+			rowInList.stream().filter(e->e.getInvId().equalsIgnoreCase(outItem.getInvOutId())).count()>0){
+				outItem.setBCurPlan(true);
+			}else{
+				otherInInvId.add(outItem.getInvOutId());
+			}
+		}
+		// 查询物料入库信息
+		List<FabricCommonIn> otherInList = new ArrayList<>();
+		if (otherInInvId.size()>0) {
+			otherInList = fabricLossMapper.getInListByInvId(otherInInvId);
+
+			otherInList.forEach(e -> e.setITempUseSum(0.0));
+			// 设置其他委外订单入库的材料成本,只计算一层
+			setOtherOmInPriceList(code, otherInList);
+			// 设置形态转换入库成本
+			setAssemVouchInPriceList(otherInList);
+		}
+		// 设置非本次委外加工出入库成本
+		List<FabricMoOrderCK> findOutList = rowOutList.stream().filter(e->e.getIQuantityOut()>0).collect(Collectors.toList());
+		List<FabricMoOrderCK> calCkList = new ArrayList<>();
+		for (FabricMoOrderCK outItem : findOutList){
+			// 先设置本次采购入库的
+			List<FabricPoOrderIn> findPoInList = poOrderInList.stream().filter(e->e.getInvId().equalsIgnoreCase(outItem.getInvOutId())&&DoubleOperation.sub(e.getIQuantity(),e.getITempUseSum())>0).collect(Collectors.toList());
+			for (FabricPoOrderIn inItem : findPoInList){
+				FabricMoOrderCK calItem = outItem.getByPoIn(editOmList, inItem);
+				calCkList.add(calItem);
+				if (outItem.getIQuantityOut()<=0){
+					break;
+				}
+			}
+			if (outItem.getIQuantityOut()<=0){
+				continue;
+			}
+			// 设置非本次委外和其他入库的
+			List<FabricCommonIn> findOtherInList = otherInList.stream().filter(e->e.getInvId().equalsIgnoreCase(outItem.getInvOutId())&&DoubleOperation.sub(e.getIQuantity(),e.getITempUseSum())>0).collect(Collectors.toList());
+			for (FabricCommonIn inItem : findOtherInList){
+				FabricMoOrderCK calItem = outItem.getByCommonIn(editOmList, inItem);
+				calCkList.add(calItem);
+				if (outItem.getIQuantityOut()<=0){
+					break;
+				}
+			}
+		}
+		// 设置本次委外入库的
+		boolean bFind = false;
+		do {
+			bFind = false;
+			for (FabricOMOrder omOrder : omOrderList){
+				if (omOrder.getFabricMoOrderCKList() == null){
+					omOrder.setFabricMoOrderCKList(new ArrayList<>());
+				}
+				// 已经设置过的忽略
+				if (oConvertUtils.listIsNotEmpty(omOrder.getFabricMoOrderCKList())){
+					break;
+				}
+				// 不存在未算成本的出库单
+				if (rowOutList.stream().filter(e->e.getIQuantityOut()>0&&omOrder.getMODetailsID().indexOf(e.getMODetailsID().toString())>-1).count() == 0) {
+					bFind = true;
+					// 设置订单出库明细
+					List<FabricMoOrderCK> findCkList = calCkList.stream().filter(e -> omOrder.getMODetailsID().indexOf(e.getMODetailsID().toString()) > -1).collect(Collectors.toList());
+					omOrder.setFabricMoOrderCKList(findCkList);
+					// 设置入库明细及入库成本
+					List<FabricMoOrderRK> findRkList = rowInList.stream().filter(e -> omOrder.getMODetailsID().indexOf(e.getMODetailsID().toString()) > -1).collect(Collectors.toList());
+					omOrder.setFabricMoOrderRKList(findRkList);
+
+					Double iMoneyCk = 0.0;
+					for (FabricMoOrderCK item : findCkList) {
+						iMoneyCk += item.getIMoney();
+					}
+
+					for (FabricMoOrderRK fabricMoOrderRK : findRkList) {
+						fabricMoOrderRK.setISumBillQuantityN(DoubleOperation.sub(fabricMoOrderRK.getIQuantityIn(), fabricMoOrderRK.getISumBillQuantity()));
+						fabricMoOrderRK.setISQuantityN(DoubleOperation.sub(fabricMoOrderRK.getIQuantityIn(), fabricMoOrderRK.getISQuantity()).doubleValue());
+						if (omOrder.getIQuantityIn() != 0) {
+							Double curIMoneyCk = iMoneyCk * fabricMoOrderRK.getIQuantityIn() / omOrder.getIQuantityIn();
+							fabricMoOrderRK.setIPrice(DoubleOperation.div(DoubleOperation.add(fabricMoOrderRK.getIProcessFee(), curIMoneyCk), fabricMoOrderRK.getIQuantityIn(), 4));
+						}
+					}
+					// 根据入库成本设置出库成本
+					List<FabricMoOrderCK> findNcalCkList = rowOutList.stream().filter(e->e.getIQuantityOut()>0).collect(Collectors.toList());
+					for (FabricMoOrderCK ncalCkItem : findNcalCkList){
+						List<FabricMoOrderRK> findTmpRkList = findRkList.stream().filter(e->e.getInvId().equalsIgnoreCase(ncalCkItem.getInvOutId())).collect(Collectors.toList());
+						if (findTmpRkList.size() == 0){
+							continue;
+						}
+						for (FabricMoOrderRK tmpRkItem : findTmpRkList){
+							FabricMoOrderCK calItem = ncalCkItem.getByMoIn(editOmList, tmpRkItem);
+							calCkList.add(calItem);
+							if (ncalCkItem.getIQuantityOut()<=0){
+								break;
+							}
+						}
+					}
+				}
+			}
+
+		}while(bFind);
+
+	}
+
+	/**
+	 * 设置其他物料委外入库的数量和单价
+	 * @param code - 计划号
+	 * @param commonInList - 入库信息
+	 * @return
+	 */
+	private void setOtherOmInPriceList(String code,List<FabricCommonIn> commonInList){
+		// 获取其他计划委外入库信息
+		commonInList = commonInList.stream().filter(e->
+				"委外加工".equals(e.getCBusType()) &&
+						e.getCPlanCode().indexOf(code) !=0 &&
+						e.getCPlanCode().length()>0).collect(Collectors.toList());
+		if (commonInList.size()>0){
+			List<Integer> moDetailIdList = new ArrayList<>();
+			for (FabricCommonIn item : commonInList){
+				moDetailIdList.add(item.getMODetailsID());
+			}
+			// 出入库详情
+			List<Map<String,Object>> inOutDetailList = fabricLossMapper.getOmInOutInfoListByDetailId(moDetailIdList);
+			// 获取委外订单出库物料详情
+			List<FabricMoOrderCK> outList = fabricLossMapper.getOmRowOutListByDetailId(moDetailIdList);
+			// 获取委外订单出入物料入库详情
+			List<String> invIdList = new ArrayList<>();
+			outList.forEach(e->invIdList.add(e.getInvOutId()));
+			List<FabricCommonIn> inList = fabricLossMapper.getInListByInvId(invIdList);
+			// 设置形态转换的源头单价
+			setAssemVouchInPriceList(inList);
+
+			// 每行设置金额
+			for (FabricCommonIn item : commonInList){
+				Integer detailId = item.getMODetailsID();
+				List<Map<String,Object>> findInOutList = inOutDetailList.stream().filter(e->e.get("MODetailsID").toString().equals(detailId)).collect(Collectors.toList());
+				if (findInOutList.size() == 0){
+					continue;
+				}
+				Double iProcessFee = oConvertUtils.getDouble(findInOutList.get(0).get("iProcessFee").toString(),0);// 加工费
+				Double iQuantityIn = oConvertUtils.getDouble(findInOutList.get(0).get("iQuantityIn").toString(),0);// 入库数量
+				Double iOutTotalMoney = 0.0;//出库材料费用总额
+
+				for (FabricMoOrderCK ckItem : outList){
+					if (ckItem.getMODetailsID().equals(item.getMODetailsID())){
+						for (FabricCommonIn inItem : inList){
+							if (inItem.getInvId().equalsIgnoreCase(ckItem.getInvOutId())){
+								iOutTotalMoney = DoubleOperation.add(iOutTotalMoney, DoubleOperation.mul(inItem.getIPrice(),ckItem.getIQuantityOut(),2));
+							}
+						}
+					}
+				}
+				// 入库单价
+				Double iPrice = DoubleOperation.div(DoubleOperation.add(iProcessFee,iOutTotalMoney),iQuantityIn,4);
+
+				item.setIPrice(iPrice);
+			}
+		}
+	}
+	/**
+	 * 设置物料形态转换入库的数量和单价
+	 * findOtherInList - 其他入库数量及单价
+	 * @return
+	 */
+	private void setAssemVouchInPriceList(List<FabricCommonIn> commonInList){
+
+		// 如果形态转换物料,转换前入库是转换入库,获取源头入库单
+		List<FabricAssemVouchsOrgIn> assemVouchsInvIdList = new ArrayList<>();// 形态转换物料id
+		for (FabricCommonIn commonIn : commonInList){
+			if ("转换入库".equalsIgnoreCase(commonIn.getCBusType())) {
+				FabricAssemVouchsOrgIn orgIn = new FabricAssemVouchsOrgIn();
+				orgIn.setCInvIdFinal(commonIn.getInvId());
+				orgIn.setCInvIdAfter(commonIn.getInvId());
+				orgIn.setCBusType(commonIn.getCBusType());
+				assemVouchsInvIdList.add(orgIn);
+			}
+		}
+		// 获取物业原始入库单信息
+		while (assemVouchsInvIdList.stream().filter(e->"转换入库".equalsIgnoreCase(e.getCBusType())).count()>0){
+			// 获取转换入库物料id
+			List<String> invIdList = assemVouchsInvIdList.stream().filter(e->"转换入库".equalsIgnoreCase(e.getCBusType())).map(FabricAssemVouchsOrgIn::getCInvIdAfter).collect(Collectors.toList());
+			// 获取转换前入入库内容
+			List<FabricAssemVouchsOrgIn> orgInList = fabricLossMapper.getAssemVouchsOrgInList(invIdList);
+			if (orgInList.size() == 0){
+				break;
+			}
+			for (FabricAssemVouchsOrgIn item : assemVouchsInvIdList){
+				if ("转换入库".equalsIgnoreCase(item.getCBusType())){
+					Optional<FabricAssemVouchsOrgIn> findOpt = orgInList.stream().filter(e->e.getCInvIdAfter().equals(item.getCInvIdAfter())).findFirst();
+					if (findOpt.isPresent()){
+						FabricAssemVouchsOrgIn findItem = findOpt.get();
+						item.setCBusType(findItem.getCBusType());
+						item.setCTableName(findItem.getCTableName());
+						item.setCInvIdAfter(findItem.getCInvIdBefore());
+						item.setAutoId(findItem.getAutoId());
+					}
+				}
+			}
+		}
+		// 设置采购入库单价
+		List<Integer> autoIdList = assemVouchsInvIdList.stream().filter(e->"rdrecords01".equalsIgnoreCase(e.getCTableName())).map(FabricAssemVouchsOrgIn::getAutoId).collect(Collectors.toList());
+		if (autoIdList.size()>0){
+			List<FabricInPrice> priceList = fabricLossMapper.getPoInPriceList(autoIdList);
+			setAssemVouchsInPrice(commonInList, assemVouchsInvIdList, priceList);
+		}
+		// 设置其他入库单价
+		autoIdList = assemVouchsInvIdList.stream().filter(e->"rdrecords08".equalsIgnoreCase(e.getCTableName())).map(FabricAssemVouchsOrgIn::getAutoId).collect(Collectors.toList());
+		if (autoIdList.size()>0){
+			List<FabricInPrice> priceList = fabricLossMapper.getOtherInPriceList(autoIdList);
+			setAssemVouchsInPrice(commonInList, assemVouchsInvIdList, priceList);
+		}
+
+	}
+
+	/**
+	 * 根据形态转换物料,设置采购入库/其他入库价格
+	 * @param commonInList - 入库信息
+	 * @param assemVouchsOrgInList - 形态转换信息
+	 * @param priceList - 价格信息
+	 */
+	private void setAssemVouchsInPrice(List<FabricCommonIn> commonInList, List<FabricAssemVouchsOrgIn> assemVouchsOrgInList,
+	                                    List<FabricInPrice> priceList){
+		priceList.forEach(e->{
+			commonInList.forEach(i->{
+				if (assemVouchsOrgInList.stream().filter(v->
+						v.getAutoId().equals(e.getAutoId())&&
+								i.getInvId().equalsIgnoreCase(v.getCInvIdFinal())).count()>0){
+					i.setIPrice(DoubleOperation.getScale(e.getIPrice(),4));
+				}
+			});
+		});
+	}
+
+	/**
+	 * 根据委外订单设置分配数量、余纱、采购损耗,来源余纱、其他入库的纱
+	 * @param ret
+	 */
+	private void setPoOrderListByOmOrderList(FabricLoss ret) {
+		String code = ret.getCCode();
+		// 获取所有委外订单
+		List<FabricOMOrder> allOmOrderList = new ArrayList<>();
+		if (oConvertUtils.listIsNotEmpty(ret.getFabricOMOrderList1())) {
+			allOmOrderList.addAll(ret.getFabricOMOrderList1());
+		}
+		if (oConvertUtils.listIsNotEmpty(ret.getFabricOMOrderList2())) {
+			allOmOrderList.addAll(ret.getFabricOMOrderList2());
+		}
+		// 获取委外出库、入库内容
+		List<FabricMoOrderCK> moOrderCKList = new ArrayList<>();
+		List<FabricMoOrderRK> moOrderRKList = new ArrayList<>();
+		for (FabricOMOrder o : allOmOrderList){
+			if (oConvertUtils.listIsNotEmpty(o.getFabricMoOrderCKList())) {
+				moOrderCKList.addAll(o.getFabricMoOrderCKList());
+			}
+			if (oConvertUtils.listIsNotEmpty(o.getFabricMoOrderRKList())) {
+				moOrderRKList.addAll(o.getFabricMoOrderRKList());
+			}
+		}
+		moOrderCKList.forEach(e -> e.setITempUseSum(0.0));
+		moOrderRKList.forEach(e -> e.setITempUseSum(0.0));
+		// 去掉委外入库的内容
+		for (FabricMoOrderRK moOrderRK : moOrderRKList) {
+			Double dInLeft = moOrderRK.getIQuantityIn();    // 入库剩余数量
+			for (FabricMoOrderCK ck : moOrderCKList) {
+				if (!ck.getInvOutId().equalsIgnoreCase(moOrderRK.getInvId())){
+					continue;
+				}
+				Double dCurOutSum = ck.getIQuantityOut();   // 出库单出库数量
+				if (DoubleOperation.sub(dCurOutSum, ck.getITempUseSum()) <= 0) {
+					continue;
+				}
+				Double dRealOut = dInLeft >= dCurOutSum ? dCurOutSum : dInLeft;// 对比入库单,本条出库数量
+				ck.setITempUseSum(DoubleOperation.add(ck.getITempUseSum(), dRealOut));// 出库累计数量
+				dInLeft = DoubleOperation.sub(dInLeft, dRealOut);    // 入库剩余数量
+				if (dInLeft <= 0) {
+					break;
+				}
+			}
+		}
+		// 去掉出库为0的数据
+		moOrderCKList = moOrderCKList.stream().filter(e->DoubleOperation.sub(e.getIQuantityOut(), e.getITempUseSum()) > 0).collect(Collectors.toList());
+		// 根据采购订单轮询,设置分配数量、余纱、损耗
+		List<FabricPoOrder> poOrderList = ret.getFabricPoOrderList();
+		for (FabricPoOrder poOrder : poOrderList){
+			Double dOutSum = 0.0;
+			if (oConvertUtils.listIsNotEmpty(poOrder.getFabricPoOrderInList())) {
+				for (FabricPoOrderIn orderIn : poOrder.getFabricPoOrderInList()) {
+					Double dInLeft = orderIn.getIQuantity();    // 入库剩余数量
+					for (FabricMoOrderCK ck : moOrderCKList){
+						if (!ck.getInvOutId().equalsIgnoreCase(orderIn.getInvId())){
+							continue;
+						}
+						Double dCurOutSum = ck.getIQuantityOut();   // 出库单出库数量
+						if (DoubleOperation.sub(dCurOutSum,ck.getITempUseSum())<=0){
+							continue;
+						}
+						Double dRealOut = dInLeft>=dCurOutSum?dCurOutSum:dInLeft;// 对比入库单,本条出库数量
+						ck.setITempUseSum(DoubleOperation.add(ck.getITempUseSum(),dRealOut));// 出库累计数量
+						dInLeft = DoubleOperation.sub(dInLeft,dRealOut);    // 入库剩余数量
+						dOutSum = DoubleOperation.add(dOutSum, dRealOut);
+						if (dInLeft<=0){
+							break;
+						}
+					}
+				}
+			}
+			// 设置分配数量、余纱、损耗
+			poOrder.setIQuantityOut(dOutSum);
+			poOrder.setIQuantityLeft(DoubleOperation.sub(poOrder.getIQuantityIn(),dOutSum));
+			poOrder.setIQuantityLeftRate(DoubleOperation.div(poOrder.getIQuantityLeft(),poOrder.getIQuantityIn(), 4));
+		}
+		// 设置来源余纱和其他入库的纱:批号是期初的,算来源余纱;物料名称是杂纱的,算其他入库的纱
+		List<FabricPoOrderOut> lyysList = new ArrayList<>();    // 来源余纱
+		List<FabricPoOrderOut> qtrkList = new ArrayList<>();    // 其他入库的纱
+		for (FabricMoOrderCK moOrderCK : moOrderCKList){
+			// 非采购展现物料过滤
+			if (!moOrderCK.isPoInventory()){
+				continue;
+			}
+			FabricPoOrderOut poOrderOut = FabricPoOrderOut.getByMoOut(moOrderCK);
+			// 批号是期初的,或者普通采购入库的非杂纱,算来源余纱
+			if ("期初".equalsIgnoreCase(moOrderCK.getCBatchOut()) ||
+					"普通采购".equalsIgnoreCase(moOrderCK.getCBusType()) && !"杂纱".equalsIgnoreCase(moOrderCK.getCInvNameOut())){
+				lyysList.add(poOrderOut);
+			}else if ("其他入库".equalsIgnoreCase(moOrderCK.getCBusType()) ||
+					"转换入库".equalsIgnoreCase(moOrderCK.getCBusType()) ||
+					"杂纱".equalsIgnoreCase(moOrderCK.getCInvNameOut())){
+				qtrkList.add(poOrderOut);
+			}
+		}
+		ret.getFabricPoOrderList().addAll(FabricPoOrder.getByPoOrderOutList(lyysList,"来源余料"));
+		ret.getFabricPoOrderList().addAll(FabricPoOrder.getByPoOrderOutList(qtrkList,"其他入库"));
+	}
 }

+ 17 - 0
jeecg-boot-module-system/src/main/java/org/jeecg/modules/system/util/DoubleOperation.java

@@ -28,6 +28,23 @@ public class DoubleOperation {
 		BigDecimal p2 = new BigDecimal(Double.toString(d2));
 		return p1.multiply(p2).doubleValue();
 	}
+	public static Double mul(Double d1, Double d2, int scale){
+		BigDecimal p1 = new BigDecimal(Double.toString(d1));
+		BigDecimal p2 = new BigDecimal(Double.toString(d2));
+		BigDecimal p3 = p1.multiply(p2);
+		return p3.setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
+	}
+
+	/**
+	 * 保留位数
+	 * @param d1
+	 * @param scale
+	 * @return
+	 */
+	public static Double getScale(Double d1, int scale){
+		BigDecimal p1 = new BigDecimal(Double.toString(d1));
+		return p1.setScale(scale, BigDecimal.ROUND_HALF_UP).doubleValue();
+	}
 
 	/**
 	 *