//package com.fjhx.sale.flow;
//
//import com.alibaba.fastjson.JSONObject;
//import com.baomidou.dynamic.datasource.annotation.DSTransactional;
//import com.fjhx.common.service.coding.CodingRuleService;
//import com.fjhx.flow.core.FlowDelegate;
//import com.fjhx.flow.enums.FlowStatusEnum;
//import com.fjhx.purchase.service.purchase.PurchaseDetailService;
//import com.fjhx.purchase.service.purchase.PurchaseOtherFeeService;
//import com.fjhx.purchase.service.purchase.PurchaseService;
//import com.fjhx.purchase.service.subscribe.SubscribeDetailService;
//import com.fjhx.sale.service.contract.ContractProductService;
//import com.fjhx.sale.service.sample.SampleProductService;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Component;
//
///**
// * EHSD采购流程
// *
// * @Author:caozj
// * @DATE:2023/4/3 17:38
// */
//@Component
//public class PurchaseFlow extends FlowDelegate {
//
//    @Autowired
//    private PurchaseService purchaseService;
//
//    @Autowired
//    private SampleProductService sampleProductService;
//
//    @Autowired
//    private PurchaseDetailService purchaseDetailService;
//
//    @Autowired
//    private ContractProductService contractProductService;
//
//    @Autowired
//    private CodingRuleService codingRuleService;
//
//    @Autowired
//    private PurchaseOtherFeeService purchaseOtherFeeService;
//    @Autowired
//    private SubscribeDetailService subscribeDetailService;
//    @Autowired
//    private EhsdPurchaseFlow ehsdPurchaseFlow;
//
//    @Override
//    public String getFlowKey() {
//        return "purchase_flow";
//    }
//
//    /**
//     * 发起流程
//     *
//     * @param flowId     流程ID
//     * @param submitData 采购数据
//     * @return
//     */
//    @Override
//    public Long start(Long flowId, JSONObject submitData) {
////        DynamicDataSourceContextHolder.push(SourceConstant.PURCHASE);
////        PurchaseVo purchase = submitData.toJavaObject(PurchaseVo.class);
//////        purchase.setCode(CodeEnum.PURCHASE.getCode());
////        purchase.setCode(codingRuleService.createCode(CodingRuleEnum.PURCHASE.getKey(), null));
////        purchase.setPurchaseStatus(PurchaseStatusEnum.UNDER_REVIEW.getKey());
////        purchase.setFlowId(flowId);
////        purchaseService.save(purchase);
////        List<PurchaseDetail> purchaseDetailList = purchase.getPurchaseDetailList();
////        if (CollectionUtils.isNotEmpty(purchaseDetailList)) {
////            for (PurchaseDetail s : purchaseDetailList) {
////                s.setPurchaseId(purchase.getId());
////            }
////            purchaseDetailService.saveBatch(purchaseDetailList);
////            //修改申购明细的采购状态
////            for (PurchaseDetail purchaseDetail : purchaseDetailList) {
////                //如果来源是申购
////                if (ObjectUtils.isEmpty(purchaseDetail.getDataResource())) {
////                    //计算已经采购的数量
////                    List<PurchaseDetail> purchaseDetails = purchaseDetailService.list(q -> q
////                            .eq(PurchaseDetail::getSubscribeDetailId, purchaseDetail.getSubscribeDetailId())
////                    );
////                    BigDecimal pdCount = purchaseDetails.stream().map(PurchaseDetail::getCount).reduce(BigDecimal.ZERO, BigDecimal::add);
////                    SubscribeDetail subscribeDetail = subscribeDetailService.getById(purchaseDetail.getSubscribeDetailId());
////                    if (pdCount.compareTo(subscribeDetail.getCount()) >= 0) {
////                        //修改为已采购
////                        subscribeDetail.setStatus(SubscribeDetailStatusEnum.PURCHASED.getKey());
////                    } else {
////                        //修改为部分采购
////                        subscribeDetail.setStatus(SubscribeDetailStatusEnum.LITT_PAID_AMOUNT.getKey());
////                    }
////                    subscribeDetailService.updateById(subscribeDetail);
////                }
////            }
////
////        }
////        //保存其他费用信息
////        List<PurchaseOtherFee> otherFeeList = purchase.getOtherFeeList();
////        if (ObjectUtils.isNotEmpty(otherFeeList)) {
////            otherFeeList.forEach(item -> item.setPurchaseId(purchase.getId()));
////            purchaseOtherFeeService.saveBatch(otherFeeList);
////        }
////        DynamicDataSourceContextHolder.poll();
////        return purchase.getId();
//        return ehsdPurchaseFlow.start(flowId, submitData);
//    }
//
//    /**
//     * 结束流程
//     *
//     * @param flowId     流程ID
//     * @param businessId 业务ID
//     * @param submitData 数据
//     */
//    @Override
//    @DSTransactional
//    public void end(Long flowId, Long businessId, JSONObject submitData) {
////        //通过业务ID查询采购数据
////        Purchase purchase = purchaseService.getById(businessId);
////        if (ObjectUtils.isEmpty(purchase)) {
////            throw new ServiceException("采购单不存在");
////        }
////        //查询采购产品
////        List<PurchaseDetail> purchaseDetailList = purchaseDetailService.list(Wrappers.<PurchaseDetail>query().lambda().eq(PurchaseDetail::getPurchaseId, businessId));
////        List<ContractProduct> upContractProduct = new ArrayList<>();
////        List<SampleProduct> upSampleProduct = new ArrayList<>();
////        for (PurchaseDetail p : purchaseDetailList) {
////            if (ObjectUtils.isNotEmpty(p.getDataResourceId()) &&
////                    p.getDataResource() == PurchaseDataResourceEnum.DATA_RESOURCE_1.getKey()) {//如果采购的是外销合同
////                ContractProduct contractProduct = contractProductService.getById(p.getDataResourceId());
////                BigDecimal expendQuantity = contractProduct.getExpendQuantity().subtract(p.getCount());
////                if (expendQuantity.compareTo(BigDecimal.ZERO) < 0) {
////                    //外销合同-交接单采购 如果采购数量大于大于合同数量 将待处理数量改为0
////                    expendQuantity = BigDecimal.ZERO;
////                }
////                contractProduct.setExpendQuantity(expendQuantity);
////                upContractProduct.add(contractProduct);
////            }
////            if (ObjectUtils.isNotEmpty(p.getDataResourceId()) &&
////                    p.getDataResource() == PurchaseDataResourceEnum.DATA_RESOURCE_2.getKey()) {//如果采购的是样品单
////                SampleProduct sampleProduct = sampleProductService.getById(p.getDataResourceId());
////                BigDecimal expendQuantity = sampleProduct.getExpendQuantity().subtract(p.getCount());
////                if (expendQuantity.compareTo(BigDecimal.ZERO) < 1) {//小于0不让继续执行
//////                    throw new ServiceException("采购数量不得大于合同剩余采购数量");
////                    expendQuantity = BigDecimal.ZERO;
////                }
////                sampleProduct.setExpendQuantity(expendQuantity);
////                upSampleProduct.add(sampleProduct);
////            }
////        }
////        if (CollectionUtils.isNotEmpty(upContractProduct)) {//扣减销售合同数量
////            contractProductService.updateBatchById(upContractProduct);
////        }
////        if (CollectionUtils.isNotEmpty(upSampleProduct)) {//扣减样品单数量
////            sampleProductService.updateBatchById(upSampleProduct);
////        }
////        //修改采购状态为审批通过
////        purchase.setPurchaseStatus(PurchaseStatusEnum.PASS.getKey());
////        purchase.setApprovedDate(new Date());
////        purchaseService.updateById(purchase);
////        //修改采购明细为待采购
////        PurchaseDetail detail = new PurchaseDetail();
////        detail.setStatus(PurchaseDetailStatusEnum.PASS.getKey());
////        purchaseDetailService.update(detail, Wrappers.<PurchaseDetail>query()
////                .lambda().eq(PurchaseDetail::getPurchaseId, purchase.getId()));
//        ehsdPurchaseFlow.end(flowId, businessId, submitData);
//    }
//
////    /**
////     * 驳回方法
////     */
////    public void reject() {
////        if (HandleTypeEnum.REJECT.equals(FlowThreadLocalUtil.getHandleTypeEnum())) {
////            purchaseService.update(q -> q
////                    .eq(Purchase::getId, FlowThreadLocalUtil.getBusinessId())
////                    .set(Purchase::getPurchaseStatus, 20)
////                    .set(Purchase::getUpdateTime, new Date())
////                    .set(BasePo::getUpdateUser, SecurityUtils.getUserId())
////            );
////        }
////    }
//
//
//    @Override
//    public void relaunch(Long flowId, Long businessId, FlowStatusEnum flowStatus, JSONObject submitData) {
//        super.relaunch(flowId, businessId, flowStatus, submitData);
//        ehsdPurchaseFlow.relaunch(flowId, businessId, flowStatus, submitData);
//    }
//
//    @Override
//    public void reject(Long flowId, Long businessId, FlowStatusEnum flowStatus) {
//        super.reject(flowId, businessId, flowStatus);
//        ehsdPurchaseFlow.reject(flowId, businessId, flowStatus);
//    }
//
//    @Override
//    public void cancellation(Long flowId, Long businessId, FlowStatusEnum flowStatus) {
//        super.cancellation(flowId, businessId, flowStatus);
//        ehsdPurchaseFlow.cancellation(flowId, businessId, flowStatus);
//    }
//}
