|
@@ -0,0 +1,136 @@
|
|
|
+package com.fjhx.sale.flow;
|
|
|
+
|
|
|
+import cn.hutool.core.util.ObjectUtil;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.fjhx.account.entity.account.enums.PaymentStatusEnum;
|
|
|
+import com.fjhx.account.entity.account.po.AccountPayment;
|
|
|
+import com.fjhx.account.service.account.AccountPaymentService;
|
|
|
+import com.fjhx.common.enums.CodingRuleEnum;
|
|
|
+import com.fjhx.common.enums.FlowStatusEnum1;
|
|
|
+import com.fjhx.common.service.coding.CodingRuleService;
|
|
|
+import com.fjhx.common.utils.Assert;
|
|
|
+import com.fjhx.flow.core.FlowDelegate;
|
|
|
+import com.fjhx.sale.entity.after.dto.AfterSalesDto;
|
|
|
+import com.fjhx.sale.entity.after.po.AfterSales;
|
|
|
+import com.fjhx.sale.entity.contract.po.Contract;
|
|
|
+import com.fjhx.sale.entity.contract.po.ContractProduct;
|
|
|
+import com.fjhx.sale.service.after.AfterSalesService;
|
|
|
+import com.fjhx.sale.service.contract.ContractProductService;
|
|
|
+import com.fjhx.sale.service.contract.ContractService;
|
|
|
+import com.ruoyi.common.core.domain.entity.SysUser;
|
|
|
+import com.ruoyi.common.utils.SecurityUtils;
|
|
|
+import com.ruoyi.system.service.ISysUserService;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Component;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.util.Date;
|
|
|
+
|
|
|
+@Component
|
|
|
+public class AfterSalesFlow extends FlowDelegate {
|
|
|
+
|
|
|
+ private final AfterSalesService afterSalesService;
|
|
|
+ private final CodingRuleService codingRuleService;
|
|
|
+ private final ContractProductService contractProductService;
|
|
|
+ private final ISysUserService userService;
|
|
|
+ private final AccountPaymentService accountPaymentService;
|
|
|
+ private final ContractService contractService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ public AfterSalesFlow(AfterSalesService afterSalesService, CodingRuleService codingRuleService, ContractProductService contractProductService, ISysUserService userService, AccountPaymentService accountPaymentService, ContractService contractService) {
|
|
|
+ this.afterSalesService = afterSalesService;
|
|
|
+ this.codingRuleService = codingRuleService;
|
|
|
+ this.contractProductService = contractProductService;
|
|
|
+ this.userService = userService;
|
|
|
+ this.accountPaymentService = accountPaymentService;
|
|
|
+ this.contractService = contractService;
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public String getFlowKey() {
|
|
|
+ return "after_sales_flow";
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public Long start(Long flowId, JSONObject submitData) {
|
|
|
+ AfterSalesDto afterSalesDto = submitData.toJavaObject(AfterSalesDto.class);
|
|
|
+
|
|
|
+ afterSalesDto.setFlowId(flowId);
|
|
|
+
|
|
|
+ Long contractProductId = afterSalesDto.getContractProductId();
|
|
|
+ ContractProduct contractProduct = contractProductService.getById(contractProductId);
|
|
|
+ Assert.notEmpty(contractProduct, "查询不到订单产品信息!");
|
|
|
+
|
|
|
+ afterSalesDto.setCode(codingRuleService.createCode(CodingRuleEnum.AFTER_SALES.getKey(), null));
|
|
|
+
|
|
|
+ //赋值信息
|
|
|
+ afterSalesDto.setContractId(contractProduct.getContractId());
|
|
|
+ afterSalesDto.setProductId(contractProduct.getProductId());
|
|
|
+
|
|
|
+ afterSalesDto.setCompanyId(SecurityUtils.getCompanyId());
|
|
|
+
|
|
|
+ afterSalesService.save(afterSalesDto);
|
|
|
+
|
|
|
+ //回填数据
|
|
|
+ submitData.put("code", afterSalesDto.getCode());
|
|
|
+
|
|
|
+ return afterSalesDto.getId();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void end(Long flowId, Long businessId, JSONObject submitData) {
|
|
|
+ AfterSales afterSales = afterSalesService.getById(businessId);
|
|
|
+ afterSales.setStatus(FlowStatusEnum1.PASS.getKey());
|
|
|
+ afterSalesService.updateById(afterSales);
|
|
|
+
|
|
|
+
|
|
|
+ Long contractProductId = afterSales.getContractProductId();
|
|
|
+ ContractProduct contractProduct = contractProductService.getById(contractProductId);
|
|
|
+ Assert.notEmpty(contractProduct, "查询不到合同产品明细信息!");
|
|
|
+
|
|
|
+ //计算售后价格
|
|
|
+ BigDecimal multiply = contractProduct.getPrice().multiply(afterSales.getQuantity());
|
|
|
+
|
|
|
+ //如果售后类型=仅退款30/退货退款40。审批通过后生成打款数据
|
|
|
+ if (ObjectUtil.equals(afterSales, 30) || ObjectUtil.equals(afterSales, 40)) {
|
|
|
+ // 添加一条付款流水
|
|
|
+ AccountPayment accountPayment = new AccountPayment();
|
|
|
+
|
|
|
+ SysUser sysUser = userService.getById(afterSales.getUserId());
|
|
|
+ if (ObjectUtil.isNotEmpty(sysUser)) {
|
|
|
+ accountPayment.setDepartmentId(sysUser.getDeptId());
|
|
|
+ }
|
|
|
+
|
|
|
+ accountPayment.setBusinessId(afterSales.getId());
|
|
|
+ accountPayment.setPaymentTime(new Date());
|
|
|
+ accountPayment.setCurrency("CNY");
|
|
|
+ accountPayment.setStatus(PaymentStatusEnum.UNDER_REVIEW.getKey());
|
|
|
+ accountPayment.setType(40);//售后
|
|
|
+ accountPayment.setPaymentRemark(afterSales.getRemark());
|
|
|
+ accountPayment.setIncomeAmount(multiply);
|
|
|
+ accountPayment.setName(afterSales.getAccountName());
|
|
|
+ accountPayment.setOpeningBank(afterSales.getOpeningBank());
|
|
|
+ accountPayment.setAccountOpening(afterSales.getAccountOpening());
|
|
|
+ accountPayment.setDataUser(afterSales.getUserId());
|
|
|
+ accountPayment.setAmount(BigDecimal.ZERO);
|
|
|
+ accountPayment.setCompanyId(afterSales.getCompanyId());
|
|
|
+
|
|
|
+ accountPaymentService.save(accountPayment);
|
|
|
+ }
|
|
|
+ //如果售后类型=补发10/换货20。审批通过后,生成一条销售订单,与原销售订单信息基本一致:商品清单只有这一条,数量=售后数量,价格=0。默认审批通过
|
|
|
+ if (ObjectUtil.equals(afterSales, 30) || ObjectUtil.equals(afterSales, 40)) {
|
|
|
+ Contract contract = contractService.getById(contractProduct.getContractId());
|
|
|
+ Assert.notEmpty(contract, "查询不到合同信息!");
|
|
|
+ contract.setId(null);
|
|
|
+ contract.setAmount(BigDecimal.ZERO);
|
|
|
+ contractService.save(contract);
|
|
|
+
|
|
|
+ ContractProduct contractProduct1 = contractProductService.getById(contractProductId);
|
|
|
+ contractProduct1.setId(null);
|
|
|
+ contractProduct1.setContractId(contract.getId());
|
|
|
+ contractProduct1.setPrice(BigDecimal.ZERO);
|
|
|
+ contractProduct1.setQuantity(afterSales.getQuantity());
|
|
|
+ contractProductService.save(contractProduct1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|