|
@@ -0,0 +1,195 @@
|
|
|
+package com.fjhx.service.purchase.impl;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.IdWorker;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import com.fjhx.base.BaseEntity;
|
|
|
+import com.fjhx.base.BaseIdEntity;
|
|
|
+import com.fjhx.base.Condition;
|
|
|
+import com.fjhx.entity.Material;
|
|
|
+import com.fjhx.entity.purchase.Purchase;
|
|
|
+import com.fjhx.entity.purchase.PurchaseDetail;
|
|
|
+import com.fjhx.entity.subscription.Subscription;
|
|
|
+import com.fjhx.entity.subscription.SubscriptionDetail;
|
|
|
+import com.fjhx.mapper.purchase.PurchaseMapper;
|
|
|
+import com.fjhx.params.purchase.PurchaseVo;
|
|
|
+import com.fjhx.params.subscription.SubscriptionDetailEx;
|
|
|
+import com.fjhx.service.MaterialService;
|
|
|
+import com.fjhx.service.purchase.PurchaseDetailService;
|
|
|
+import com.fjhx.service.purchase.PurchaseService;
|
|
|
+import com.fjhx.service.subscription.SubscriptionDetailService;
|
|
|
+import com.fjhx.service.subscription.SubscriptionService;
|
|
|
+import com.fjhx.util.CodeEnum;
|
|
|
+import com.fjhx.utils.PageUtil;
|
|
|
+import com.fjhx.utils.UserClientUtil;
|
|
|
+import org.springblade.core.log.exception.ServiceException;
|
|
|
+import org.springblade.core.tool.utils.ObjectUtil;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+import java.util.Objects;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+
|
|
|
+/**
|
|
|
+ * <p>
|
|
|
+ * 采购 服务实现类
|
|
|
+ * </p>
|
|
|
+ *
|
|
|
+ * @author ${author}
|
|
|
+ * @since 2023-02-24
|
|
|
+ */
|
|
|
+@Service
|
|
|
+public class PurchaseServiceImpl extends ServiceImpl<PurchaseMapper, Purchase> implements PurchaseService {
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private MaterialService materialService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private PurchaseDetailService purchaseDetailService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private SubscriptionService subscriptionService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private SubscriptionDetailService subscriptionDetailService;
|
|
|
+
|
|
|
+ // @Override
|
|
|
+ // public Page<Purchase> getPage(Map<String, Object> condition) {
|
|
|
+ //
|
|
|
+ // IWrapper<Purchase> wrapper = IWrapper.getWrapper(condition);
|
|
|
+ //
|
|
|
+ // return page(condition, wrapper);
|
|
|
+ // }
|
|
|
+ //
|
|
|
+ // @Override
|
|
|
+ // public void add(PurchaseVo purchaseVo) {
|
|
|
+ // save(purchaseVo);
|
|
|
+ // }
|
|
|
+ //
|
|
|
+ // @Override
|
|
|
+ // public void edit(PurchaseVo purchaseVo) {
|
|
|
+ // updateById(purchaseVo);
|
|
|
+ // }
|
|
|
+ //
|
|
|
+ // @Override
|
|
|
+ // public void delete(PurchaseVo purchaseVo) {
|
|
|
+ // removeById(purchaseVo.getId());
|
|
|
+ // }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Page<SubscriptionDetailEx> toBePurchasedPage(Condition condition) {
|
|
|
+
|
|
|
+ LambdaQueryWrapper<SubscriptionDetail> wrapper = Wrappers.lambdaQuery();
|
|
|
+ wrapper.isNull(SubscriptionDetail::getPurchaseId);
|
|
|
+ wrapper.isNull(SubscriptionDetail::getPurchaseDetailId);
|
|
|
+ String keyword = condition.getKeyword();
|
|
|
+ if (ObjectUtil.isNotEmpty(keyword)) {
|
|
|
+ List<Long> materialIdList = materialService.listObj(BaseIdEntity::getId, q -> q.like(Material::getName, keyword));
|
|
|
+ if (materialIdList.size() == 0) {
|
|
|
+ return new Page<>();
|
|
|
+ }
|
|
|
+ wrapper.in(SubscriptionDetail::getMaterialId, materialIdList);
|
|
|
+ }
|
|
|
+
|
|
|
+ Page<SubscriptionDetail> itemPage = subscriptionDetailService.page(condition.getPage(), wrapper);
|
|
|
+ Page<SubscriptionDetailEx> page = PageUtil.copyPage(itemPage, SubscriptionDetailEx.class);
|
|
|
+ List<SubscriptionDetailEx> records = page.getRecords();
|
|
|
+ if (records.size() == 0) {
|
|
|
+ return page;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 赋值物料属性
|
|
|
+ materialService.attributeAssign(records, SubscriptionDetail::getMaterialId, (item, material) -> {
|
|
|
+ item.setMaterialName(material.getName());
|
|
|
+ item.setMaterialUnit(material.getUnit());
|
|
|
+ });
|
|
|
+
|
|
|
+ // 赋值申购人名称
|
|
|
+ Map<Long, String> userNameMap = UserClientUtil.getUserNameMap(records, BaseEntity::getCreateUser);
|
|
|
+ records.forEach(item -> item.setUserName(userNameMap.get(item.getCreateUser())));
|
|
|
+
|
|
|
+ return page;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @Override
|
|
|
+ public void submit(PurchaseVo purchaseVo) {
|
|
|
+ // 采购id
|
|
|
+ long purchaseId = IdWorker.getId();
|
|
|
+ List<PurchaseDetail> purchaseDetailList = purchaseVo.getPurchaseDetailList();
|
|
|
+
|
|
|
+ // 申购明细id
|
|
|
+ List<Long> subscriptionDetailIdList = purchaseDetailList.stream().map(PurchaseDetail::getSubscriptionDetailId).collect(Collectors.toList());
|
|
|
+
|
|
|
+ // 申购明细list
|
|
|
+ List<SubscriptionDetail> subscriptionDetailList = subscriptionDetailService.list(q -> q.in(BaseIdEntity::getId, subscriptionDetailIdList));
|
|
|
+ // 申购明细map
|
|
|
+ Map<Long, SubscriptionDetail> subscriptionDetailMap = subscriptionDetailList.stream().collect(Collectors.toMap(BaseIdEntity::getId, item -> item));
|
|
|
+
|
|
|
+ synchronized (this) {
|
|
|
+ String code = CodeEnum.SUBSCRIPTION.getCode();
|
|
|
+ BigDecimal purchaseTotalAmount = BigDecimal.ZERO;
|
|
|
+
|
|
|
+ for (PurchaseDetail purchaseDetail : purchaseDetailList) {
|
|
|
+ Long subscriptionDetailId = purchaseDetail.getSubscriptionDetailId();
|
|
|
+ SubscriptionDetail subscriptionDetail = subscriptionDetailMap.get(subscriptionDetailId);
|
|
|
+ if (subscriptionDetail == null) {
|
|
|
+ throw new ServiceException("未知申购明细,id:" + subscriptionDetailId);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 小计
|
|
|
+ BigDecimal totalAmount = purchaseDetail.getAmount().multiply(purchaseDetail.getQuantity());
|
|
|
+
|
|
|
+ // 赋值采购明细冗余字段
|
|
|
+ purchaseDetail.setId(IdWorker.getId());
|
|
|
+ purchaseDetail.setPurchaseId(purchaseId);
|
|
|
+ purchaseDetail.setPurchaseCode(code);
|
|
|
+ purchaseDetail.setMaterialId(subscriptionDetail.getMaterialId());
|
|
|
+ purchaseDetail.setQuantity(subscriptionDetail.getQuantity());
|
|
|
+ purchaseDetail.setTotalAmount(totalAmount);
|
|
|
+
|
|
|
+ // 统计采购总价
|
|
|
+ purchaseTotalAmount = purchaseTotalAmount.add(totalAmount);
|
|
|
+
|
|
|
+ subscriptionDetail.setPurchaseId(purchaseId);
|
|
|
+ subscriptionDetail.setPurchaseDetailId(purchaseDetail.getId());
|
|
|
+ }
|
|
|
+
|
|
|
+ purchaseVo.setCode(code);
|
|
|
+ purchaseVo.setStatus(1);
|
|
|
+ purchaseVo.setTotalAmount(purchaseTotalAmount);
|
|
|
+ // 保存采购
|
|
|
+ save(purchaseVo);
|
|
|
+ }
|
|
|
+ // 保存采购明细
|
|
|
+ purchaseDetailService.saveBatch(purchaseDetailList);
|
|
|
+ // 申购单赋值采购id和采购明细id
|
|
|
+ subscriptionDetailService.updateBatchById(subscriptionDetailList);
|
|
|
+
|
|
|
+ // 修改申购单状态
|
|
|
+ List<Long> subscriptionIdList = subscriptionDetailList.stream().map(SubscriptionDetail::getSubscriptionId).distinct().collect(Collectors.toList());
|
|
|
+ Map<Long, List<SubscriptionDetail>> kGroup = subscriptionDetailService.getKGroup(SubscriptionDetail::getSubscriptionId, q -> q.in(SubscriptionDetail::getSubscriptionId, subscriptionIdList));
|
|
|
+ List<Subscription> subscriptionList = new ArrayList<>();
|
|
|
+ kGroup.forEach((k, v) -> {
|
|
|
+ // 统计申购单中未采购的数量
|
|
|
+ long count = v.stream().map(SubscriptionDetail::getPurchaseId).filter(Objects::isNull).count();
|
|
|
+
|
|
|
+ // 未采购数量大于0,采购中,否则已完成
|
|
|
+ Subscription subscription = new Subscription();
|
|
|
+ subscription.setId(k);
|
|
|
+ subscription.setStatus(count > 0 ? 2 : 3);
|
|
|
+ subscriptionList.add(subscription);
|
|
|
+ });
|
|
|
+
|
|
|
+ // 修改申购状态
|
|
|
+ subscriptionService.updateBatchById(subscriptionList);
|
|
|
+ }
|
|
|
+
|
|
|
+}
|