Commit 226513fd32152d2f97b0abd4ca0fa6a2b896b7f9

Authored by 房远帅
1 parent 69338cd7

合同:经销、外贸库存合同拆分

... ... @@ -467,6 +467,12 @@ public class GetContractDistributorStandardBo extends BaseBo<ContractDistributor
467 467 @ApiModelProperty(value = "是否可修改")
468 468 private Boolean canEdit;
469 469
  470 + /**
  471 + * 是否可拆分
  472 + */
  473 + @ApiModelProperty(value = "是否可拆分")
  474 + private Boolean canSplit;
  475 +
470 476 public GetContractDistributorStandardBo() {
471 477
472 478 }
... ...
1 1 package com.lframework.xingyun.sc.bo.contract;
2 2
  3 +import com.baomidou.mybatisplus.annotation.TableField;
3 4 import com.fasterxml.jackson.annotation.JsonFormat;
4 5 import com.lframework.starter.common.constants.StringPool;
5 6 import com.lframework.starter.web.core.bo.BaseBo;
... ... @@ -227,6 +228,12 @@ public class QueryContractDistributorStandardBo extends BaseBo<ContractDistribut
227 228 @ApiModelProperty(value = "双方盖章合同名称")
228 229 private String signedContractFileName;
229 230
  231 + /**
  232 + * 是否可拆分
  233 + */
  234 + @ApiModelProperty(value = "是否可拆分")
  235 + private Boolean canSplit;
  236 +
230 237
231 238 public QueryContractDistributorStandardBo() {
232 239
... ...
... ... @@ -806,6 +806,21 @@ public class ContractDistributorStandardController extends DefaultBaseController
806 806 return destinationBuilder.toString();
807 807 }
808 808
  809 + @ApiModelProperty("拆分")
  810 + @HasPermission({"contract-manage:distribution-inventory-contract:split", "contract-manage:foreign-trade-inventory-contract:split"})
  811 + @PostMapping("/split")
  812 + public InvokeResult<Void> split(@RequestBody UpdateContractDistributorStandardVo vo) {
  813 + if (vo == null || StringUtils.isBlank(vo.getId())) {
  814 + throw new DefaultClientException("参数错误!");
  815 + }
  816 +
  817 + contractDistributorStandardService.splitInventoryContract(vo);
  818 +
  819 + contractDistributorStandardService.cleanCacheByKey(vo.getId());
  820 +
  821 + return InvokeResultBuilder.success();
  822 + }
  823 +
809 824 /**
810 825 * 标准合同模版打印
811 826 */
... ...
... ... @@ -356,4 +356,10 @@ public class ContractDistributorStandard extends BaseEntity implements BaseDto {
356 356 */
357 357 @TableField(exist = false)
358 358 private Boolean canEdit;
  359 +
  360 + /**
  361 + * 是否可拆分
  362 + */
  363 + @TableField(exist = false)
  364 + private Boolean canSplit;
359 365 }
... ...
... ... @@ -14,14 +14,12 @@ import com.lframework.starter.mq.core.service.MqProducerService;
14 14 import com.lframework.starter.web.core.components.security.SecurityUtil;
15 15 import com.lframework.starter.web.inner.dto.message.SysSiteMessageDto;
16 16 import com.lframework.starter.web.inner.entity.SysDataDicItem;
17   -import com.lframework.starter.web.inner.entity.SysRole;
18 17 import com.lframework.starter.web.inner.service.system.SysDataDicItemService;
19 18 import com.lframework.starter.web.inner.service.system.SysRoleService;
20 19 import com.lframework.starter.web.inner.service.system.SysUserDeptService;
21 20 import com.lframework.starter.web.inner.service.system.SysUserRoleService;
22 21 import com.lframework.xingyun.basedata.entity.Workshop;
23 22 import com.lframework.xingyun.basedata.service.workshop.WorkshopService;
24   -import com.lframework.xingyun.basedata.vo.workshop.QueryWorkshopVo;
25 23 import com.lframework.xingyun.sc.controller.contract.ContractDistributorStandardController;
26 24 import com.lframework.xingyun.sc.entity.*;
27 25 import com.lframework.starter.web.core.impl.BaseMpServiceImpl;
... ... @@ -53,13 +51,12 @@ import com.lframework.xingyun.sc.vo.contract.updateVo.UpdateContractStdProcessin
53 51 import com.lframework.xingyun.sc.vo.order.CreatePurchaseOrderInfoVo;
54 52 import com.lframework.xingyun.sc.vo.order.CreatePurchaseOrderLineVo;
55 53 import com.lframework.xingyun.sc.vo.order.QueryPurchaseOrderLineVo;
  54 +import cn.hutool.core.bean.BeanUtil;
56 55 import lombok.extern.slf4j.Slf4j;
57 56 import org.apache.commons.collections4.CollectionUtils;
58 57 import org.apache.commons.lang3.StringUtils;
59 58 import org.springframework.beans.factory.annotation.Autowired;
60 59 import org.springframework.cache.annotation.CacheEvict;
61   -import org.springframework.cache.annotation.Cacheable;
62   -import org.springframework.security.core.parameters.P;
63 60 import org.springframework.stereotype.Service;
64 61 import org.springframework.transaction.annotation.Transactional;
65 62
... ... @@ -217,7 +214,9 @@ public class ContractDistributorStandardServiceImpl extends
217 214 @Override
218 215 public List<ContractDistributorStandard> query(QueryContractDistributorStandardVo vo) {
219 216
220   - return getBaseMapper().query(vo);
  217 + List<ContractDistributorStandard> datas = getBaseMapper().query(vo);
  218 + CollectionUtils.emptyIfNull(datas).forEach(data -> data.setCanSplit(isCanSplitByCode(data.getCode())));
  219 + return datas;
221 220 }
222 221
223 222 @Override
... ... @@ -227,6 +226,7 @@ public class ContractDistributorStandardServiceImpl extends
227 226 if (data == null) {
228 227 return null;
229 228 }
  229 + data.setCanSplit(isCanSplitByCode(data.getCode()));
230 230 Wrapper<PurchaseOrderInfo> orderInfoWrapper = Wrappers.lambdaQuery(PurchaseOrderInfo.class)
231 231 .eq(PurchaseOrderInfo::getContractId, data.getId());
232 232 List<PurchaseOrderInfo> purchaseOrderInfoList = purchaseOrderInfoService.list(orderInfoWrapper);
... ... @@ -259,6 +259,13 @@ public class ContractDistributorStandardServiceImpl extends
259 259 return data;
260 260 }
261 261
  262 + private boolean isCanSplitByCode(String code) {
  263 + if (StringUtils.isBlank(code)) {
  264 + return false;
  265 + }
  266 + return !code.matches(".*_\\d{2}$");
  267 + }
  268 +
262 269 @OpLog(type = OtherOpLogType.class, name = "新增合同,ID:{}", params = {"#id"})
263 270 @Transactional(rollbackFor = Exception.class)
264 271 @Override
... ... @@ -726,6 +733,119 @@ public class ContractDistributorStandardServiceImpl extends
726 733 }
727 734 }
728 735
  736 + @Override
  737 + @OpLog(type = OtherOpLogType.class, name = "合同拆分,ID:{}", params = {"#vo.id"})
  738 + @Transactional(rollbackFor = Exception.class)
  739 + public void splitInventoryContract(UpdateContractDistributorStandardVo vo) {
  740 + if (vo == null || StringUtils.isBlank(vo.getId())) {
  741 + throw new DefaultClientException("参数错误!");
  742 + }
  743 +
  744 + List<UpdateContractDistributorLineVo> lineVoList = vo.getContractDistributorLineList();
  745 + if (CollectionUtils.isEmpty(lineVoList)) {
  746 + return;
  747 + }
  748 +
  749 + BigDecimal splitTotalQuantity = BigDecimal.ZERO;
  750 + List<UpdateContractDistributorLineVo> splitLineVoList = new ArrayList<>();
  751 + for (UpdateContractDistributorLineVo lineVo : lineVoList) {
  752 + if (lineVo == null) {
  753 + continue;
  754 + }
  755 + BigDecimal currentQuantity = lineVo.getCurrentQuantity();
  756 + if (currentQuantity != null && currentQuantity.compareTo(BigDecimal.ZERO) > 0) {
  757 + splitLineVoList.add(lineVo);
  758 + splitTotalQuantity = splitTotalQuantity.add(currentQuantity);
  759 + }
  760 + }
  761 + if (splitLineVoList.isEmpty() || splitTotalQuantity.compareTo(BigDecimal.ZERO) <= 0) {
  762 + return;
  763 + }
  764 +
  765 + ContractDistributorStandard original = getBaseMapper().selectById(vo.getId());
  766 + if (ObjectUtil.isNull(original)) {
  767 + throw new DefaultClientException("合同不存在!");
  768 + }
  769 + if (original.getTotalQuantity() == null) {
  770 + throw new DefaultClientException("合同合计数量为空,无法拆分!");
  771 + }
  772 +
  773 + BigDecimal newOriginalTotalQuantity = original.getTotalQuantity().subtract(splitTotalQuantity);
  774 + if (newOriginalTotalQuantity.compareTo(BigDecimal.ZERO) < 0) {
  775 + throw new DefaultClientException("拆分数量不能大于合同合计数量!");
  776 + }
  777 +
  778 + String baseCode = original.getCode();
  779 + if (StringUtils.isBlank(baseCode)) {
  780 + throw new DefaultClientException("合同编号为空,无法拆分!");
  781 + }
  782 + Wrapper<ContractDistributorStandard> splitWrapper = Wrappers.lambdaQuery(ContractDistributorStandard.class)
  783 + .likeRight(ContractDistributorStandard::getCode, baseCode + "_");
  784 + long splitCount = count(splitWrapper);
  785 + String suffix = String.format("%02d", splitCount + 1);
  786 + String newCode = baseCode + "_" + suffix;
  787 +
  788 + ContractDistributorStandard newContract = new ContractDistributorStandard();
  789 + BeanUtil.copyProperties(original, newContract);
  790 + newContract.setId(IdUtil.getUUID());
  791 + newContract.setCode(newCode);
  792 + newContract.setParentId(null);
  793 + newContract.setTotalQuantity(splitTotalQuantity);
  794 + newContract.setCreateTime(LocalDateTime.now());
  795 + newContract.setUpdateTime(LocalDateTime.now());
  796 + getBaseMapper().insert(newContract);
  797 +
  798 + Wrapper<ContractDistributorStandard> updateOriginal = Wrappers.lambdaUpdate(ContractDistributorStandard.class)
  799 + .set(ContractDistributorStandard::getTotalQuantity, newOriginalTotalQuantity)
  800 + .eq(ContractDistributorStandard::getId, original.getId());
  801 + getBaseMapper().update(updateOriginal);
  802 +
  803 + Wrapper<ContractDistributorLine> lineWrapper = Wrappers.lambdaQuery(ContractDistributorLine.class)
  804 + .eq(ContractDistributorLine::getContractId, original.getId());
  805 + List<ContractDistributorLine> oldLineList = contractDistributorLineService.list(lineWrapper);
  806 + Map<String, ContractDistributorLine> oldLineMap = CollectionUtils.emptyIfNull(oldLineList)
  807 + .stream()
  808 + .filter(Objects::nonNull)
  809 + .filter(l -> StringUtils.isNotBlank(l.getId()))
  810 + .collect(Collectors.toMap(ContractDistributorLine::getId, Function.identity(), (a, b) -> a));
  811 +
  812 + for (UpdateContractDistributorLineVo splitLineVo : splitLineVoList) {
  813 + if (StringUtils.isBlank(splitLineVo.getId())) {
  814 + throw new DefaultClientException("合同行数据不存在!");
  815 + }
  816 + ContractDistributorLine oldLine = oldLineMap.get(splitLineVo.getId());
  817 + if (oldLine == null) {
  818 + throw new DefaultClientException("合同行数据不存在!");
  819 + }
  820 + if (oldLine.getQuantity() == null) {
  821 + throw new DefaultClientException("原产品数量为空,无法拆分!");
  822 + }
  823 + if (oldLine.getQuantity().compareTo(splitLineVo.getCurrentQuantity()) < 0) {
  824 + throw new DefaultClientException("拆分数量不能大于原产品数量!");
  825 + }
  826 +
  827 + ContractDistributorLine newLine = new ContractDistributorLine();
  828 + BeanUtil.copyProperties(oldLine, newLine);
  829 + newLine.setId(IdUtil.getUUID());
  830 + newLine.setContractId(newContract.getId());
  831 + newLine.setQuantity(splitLineVo.getCurrentQuantity());
  832 + newLine.setCreateTime(LocalDateTime.now());
  833 + newLine.setUpdateTime(LocalDateTime.now());
  834 + contractDistributorLineService.getBaseMapper().insert(newLine);
  835 +
  836 + BigDecimal remainingQuantity = oldLine.getQuantity().subtract(splitLineVo.getCurrentQuantity());
  837 + Wrapper<ContractDistributorLine> updateOldLineWrapper = Wrappers.lambdaUpdate(ContractDistributorLine.class)
  838 + .set(ContractDistributorLine::getQuantity, remainingQuantity)
  839 + .set(ContractDistributorLine::getUpdateTime, LocalDateTime.now())
  840 + .eq(ContractDistributorLine::getId, oldLine.getId());
  841 + contractDistributorLineService.update(updateOldLineWrapper);
  842 + contractDistributorLineService.cleanCacheByKey(oldLine.getId());
  843 + }
  844 +
  845 + cleanCacheByKey(original.getId());
  846 + cleanCacheByKey(newContract.getId());
  847 + }
  848 +
729 849 /**
730 850 * 创建订货单
731 851 *
... ...
... ... @@ -6,7 +6,6 @@ import com.lframework.starter.web.core.components.resp.PageResult;
6 6 import com.lframework.xingyun.sc.vo.contract.createVo.CreateContractDistributorStandardVo;
7 7 import com.lframework.xingyun.sc.vo.contract.queryVo.QueryContractDistributorStandardVo;
8 8 import com.lframework.xingyun.sc.vo.contract.updateVo.UpdateContractDistributorStandardVo;
9   -import org.apache.ibatis.annotations.Param;
10 9
11 10 import java.util.List;
12 11
... ... @@ -135,4 +134,9 @@ public interface ContractDistributorStandardService extends BaseMpService<Contra
135 134 * 创建订货单
136 135 */
137 136 void createPurchaseOrderInfo(ContractDistributorStandard contractDistributorStandard, String type);
  137 +
  138 + /**
  139 + * 拆分(经销库存合同、外贸库存合同)
  140 + */
  141 + void splitInventoryContract(UpdateContractDistributorStandardVo vo);
138 142 }
... ...
... ... @@ -95,6 +95,11 @@ public class UpdateContractDistributorLineVo implements BaseVo, Serializable {
95 95 @IsNumberPrecision(message = "数量最多允许4位小数!", value = 4)
96 96 private BigDecimal quantity;
97 97
  98 + @ApiModelProperty(value = "拆分数量")
  99 + @TypeMismatch(message = "拆分数量格式有误!")
  100 + @IsNumberPrecision(message = "拆分数量最多允许4位小数!", value = 4)
  101 + private BigDecimal currentQuantity;
  102 +
98 103 /**
99 104 * 加工费
100 105 */
... ...