|
|
|
|
@ -1,18 +1,23 @@ |
|
|
|
|
package org.springblade.desk.order.service.impl; |
|
|
|
|
|
|
|
|
|
import cn.hutool.core.date.DateTime; |
|
|
|
|
import com.baomidou.mybatisplus.core.metadata.IPage; |
|
|
|
|
import lombok.RequiredArgsConstructor; |
|
|
|
|
import org.springblade.core.mp.base.BaseServiceImpl; |
|
|
|
|
import org.springblade.core.secure.BladeUser; |
|
|
|
|
import org.springblade.core.secure.utils.AuthUtil; |
|
|
|
|
import org.springblade.core.tool.utils.BeanUtil; |
|
|
|
|
import org.springblade.core.tool.utils.DateUtil; |
|
|
|
|
import org.springblade.core.tool.utils.Func; |
|
|
|
|
import org.springblade.desk.order.mapper.PlateGoodsApplyMapper; |
|
|
|
|
import org.springblade.desk.order.pojo.entity.*; |
|
|
|
|
import org.springblade.desk.order.pojo.entity.AssayContentDetail; |
|
|
|
|
import org.springblade.desk.order.pojo.entity.PlateGoodsApply; |
|
|
|
|
import org.springblade.desk.order.pojo.entity.PlateGoodsRecord; |
|
|
|
|
import org.springblade.desk.order.pojo.enums.AssayContentEnum; |
|
|
|
|
import org.springblade.desk.order.pojo.enums.PlateGoodsEnum; |
|
|
|
|
import org.springblade.desk.order.service.*; |
|
|
|
|
import org.springblade.desk.order.service.IAssayContentDetailService; |
|
|
|
|
import org.springblade.desk.order.service.IAssayContentService; |
|
|
|
|
import org.springblade.desk.order.service.IPlateGoodsApplyService; |
|
|
|
|
import org.springblade.desk.order.service.IPlateGoodsRecordService; |
|
|
|
|
import org.springframework.stereotype.Service; |
|
|
|
|
import org.springframework.transaction.annotation.Transactional; |
|
|
|
|
|
|
|
|
|
@ -60,11 +65,24 @@ public class PlateGoodsApplyServiceImpl extends BaseServiceImpl<PlateGoodsApplyM |
|
|
|
|
|
|
|
|
|
@Transactional(rollbackFor = Exception.class) |
|
|
|
|
@Override |
|
|
|
|
public boolean save(List<AssayContentDetail> assayContentDetailList, List<Long> recordIdList) { |
|
|
|
|
public boolean save(PlateGoodsApply apply, List<AssayContentDetail> assayContentDetailList, List<Long> recordIdList) { |
|
|
|
|
// 1. 更新化验记录相关数据
|
|
|
|
|
if (Func.isEmpty(assayContentDetailList)) { |
|
|
|
|
return false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 初始化物料需求申报的部分数据
|
|
|
|
|
apply.setCreateTime(DateTime.now()); |
|
|
|
|
apply.setCreateUser(AuthUtil.getUserId()); |
|
|
|
|
apply.setUpdateTime(DateTime.now()); |
|
|
|
|
apply.setUpdateUser(AuthUtil.getUserId()); |
|
|
|
|
apply.setStatus(PlateGoodsEnum.STATUS_WAITING.getCode()); |
|
|
|
|
apply.setApprovalStatus(PlateGoodsEnum.STATUS_WAITING.getCode()); |
|
|
|
|
// 本次申报物料需求单总物料需求剩余量
|
|
|
|
|
BigDecimal goodsDemandTotal = BigDecimal.ZERO; |
|
|
|
|
// 本次申报物料需求单已添加量
|
|
|
|
|
BigDecimal declaredQuotaTotal = BigDecimal.ZERO; |
|
|
|
|
|
|
|
|
|
// 1.1 获取化验记录ID,更新化验记录状态为已使用
|
|
|
|
|
Long assayContentId = assayContentDetailList.get(0).getAcId(); |
|
|
|
|
assayContentService.changeStatus(Arrays.asList(assayContentId), AssayContentEnum.STATUS_USED.getCode()); |
|
|
|
|
@ -72,59 +90,38 @@ public class PlateGoodsApplyServiceImpl extends BaseServiceImpl<PlateGoodsApplyM |
|
|
|
|
// 1.2 报错化验记录明细
|
|
|
|
|
assayContentDetailService.updateBatchById(assayContentDetailList); |
|
|
|
|
|
|
|
|
|
// 2. 计算本次总添加量
|
|
|
|
|
// 2. 计算本次总添加量(班组添加量)
|
|
|
|
|
BigDecimal addVal = assayContentDetailList.stream() |
|
|
|
|
.map(detail -> detail.getAddVal() == null ? BigDecimal.ZERO : detail.getAddVal()) |
|
|
|
|
.reduce(BigDecimal.ZERO, BigDecimal::add); |
|
|
|
|
apply.setGoodsAddTotal(addVal); |
|
|
|
|
|
|
|
|
|
// 3. 更新需求单的相关数据
|
|
|
|
|
// 3.1 根据id查询需求单
|
|
|
|
|
List<PlateGoodsRecord> recordList = goodsRecordService.listByIds(recordIdList); |
|
|
|
|
List<PlateGoodsApply> applyList = new ArrayList<>(); |
|
|
|
|
|
|
|
|
|
// 3.2 将需求单按照创建时间正序排列,
|
|
|
|
|
recordList = recordList.stream() |
|
|
|
|
.sorted(Comparator.comparing(PlateGoodsRecord::getCreateTime, Comparator.nullsLast(Date::compareTo))) |
|
|
|
|
.collect(Collectors.toList()); |
|
|
|
|
|
|
|
|
|
// 计算本次申请总添加量
|
|
|
|
|
BigDecimal applyTotalVal = recordList.stream() |
|
|
|
|
.map(detail -> detail.getSurplus() == null ? BigDecimal.ZERO : detail.getSurplus()) |
|
|
|
|
.reduce(BigDecimal.ZERO, BigDecimal::add); |
|
|
|
|
// 本次剩余单号余量, 最小为0
|
|
|
|
|
BigDecimal notAddVal = applyTotalVal.subtract(addVal); |
|
|
|
|
notAddVal = notAddVal.compareTo(BigDecimal.ZERO) < 0 ? BigDecimal.ZERO : notAddVal; |
|
|
|
|
|
|
|
|
|
// 缓存要添加的订单列表
|
|
|
|
|
List<PlateGoodsRecord> addRecordList = new ArrayList<>(); |
|
|
|
|
|
|
|
|
|
// 3.3. 按照创建先后顺序补充需求单的物料需求数量
|
|
|
|
|
for (PlateGoodsRecord plateGoodsRecord : recordList) { |
|
|
|
|
// 对申请的数据进行计算
|
|
|
|
|
goodsDemandTotal = goodsDemandTotal.add(plateGoodsRecord.getSurplus()); |
|
|
|
|
declaredQuotaTotal = declaredQuotaTotal.add(plateGoodsRecord.getGoodsDemand().subtract(plateGoodsRecord.getSurplus())); |
|
|
|
|
|
|
|
|
|
// 获取需求单剩余添加量
|
|
|
|
|
BigDecimal surplus = plateGoodsRecord.getSurplus(); |
|
|
|
|
|
|
|
|
|
PlateGoodsApply apply = BeanUtil.copyProperties(plateGoodsRecord, PlateGoodsApply.class); |
|
|
|
|
apply.setId(null); |
|
|
|
|
apply.setCreateTime(null); |
|
|
|
|
apply.setCreateUser(AuthUtil.getUserId()); |
|
|
|
|
apply.setUpdateTime(null); |
|
|
|
|
apply.setUpdateUser(AuthUtil.getUserId()); |
|
|
|
|
apply.setStatus(PlateGoodsEnum.STATUS_WAITING.getCode()); |
|
|
|
|
apply.setApprovalMan(null); |
|
|
|
|
apply.setApprovalStatus(PlateGoodsEnum.STATUS_WAITING.getCode()); |
|
|
|
|
apply.setApprovalTime(null); |
|
|
|
|
apply.setApprovalMemo(null); |
|
|
|
|
|
|
|
|
|
if (addVal.compareTo(surplus) >= 0) { |
|
|
|
|
// 若本次添加量,满足该订单后,还有剩余, 记录此订单,更新剩余添加量后,继续循环
|
|
|
|
|
plateGoodsRecord.setSurplus(BigDecimal.ZERO); |
|
|
|
|
plateGoodsRecord.setStatus(PlateGoodsEnum.STATUS_DONE.getCode()); |
|
|
|
|
addRecordList.add(plateGoodsRecord); |
|
|
|
|
|
|
|
|
|
apply.setPgrId(plateGoodsRecord.getId()); |
|
|
|
|
apply.setSurplus(BigDecimal.ZERO); |
|
|
|
|
applyList.add(apply); |
|
|
|
|
|
|
|
|
|
addVal = addVal.subtract(surplus); |
|
|
|
|
if (BigDecimal.ZERO.equals(addVal)) { |
|
|
|
|
break; |
|
|
|
|
@ -134,35 +131,17 @@ public class PlateGoodsApplyServiceImpl extends BaseServiceImpl<PlateGoodsApplyM |
|
|
|
|
plateGoodsRecord.setSurplus(surplus.subtract(addVal)); |
|
|
|
|
plateGoodsRecord.setStatus(PlateGoodsEnum.STATUS_USING.getCode()); |
|
|
|
|
addRecordList.add(plateGoodsRecord); |
|
|
|
|
apply.setPgrId(plateGoodsRecord.getId()); |
|
|
|
|
apply.setSurplus(surplus.subtract(addVal)); |
|
|
|
|
applyList.add(apply); |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// 4. 记录添加的需求单信息; 关联单号, 本次剩余单号余量
|
|
|
|
|
String addAbortRecordNo = addRecordList.stream() |
|
|
|
|
.map(PlateGoodsRecord::getDemandCode) |
|
|
|
|
.filter(code -> code != null && !code.trim().isEmpty()) |
|
|
|
|
.collect(Collectors.joining(",")); |
|
|
|
|
apply.setGoodsDemandTotal(goodsDemandTotal); |
|
|
|
|
apply.setDeclaredQuotaTotal(declaredQuotaTotal); |
|
|
|
|
|
|
|
|
|
for (PlateGoodsRecord plateGoodsRecord : addRecordList) { |
|
|
|
|
plateGoodsRecord.setInvolvingRecordCode(addAbortRecordNo); |
|
|
|
|
plateGoodsRecord.setDetailOrderNum(addRecordList.size()); |
|
|
|
|
} |
|
|
|
|
goodsRecordService.updateBatchById(addRecordList); |
|
|
|
|
saveBatch(applyList); |
|
|
|
|
this.save(apply); |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
|
public List<YieldOrder> listDetailYieldOrder(Long id) { |
|
|
|
|
PlateGoodsApply apply = this.getById(id); |
|
|
|
|
// 申请明细使用需求的明细,先查询关联的需求
|
|
|
|
|
PlateGoodsRecord record = goodsRecordService.getById(apply.getPgrId()); |
|
|
|
|
// 查询关联订单列表
|
|
|
|
|
List<YieldOrder> yieldOrderList = goodsRecordService.listDetailYieldOrder(record.getId()); |
|
|
|
|
return yieldOrderList; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|