|
@@ -74,6 +74,9 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
|
|
|
//合同计量单元与清单中间表
|
|
|
private final IInventoryFormMeterService inventoryFormMeterService;
|
|
|
|
|
|
+ //中间计量申请与清单中间表
|
|
|
+ private final IInventoryFormApplyService inventoryFormApplyService;
|
|
|
+
|
|
|
//合同计量单元
|
|
|
private final MeterTreeContractService meterTreeContractService;
|
|
|
|
|
@@ -186,16 +189,19 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
|
|
|
}
|
|
|
//如果是负变更,判断当前节点下是否存在当前清单
|
|
|
if (vo2.getCurrentChangeTotal().compareTo(BigDecimal.ZERO) == -1){
|
|
|
- //获取当前节点下当前清单的分解信息
|
|
|
- InventoryFormMeter meter = inventoryFormMeterService.getOne(new LambdaQueryWrapper<InventoryFormMeter>()
|
|
|
- .eq(InventoryFormMeter::getContractFormId, vo2.getId())
|
|
|
- .eq(InventoryFormMeter::getContractMeterId, vo2.getContractMeterId()));
|
|
|
+ //获取当前节点下当前清单的分解信息,与计量总和
|
|
|
+ InventoryFormMeterVO meter = baseMapper.getNodeFormAndMeterMoney(vo2.getId(),vo2.getContractMeterId());
|
|
|
if (meter == null){
|
|
|
- throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,未找到清单("+vo2.getFormName()+")的分解信息,不能负变更");
|
|
|
+ throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,未找到清单["+vo2.getFormName()+"]的分解信息,不能负变更");
|
|
|
}else {
|
|
|
+ //如果负变更后小于变更后施工图数量,则不能负变更
|
|
|
if (meter.getChangeBuildPictureTotal().add(vo2.getCurrentChangeTotal()).compareTo(BigDecimal.ZERO) == -1){
|
|
|
throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,清单["+vo2.getFormName()+"]负变更超过施工图变更后数量,不能负变更");
|
|
|
}
|
|
|
+ //如果负变更后变更后施工图数量小于已经计量的数量,则不能负变更
|
|
|
+ if (meter.getChangeBuildPictureTotal().add(vo2.getCurrentChangeTotal()).compareTo(meter.getAllMeterMoney()) == -1){
|
|
|
+ throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,清单["+vo2.getFormName()+"]负变更后变更后施工图数量小于已计量量,导致超计,不能负变更");
|
|
|
+ }
|
|
|
}
|
|
|
}else if (vo2.getCurrentChangeTotal().compareTo(BigDecimal.ZERO) == 0){
|
|
|
throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,清单("+vo2.getFormName()+")的变更数量为0,请确认后再提交");
|
|
@@ -380,16 +386,19 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
|
|
|
}
|
|
|
//如果是负变更,判断当前节点下是否存在当前清单
|
|
|
if (vo2.getCurrentChangeTotal().compareTo(BigDecimal.ZERO) == -1){
|
|
|
- //获取当前节点下当前清单的分解信息
|
|
|
- InventoryFormMeter meter = inventoryFormMeterService.getOne(new LambdaQueryWrapper<InventoryFormMeter>()
|
|
|
- .eq(InventoryFormMeter::getContractFormId, vo2.getId())
|
|
|
- .eq(InventoryFormMeter::getContractMeterId, vo2.getContractMeterId()));
|
|
|
+ //获取当前节点下当前清单的分解信息,与计量总和
|
|
|
+ InventoryFormMeterVO meter = baseMapper.getNodeFormAndMeterMoney(vo2.getId(),vo2.getContractMeterId());
|
|
|
if (meter == null){
|
|
|
throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,未找到清单["+vo2.getFormName()+"]的分解信息,不能负变更");
|
|
|
}else {
|
|
|
- if (meter.getBuildPictureTotal().add(vo2.getCurrentChangeTotal()).compareTo(BigDecimal.ZERO) == -1){
|
|
|
+ //如果负变更后小于变更后施工图数量,则不能负变更
|
|
|
+ if (meter.getChangeBuildPictureTotal().add(vo2.getCurrentChangeTotal()).compareTo(BigDecimal.ZERO) == -1){
|
|
|
throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,清单["+vo2.getFormName()+"]负变更超过施工图变更后数量,不能负变更");
|
|
|
}
|
|
|
+ //如果负变更后变更后施工图数量小于已经计量的数量,则不能负变更
|
|
|
+ if (meter.getChangeBuildPictureTotal().add(vo2.getCurrentChangeTotal()).compareTo(meter.getAllMeterMoney()) == -1){
|
|
|
+ throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,清单["+vo2.getFormName()+"]负变更后变更后施工图数量小于已计量量,导致超计,不能负变更");
|
|
|
+ }
|
|
|
}
|
|
|
}else if (vo2.getCurrentChangeTotal().compareTo(BigDecimal.ZERO) == 0){
|
|
|
throw new ServiceException(voMap.get(vo2.getContractMeterId()).getNodeName()+"部位下,清单["+vo2.getFormName()+"]的变更数量为0,请确认后再提交");
|
|
@@ -506,8 +515,14 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
|
|
|
//为防止中途其他变更执行,获取节点和清单的最新数据进行重新计算再变更
|
|
|
//获取当前变更令的变更节点
|
|
|
List<ChangeNodeVO> allNode = baseMapper.getNodeList2(id, form.getContractId());
|
|
|
+ if (allNode.size() == 0){
|
|
|
+ throw new ServiceException("当前变更令的变更节点为空,下达失败");
|
|
|
+ }
|
|
|
//获取当前变更令的所有变更清单
|
|
|
List<ChangeFormVO2> allForm = baseMapper.getFormList2(id,form.getContractId());
|
|
|
+ if (allForm.size() == 0){
|
|
|
+ throw new ServiceException("当前变更令的变更清单为空,下达失败");
|
|
|
+ }
|
|
|
//修改合同清单,此条清单的变更后数量和变更后金额,
|
|
|
// 所有清单按照清单id分组,
|
|
|
Map<Long, List<ChangeFormVO2>> map = allForm.stream().collect(Collectors.groupingBy(ChangeFormVO2::getId));
|
|
@@ -584,7 +599,7 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
|
|
|
list5.add(meter);
|
|
|
}else {
|
|
|
//判断施工图数量是否发生变化,发生变化代表新增之后下达之前,变更过,则修改中间表的变更前数量和变更前金额
|
|
|
- if (!vo2.getNewestChangeTotal().equals(vo2.getContractTotal())) {
|
|
|
+ if (!vo2.getNewestChangeTotal().equals(vo2.getContractTotal()) || StringUtils.isNotBlank(vo2.getApplyIds())) {
|
|
|
//为allForm设置最终的当前节点当前清单变更后数量,用于修改清单与中间计量申请
|
|
|
vo2.setChangeTotal(vo2.getNewestChangeTotal().add(vo2.getCurrentChangeTotal()));
|
|
|
vo2.setChangeMoney(vo2.getNewestChangeMoney().add(vo2.getCurrentChangeMoney()));
|
|
@@ -594,6 +609,7 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
|
|
|
ct.setChangeAfterTotal(vo2.getChangeTotal());
|
|
|
ct.setChangeBeforeMoney(vo2.getNewestChangeMoney());
|
|
|
ct.setChangeAfterMoney(vo2.getChangeMoney());
|
|
|
+ ct.setApplyIds(vo2.getApplyIds());
|
|
|
list3.add(ct);
|
|
|
}
|
|
|
InventoryFormMeter meter = new InventoryFormMeter();
|
|
@@ -636,7 +652,11 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
|
|
|
meterTreeContractService.asyncCalculateNodeMoney(allNode);
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * 撤销变更 变更令表
|
|
|
+ */
|
|
|
@Override
|
|
|
+ @Transactional
|
|
|
public void annulChange(Long id) {
|
|
|
//判断当前状态是否是已下达
|
|
|
ChangeTokenForm form = this.getById(id);
|
|
@@ -646,16 +666,67 @@ public class ChangeTokenFormServiceImpl extends BaseServiceImpl<ChangeTokenFormM
|
|
|
if (form.getApproveStatus() != 2){
|
|
|
throw new ServiceException("当前变更任务未审批通过,撤销失败");
|
|
|
}
|
|
|
+
|
|
|
//判断是否有清单执行过二次变更,执行过则不能撤销
|
|
|
List<ChangeFormVO2> vo2 = baseMapper.getMultipleChange(id);
|
|
|
if (vo2.size() != 0){
|
|
|
- vo2.stream().map(ChangeFormVO2::getFormName).collect(Collectors.joining(",","[","]"));
|
|
|
- throw new ServiceException("当前变更之后又发生过变更,请先撤销上一次变更");
|
|
|
+ String s = vo2.stream().map(ChangeFormVO2::getFormName).distinct().collect(Collectors.joining(",", "[", "]"));
|
|
|
+ throw new ServiceException("清单:"+s+"在当前变更之后又发生过变更,请先撤销上一次变更");
|
|
|
}
|
|
|
+
|
|
|
//判断是否修改过中间计量申请,修改过则不能撤销
|
|
|
- vo2 = baseMapper.getUpdateMiddleForm(id);
|
|
|
+ //获取当前变更令所有修改的中间计量申请的id
|
|
|
+ String ids = baseMapper.getUpdateMiddleForm(id);
|
|
|
+ if (StringUtils.isNotBlank(ids)){
|
|
|
+ //存在修改,则判断这些修改是否已经删除
|
|
|
+ List<Long> longs = Func.toLongList(ids);
|
|
|
+ List<InventoryFormApply> list = inventoryFormApplyService.listByIds(longs);
|
|
|
+ if (list.size() != 0){
|
|
|
+ String s = list.stream().map(InventoryFormApply::getFormName).distinct().collect(Collectors.joining(",", "[", "]"));
|
|
|
+ throw new ServiceException("当前变更令已经修改中间计量申请的清单:"+s+"的数据,不能撤销变更,删除计量之后允许撤销");
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
+ //通过汇总项修改合同清单
|
|
|
+ List<ChangeFormVO2> vo3 = baseMapper.getAllCollectForm(id);
|
|
|
+ if (vo3.size() == 0){
|
|
|
+ throw new ServiceException("当前变更令的变更清单为空,撤销失败");
|
|
|
+ }
|
|
|
+ List<ContractInventoryForm> list2 = new ArrayList<>();
|
|
|
+ for (ChangeFormVO2 vo : vo3) {
|
|
|
+ // 修改清单数量与金额
|
|
|
+ ContractInventoryForm fo = new ContractInventoryForm();
|
|
|
+ fo.setId(vo.getId());
|
|
|
+ fo.setChangeTotal(vo.getContractTotal());
|
|
|
+ fo.setChangeMoney(vo.getContractMoney());
|
|
|
+ list2.add(fo);
|
|
|
+ }
|
|
|
+ //批量修改合同工程清单,因为mybatis的修改是伪批量,所以手动拼接
|
|
|
+ baseMapper.batchUpdateForm(list2);
|
|
|
+ //批量删除汇总项,因为撤销变更后,是可以下达的状态,下达时会重新生成最新的清单数据
|
|
|
+ baseMapper.deleteCollectForm(id);
|
|
|
|
|
|
+ //修改清单与合同计量单元中间表
|
|
|
+ //清单与合同计量单元中间表集合,用于批量修改
|
|
|
+ List<InventoryFormMeter> list4 = new ArrayList<>();
|
|
|
+ //获取当前变更令的所有变更清单
|
|
|
+ List<ChangeFormVO2> allForm = baseMapper.getFormList3(id,form.getContractId());
|
|
|
+ for (ChangeFormVO2 v : allForm) {
|
|
|
+ InventoryFormMeter meter = new InventoryFormMeter();
|
|
|
+ meter.setContractFormId(v.getId());
|
|
|
+ meter.setContractMeterId(v.getContractMeterId());
|
|
|
+ meter.setChangeBuildPictureTotal(v.getChangeTotal());
|
|
|
+ meter.setChangeBuildPictureMoney(v.getChangeMoney());
|
|
|
+ list4.add(meter);
|
|
|
+ }
|
|
|
+ baseMapper.batchUpdateMeterForm(list4);
|
|
|
+ //获取当前变更令的变更节点
|
|
|
+ List<ChangeNodeVO> allNode = baseMapper.getNodeList3(id, form.getContractId());
|
|
|
+ if (allNode.size() == 0){
|
|
|
+ throw new ServiceException("当前变更令的变更节点为空,下达失败");
|
|
|
+ }
|
|
|
+ //异步重新计算节点金额,和还原施工图号,此方法放到最后,待所有操作成功后再执行
|
|
|
+ meterTreeContractService.asyncCalculateNodeMoney(allNode);
|
|
|
this.update(new LambdaUpdateWrapper<ChangeTokenForm>()
|
|
|
.eq(ChangeTokenForm::getId,id)
|
|
|
.set(ChangeTokenForm::getCommandStatus,0));
|