소스 검색

面料损耗更新

fenghaifu 2 년 전
부모
커밋
9df0706158

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

@@ -19,14 +19,14 @@ 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 cInvCodeIn;
+//    @ApiModelProperty(value = "委外入库物料名称")
+//    private  String cInvNameIn;
+//    @ApiModelProperty(value = "委外入库名称颜色")
+//    private  String cColorIn;
+//    @ApiModelProperty(value = "委外入库批号")
+//    private  String cBatchIn;
     @ApiModelProperty(value = "材料出库物料编码")
     private  String cInvCodeOut;
     @ApiModelProperty(value = "材料出库物料名称")
@@ -45,12 +45,16 @@ public class FabricMoOrderCK {
     private  Double iQuantityIn;
     @ApiModelProperty(value = "使用数量")
     private  Double iQuantity;
-    @ApiModelProperty(value = "材料采购入库单价")
-    private  Double iPurchusePrice;
+//    @ApiModelProperty(value = "材料采购入库单价")
+//    private  Double iPurchusePrice;
     @ApiModelProperty(value = "单个成本")
     private  Double iPrice;
     @ApiModelProperty(value = "金额")
     private  Double iMoney;
     @ApiModelProperty(value = "是否异常")
     private Boolean abnormal;
+    // 委外订单子表id
+    private Integer MODetailsID;
+    // 入库物料编号+颜色
+    private  String cInvCodeColorIn;
 }

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

@@ -107,9 +107,18 @@ public interface FabricLossMapper extends BaseMapper<FabricLoss> {
 	@DS("multi-three")
 	List<FabricPoOrderOut> getPoOrderInToOther(@Param("code")String code);
 	// 委外订单-材料出库详情
-	@DS("multi-three")
-	List<FabricMoOrderCK> getOmOutDetailList(@Param("code")String code);
+	//@DS("multi-three")
+	//List<FabricMoOrderCK> getOmOutDetailList(@Param("code")String code);
 	// 委外订单-入库详情
 	@DS("multi-three")
 	List<FabricMoOrderRK> getOmInDetailList(@Param("code")String code);
+	// 获取委外订单行id,入库物料编号+颜色,处理费用,入库数量
+	@DS("multi-three")
+	List<Map<String,Object>> getOmRowInfoList(@Param("code")String code);
+	// 获取委外订单行id,出库物料信息,出库数量
+	@DS("multi-three")
+	List<FabricMoOrderCK> getOmRowOutList(@Param("code")String code);
+	// 获取委外订单出库物料的入库物料信息:包含采购入库、委外入库、其他入库
+	@DS("multi-three")
+	List<Map<String,Object>> getOmRowInList(@Param("code")String code);
 }

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

@@ -524,6 +524,7 @@
 		group by cCode,cInvCode,cColor
 	</select>
 	<!--委外订单-材料出库详情-->
+	<!--
 	<select id="getOmOutDetailList" resultType="org.jeecg.modules.report.entity.FabricMoOrderCK">
 		select f.cBusType,f.cCode,g.cVenName,g.cVenAbbName,
 			 x.cInvCode as cInvCodeIn,y.cInvName as cInvNameIn,x.cFree1 as cColorIn,x.cBatch as cBatchIn,
@@ -547,7 +548,7 @@
 		c.cInvCCode NOT LIKE '19%'
 		AND a.cCode LIKE CONCAT(#{code},'%')
 
-	</select>
+	</select>-->
 	<!--委外订单-采购入库详情-->
 	<select id="getOmInDetailList" resultType="org.jeecg.modules.report.entity.FabricMoOrderRK">
 		select a.cCode,
@@ -567,6 +568,7 @@
 
 	</select>
 	<!-- 获取委外出库的纱数量 -->
+	<!--
 	<select id="getOmOutList01" resultType="org.jeecg.modules.report.entity.FabricInventoryOut">
 		SELECT
 			b.cInvName,
@@ -585,6 +587,90 @@
 			and b.cInvCCode like '01%'
 			group by b.cinvname,a.cFree1,b.cinvcode,a.cbatch
 
+	</select>-->
+	<!-- 获取委外订单行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,
+			 (select  sum(x.iProcessFee) from  rdrecords01 x where x.iOMoDID=b.MODetailsID) as iProcessFee,
+			 (select  sum(x.iQuantity) from  rdrecords01 x where x.iOMoDID=b.MODetailsID) as iQuantityIn
+
+		FROM
+		om_momain a
+		INNER JOIN OM_MODetails b ON a.moid = b.moid
+		INNER JOIN Inventory c ON b.cinvcode = c.cinvcode
+		WHERE
+		c.cInvCCode NOT LIKE '19%'
+		AND a.cCode LIKE CONCAT(#{code},'%')
 	</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,
+			 d.iQuantity as iQuantityOut
+		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
+		WHERE
+		c.cInvCCode NOT LIKE '19%'
+		AND a.cCode LIKE CONCAT(#{code},'%')
+	</select>
+	<!-- 获取委外订单出库物料的入库物料信息:包含采购入库、委外入库、其他入库 -->
+	<select id="getOmRowInList" resultType="map">
+		(
+
+			select f.cBusType,f.cCode,g.cVenName,g.cVenAbbName,
+			e.cInvCode,isnull(e.cFree1,'') as cColor,isnull(e.cBatch,'') as cBatch,
+			e.iQuantity,
+			isnull((select sum(iSum) from PurBillVouchs  x where x.RdsId =e.autoid and f.cbustype='普通采购'),0) as iPurchuseMoney,
+			e.iOMoDID as MODetailsID
+			from rdrecords01 e
+				inner join rdrecord01 f on e.id=f.id
+				inner join Vendor g on g.cVenCode=f.cVenCode
+				where e.cinvcode+isnull(e.cfree1,'')+isnull(cbatch,'') in (
+
+					select
+						 d.cInvCode+isnull(d.cFree1,'')+isnull(d.cBatch,'')
+					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
+					WHERE
+					c.cInvCCode NOT LIKE '19%'
+					AND a.cCode like CONCAT(#{code},'%')
+
+				) and e.iQuantity>0
 
+		) union all(
+			select f.cBusType,f.cCode,'' as cVenName,'' as cVenAbbName,
+			e.cInvCode,isnull(e.cFree1,'') as cColor,isnull(e.cBatch,'') as cBatch,
+			e.iQuantity,
+			isnull(iPrice,0) as iPurchuseMoney,
+			null as MODetailsID
+			from rdrecords08 e
+				inner join rdrecord08 f on e.id=f.id
+				where e.cinvcode+isnull(e.cfree1,'')+isnull(cbatch,'') in (
+
+					select
+						 d.cInvCode+isnull(d.cFree1,'')+isnull(d.cBatch,'')
+					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
+					WHERE
+					f.cbustype='其他入库'
+					and c.cInvCCode NOT LIKE '19%'
+					AND a.cCode like CONCAT(#{code},'%')
+
+
+				)  and e.iQuantity>0
+		)
+
+	</select>
 </mapper>

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

@@ -504,97 +504,21 @@ public class FabricLossServiceImpl extends ServiceImpl<FabricLossMapper, FabricL
 	 * @return
 	 */
 	List<FabricOMOrder> setFabricOMOrderOutDetail(List<FabricOMOrder> fabricOMOrderList, String code){
-		List<FabricMoOrderCK> fabricMoOrderCKList = fabricLossMapper.getOmOutDetailList(code);
+		// 获取委外订单行id,入库物料编号+颜色,处理费用,入库数量
+		List<Map<String,Object>> rowInfoList = fabricLossMapper.getOmRowInfoList(code);
+		// 获取委外订单行id,出库物料信息,出库数量
+		List<FabricMoOrderCK> rowOutList = fabricLossMapper.getOmRowOutList(code);
+		// 获取委外订单出库物料的入库物料信息:包含采购入库、委外入库、其他入库
+		List<Map<String,Object>> rowInList = fabricLossMapper.getOmRowInList(code);
 
-		for (FabricOMOrder fabricOMOrder : fabricOMOrderList){
-			List<FabricMoOrderCK> findList = fabricMoOrderCKList.stream().filter(e->
-					e.getCInvCodeIn().equals(fabricOMOrder.getCInvCode()) &&
-					oConvertUtils.getString(e.getCColorIn()).equals(fabricOMOrder.getCColor())).collect(Collectors.toList());
+		List<FabricMoOrderCK> fabricMoOrderCKList = getFabricMoOrderCKList(rowInfoList, rowOutList, rowInList);
 
-			// 设置成本,循环查找上一级
-			if (findList.size() == 0){
-				continue;
-			}
-			FabricMoOrderCK preItem = findList.get(0);
-			double preMoney = 0;
-			boolean abnormal = false;
-			while (true){
-				FabricMoOrderCK tempItem = preItem;
-				List<FabricMoOrderCK> preList = fabricMoOrderCKList.stream().filter(e->
-						e.getCInvCodeIn().equals(tempItem.getCInvCodeOut()) &&
-						oConvertUtils.getString(e.getCColorIn()).equals(tempItem.getCColorOut()) &&
-						oConvertUtils.getString(e.getCBatchIn()).equals(tempItem.getCBatchOut())).collect(Collectors.toList());
-				if (preList.size() == 0){
-					break;
-				}
-				// 有两行单价不一样的,报异常。委外取加工单价,采购取采购单价
-				double price = 0;
-				for (FabricMoOrderCK ckItem : preList){
-					double tmpPrice = 0;
-					if ("委外加工".equals(ckItem.getCBusType())){
-						tmpPrice = ckItem.getIProcessPrice();
-					}else if ("普通采购".equals(ckItem.getCBusType())){
-						tmpPrice = ckItem.getIPurchusePrice();
-					}
-					if (price == 0){
-						price = tmpPrice;
-					}else{
-						if (price != tmpPrice){
-							abnormal = true;
-							preMoney = 0;
-							break;
-						}
-					}
-				}
-				if (price == 0){
-					abnormal = true;
-				}
-				if (abnormal){
-					break;
-				}
-				preMoney += preItem.getIQuantityIn()*price;
-				preItem = preList.get(0);
-			}
-
-			// 设置出库数量
-			//double shouldOutSum = fabricOMOrder.getIQuantityOut();
-			for (FabricMoOrderCK ckItem : findList){
-				//double curInSum = ckItem.getIQuantityIn();
-				double curOut = ckItem.getIQuantityOut();
-//				if (shouldOutSum>curInSum){
-//					curOut = curInSum;
-//				}else{
-//					curOut = shouldOutSum;
-//				}
-				BigDecimal bdVal = new BigDecimal(curOut);
-				ckItem.setIQuantity(bdVal.setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue());
-				double tmpPrice = 0;
-				double tmpMoney = preMoney;
-				if (!abnormal){
-
-
-					if ("委外加工".equals(ckItem.getCBusType())){
-						tmpPrice = ckItem.getIProcessPrice();
-					}else if ("普通采购".equals(ckItem.getCBusType())){
-						tmpPrice = ckItem.getIPurchusePrice();
-					}
-					tmpMoney += ckItem.getIQuantityIn()*tmpPrice;
-
-					if (ckItem.getIQuantity()>0) {
-						bdVal = new BigDecimal(tmpMoney);
-						ckItem.setIMoney(bdVal.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
-
-						bdVal = new BigDecimal(tmpMoney / ckItem.getIQuantity());
-						ckItem.setIPrice(bdVal.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
-					}
-				}
+		for (FabricOMOrder fabricOMOrder : fabricOMOrderList){
+			// 根据入库物料过滤
+			List<FabricMoOrderCK> findOutList = fabricMoOrderCKList.stream().filter(e->
+					e.getCInvCodeColorIn().equals(fabricOMOrder.getCInvCode()+fabricOMOrder.getCColor())).collect(Collectors.toList());
 
-//				shouldOutSum-=curOut;
-//				if (shouldOutSum<=0){
-//					break;
-//				}
-			}
-			fabricOMOrder.setFabricMoOrderCKList(findList);
+			fabricOMOrder.setFabricMoOrderCKList(findOutList);
 		}
 
 		return fabricOMOrderList;
@@ -743,4 +667,129 @@ public class FabricLossServiceImpl extends ServiceImpl<FabricLossMapper, FabricL
 
 		return fabricPoOrderLyys;
 	}
+
+	/**
+	 * 计算委外订单成本
+	 * @param rowInfoList - 委外订单行信息
+	 * @param rowOutList - 材料出库信息
+	 * @param rowInList - 材料入库信息
+	 * @return
+	 */
+	List<FabricMoOrderCK> getFabricMoOrderCKList(List<Map<String,Object>> rowInfoList,
+	                                             List<FabricMoOrderCK> rowOutList,
+	                                             List<Map<String,Object>> rowInList){
+		// 从最底层的物料向上逐级设置材料入库成本
+		do {
+			// 可设置金额材料出库委外订单行id
+			List<FabricMoOrderCK> findOutCanSetList = rowOutList.stream().filter(out->{
+				return rowInList.stream().filter(in->
+					oConvertUtils.getDouble(in.get("iPurchuseMoney").toString(),0)>0 &&
+							in.get("cInvCode").toString().equals(out.getCInvCodeOut()) &&
+							in.get("cColor").toString().equals(out.getCColorOut()) &&
+							in.get("cBatch").toString().equals(out.getCBatchOut())).count()>0;
+			}).collect(Collectors.toList());
+			// 可设置金额的入库单
+			List<Map<String,Object>> findInCanSetList = rowInList.stream().filter(in->{
+				return oConvertUtils.getDouble(in.get("iPurchuseMoney").toString(),0) == 0 &&
+						findOutCanSetList.stream().filter(out->
+							oConvertUtils.getInt(in.get("MODetailsID")).equals(out.getMODetailsID())).count()>0;
+			}).collect(Collectors.toList());
+			if (findInCanSetList.size() == 0){
+				break;
+			}
+			// 设置入库单金额
+			for (Map<String,Object> item : findInCanSetList){
+				// 本次入库加工费
+				Optional<Map<String,Object>> findRowInfoOpt = rowInfoList.stream().filter(info->
+						oConvertUtils.getInt(info.get("MODetailsID")).equals(oConvertUtils.getInt(item.get("MODetailsID")))
+				).findFirst();
+				if (!findRowInfoOpt.isPresent()){
+					continue;
+				}
+				Map<String,Object> findRowInfo = findRowInfoOpt.get();
+				// 本次加工费用
+				Double iProcessFee = oConvertUtils.getDouble(findRowInfo.get("iProcessFee").toString(),0);
+				// 本次入库总数量
+				Double iQuantityIn = oConvertUtils.getDouble(findRowInfo.get("iQuantityIn").toString(),0);
+				// 出库材料费
+				Double iOutFee = 0.0;
+				List<FabricMoOrderCK> findOutList = rowOutList.stream().filter(out->out.getMODetailsID().equals(oConvertUtils.getInt(item.get("MODetailsID")))).collect(Collectors.toList());
+				for (FabricMoOrderCK itemOut : findOutList){
+					Double outSum = itemOut.getIQuantityOut();
+					// 获取出库的入库
+					List<Map<String,Object>> findInByOutList = rowInList.stream().filter(in->
+						in.get("cInvCode").toString().equals(itemOut.getCInvCodeOut()) &&
+						in.get("cColor").toString().equals(itemOut.getCColorOut()) &&
+						in.get("cBatch").toString().equals(itemOut.getCBatchOut())).collect(Collectors.toList());
+					for (Map<String,Object> itemIn :findInByOutList){
+						Double inSum = oConvertUtils.getDouble(itemIn.get("iQuantity").toString(),0);
+						Double iPurchuseMoney = oConvertUtils.getDouble(itemIn.get("iPurchuseMoney").toString(),0);
+						Double curSum = outSum>inSum?inSum:outSum;
+						outSum -= curSum;
+						iOutFee += curSum*iPurchuseMoney/inSum;
+
+						if (outSum<=0){
+							break;
+						}
+					}
+				}
+				// 单价
+				Double iPrice = (iOutFee+iProcessFee)/iQuantityIn;
+				// 设置采购金额
+				item.put("iPurchuseMoney", iPrice*oConvertUtils.getDouble(item.get("iQuantity").toString(),0));
+			}
+
+		} while(true);
+
+		List<FabricMoOrderCK> ret = new ArrayList<>();
+		// 设置出库数据
+		for (FabricMoOrderCK itemOut : rowOutList){
+			Double outSum = itemOut.getIQuantityOut();
+			// 委外订单行
+			Optional<Map<String,Object>> findRowInfoOpt = rowInfoList.stream().filter(info->
+					oConvertUtils.getInt(info.get("MODetailsID")).equals(itemOut.getMODetailsID())
+			).findFirst();
+			if (!findRowInfoOpt.isPresent()){
+				continue;
+			}
+			// 获取出库的入库
+			List<Map<String,Object>> findInByOutList = rowInList.stream().filter(in->
+					in.get("cInvCode").toString().equals(itemOut.getCInvCodeOut()) &&
+							in.get("cColor").toString().equals(itemOut.getCColorOut()) &&
+							in.get("cBatch").toString().equals(itemOut.getCBatchOut())).collect(Collectors.toList());
+			for (Map<String,Object> itemIn :findInByOutList){
+				Double inSum = oConvertUtils.getDouble(itemIn.get("iQuantity").toString(),0);
+				Double iPurchuseMoney = oConvertUtils.getDouble(itemIn.get("iPurchuseMoney").toString(),0);
+				Double curSum = outSum>inSum?inSum:outSum;
+				outSum -= curSum;
+
+				FabricMoOrderCK retItem = new FabricMoOrderCK();
+				ret.add(retItem);
+				retItem.setCBusType(itemIn.get("cBusType").toString());
+				retItem.setCCode(itemIn.get("cCode").toString());
+				retItem.setCVenName(itemIn.get("cVenName").toString());
+				retItem.setCVenAbbName(itemIn.get("cVenAbbName").toString());
+				retItem.setCInvCodeColorIn(findRowInfoOpt.get().get("cInvCodeColorIn").toString());
+				retItem.setCInvCodeOut(itemOut.getCInvCodeOut());
+				retItem.setCInvNameOut(itemOut.getCInvNameOut());
+				retItem.setCColorOut(itemOut.getCColorOut());
+				retItem.setCBatchOut(itemOut.getCBatchOut());
+				retItem.setMODetailsID(itemOut.getMODetailsID());
+				BigDecimal bdVal = new BigDecimal(curSum);
+				retItem.setIQuantity(bdVal.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
+				retItem.setIQuantityOut(itemOut.getIQuantityOut());
+				retItem.setIQuantityIn(inSum);
+				bdVal = new BigDecimal(iPurchuseMoney/inSum*curSum);
+				retItem.setIMoney(bdVal.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue());
+				bdVal = new BigDecimal(iPurchuseMoney/inSum);
+				retItem.setIPrice(bdVal.setScale(4, BigDecimal.ROUND_HALF_UP).doubleValue());
+
+				if (outSum<=0){
+					break;
+				}
+			}
+		}
+
+		return ret;
+	}
 }