Browse Source

1.资产业务产品退回流程开发
2.调整退款记录新增逻辑,避免重复新增
3.修改罚款金额的判断逻辑

GouGengquan 3 months ago
parent
commit
d7e56709c7

+ 3 - 3
biz-base/src/main/java/com/dayou/controller/ProductionReturnController.java

@@ -67,7 +67,7 @@ public class ProductionReturnController extends BaseController {
     /**
      * 产品退回申请表详情
      */
-    @GetMapping("/{id}")
+    @GetMapping("detail/{id}")
     public RestResponse<ProductionReturn> detail(@PathVariable Long id){
         ProductionReturn xProductionReturn =productionReturnService.detail(id);
         return RestResponse.data(xProductionReturn);
@@ -77,8 +77,8 @@ public class ProductionReturnController extends BaseController {
      * 产品退回申请表新增
      */
     @PostMapping("/save")
-    public RestResponse<WorkNodeCommit> save(@RequestBody ProductionReturn productionReturn) {
-        WorkNodeCommit ret = productionReturnService.add(productionReturn);
+    public RestResponse<Boolean> save(@RequestBody ProductionReturn productionReturn) {
+        Boolean ret = productionReturnService.add(productionReturn);
         return RestResponse.data(ret);
     }
 

+ 7 - 0
dao/src/main/java/com/dayou/mapper/ProductionReturnMapper.java

@@ -20,6 +20,13 @@ import java.util.List;
 public interface ProductionReturnMapper extends CustomBaseMapper<ProductionReturn> {
 
     /**
+     * 根据条件查询审核中或已通过的退回流程数量
+     * @param productionReturn 退回信息
+     * @return Integer
+     */
+    Integer count(@Param("return") ProductionReturn productionReturn);
+
+    /**
      * 分页查询产品申请
      * @param page 分页
      * @param dto 查询条件

+ 21 - 1
dao/src/main/resources/mapper/ProductionReturnMapper.xml

@@ -32,9 +32,23 @@
         business_type, business_id, production_id, clinet_manager_id, name, order_id, production_no, production_type, client_name, client_sub_name, bailor, return_reason, status
     </sql>
 
+    <!--根据条件查询审核中或已通过的退回流程数量-->
+    <select id="count" resultType="java.lang.Integer">
+        SELECT COUNT(id)
+        FROM production_return
+        WHERE deleted = 0
+        AND business_type = #{return.businessType}
+        AND business_id = #{return.businessId}
+        AND order_id = #{return.orderId}
+        <if test="return.productionNo != null">
+            AND production_no = #{return.productionNo}
+        </if>
+        AND (status = 'REVIEWING' OR status = 'APPROVE')
+    </select>
+
     <sql id="productionReturnVOSql">
         SELECT production_return.id AS id,
-               business_type AS businessType,
+               production_return.business_type AS businessType,
                production_return.name AS name,
                order_id AS orderId,
                production_no AS productionNo,
@@ -48,6 +62,8 @@
                status
         FROM production_return
         LEFT JOIN user ON user.id = clinet_manager_id
+        LEFT JOIN work_flow_node_instance AS instance ON instance.deleted = 0 AND instance.state = 'PENDING' AND instance.business_type = 'PRODUCTION_RETURN' AND instance.business_id = production_return.id
+        LEFT JOIN work_task_record AS record ON record.deleted = 0 AND record.instance_id = instance.id
         WHERE production_return.deleted = 0
         <if test="dto != null and dto.businessType != null and dto.businessType != ''">
             AND production_return.business_type = #{dto.businessType}
@@ -61,6 +77,10 @@
         <if test="dto != null and dto.bailor != null and dto.bailor != ''">
             AND bailor = #{dto.bailor}
         </if>
+        <if test="dto != null and dto.userId != null">
+            AND record.handler_id = #{dto.userId}
+        </if>
+        ORDER BY production_return.created DESC
     </sql>
 
     <!--分页查询产品申请-->

+ 2 - 2
dao/src/main/resources/mapper/WorkTaskRecordMapper.xml

@@ -567,9 +567,9 @@
         node.code AS nodeCode,
         log.created AS finishTime,
         nodeInfo.business_sub_id AS statementNo,
-        (SELECT assets_name FROM assets_production WHERE assets_production.production_no = instance.business_sub_id) AS
+        (SELECT assets_name FROM assets_production WHERE assets_production.production_no = nodeInfo.business_sub_id) AS
         statementName,
-        (SELECT assets_name FROM assets_production WHERE assets_production.production_no = instance.business_min_id limit 1) AS
+        (SELECT assets_name FROM assets_production WHERE assets_production.production_no = nodeInfo.business_min_id limit 1) AS
         reportName,
         nodeInfo.business_min_id AS reportNo,
         instance.state AS instanceState,

+ 11 - 0
domain/src/main/java/com/dayou/dto/ProductionReturnSelectDTO.java

@@ -6,6 +6,12 @@ import lombok.Data;
 public class ProductionReturnSelectDTO {
 
     /**
+     * 查询范围
+     * ALL: 所有推报告申请 TODO: 当前用户待办
+     */
+    private String queryScope;
+
+    /**
      * 业务类型
      */
     private String businessType;
@@ -25,4 +31,9 @@ public class ProductionReturnSelectDTO {
      */
     private String bailor;
 
+    /**
+     * 申请流程当前节点代办人id
+     */
+    private Long userId;
+
 }

+ 1 - 1
domain/src/main/java/com/dayou/vo/ProductionReturnVO.java

@@ -74,7 +74,7 @@ public class ProductionReturnVO {
     /**
      * 是否包含退发票
      */
-    @Excel(name = "是否包含退发票")
+    @Excel(name = "是否包含退发票", readConverterExp = "true=是,false=否")
     private Boolean returnInvoice;
 
     /**

+ 7 - 0
service/src/main/java/com/dayou/service/IFinanceFineRefundService.java

@@ -41,6 +41,13 @@ public interface IFinanceFineRefundService extends IService<FinanceFineRefund> {
         Boolean add(FinanceFineRefund financeFineRefund);
 
         /**
+         * 新增退款记录,如果不存在
+         * @param financeFineRefund 退款记录
+         * @return Boolean
+         */
+        Boolean saveIfNotExists(FinanceFineRefund financeFineRefund);
+
+        /**
          * 更新罚款记录状态
          * @param financeFineRefund 更新内容
          * @return Boolean

+ 1 - 1
service/src/main/java/com/dayou/service/IProductionReturnService.java

@@ -43,7 +43,7 @@ public interface IProductionReturnService extends IService<ProductionReturn> {
          * @param productionReturn 产品退回信息
          * @return WorkNodeCommit
          */
-        WorkNodeCommit add(ProductionReturn productionReturn);
+        Boolean add(ProductionReturn productionReturn);
 
         Boolean update(ProductionReturn productionReturn);
 

+ 1 - 1
service/src/main/java/com/dayou/service/impl/AssetsProductionServiceImpl.java

@@ -428,7 +428,7 @@ public class AssetsProductionServiceImpl extends ServiceImpl<AssetsProductionMap
                             .refundReason(RETURN_MONEY.getCode())
                             .status(NOT_RETURNED.getCode())
                             .build();
-                    financeFineRefundService.save(financeFineRefund);
+                    financeFineRefundService.saveIfNotExists(financeFineRefund);
                 }
 
                 //插入订单认领记录流水表

+ 17 - 0
service/src/main/java/com/dayou/service/impl/FinanceFineRefundServiceImpl.java

@@ -1,5 +1,6 @@
 package com.dayou.service.impl;
 
+import com.dayou.common.BaseEntity;
 import com.dayou.dto.FinanceFineRefundSelectDTO;
 import com.dayou.entity.FinanceFineRefund;
 import com.dayou.enums.FineRefundStatusEnum;
@@ -79,6 +80,22 @@ public class FinanceFineRefundServiceImpl extends ServiceImpl<FinanceFineRefundM
     }
 
     /**
+     * 新增退款记录,如果不存在
+     * @param financeFineRefund 退款记录
+     * @return Boolean
+     */
+    @Override
+    public Boolean saveIfNotExists(FinanceFineRefund financeFineRefund) {
+        // 通过罚款id查询是否已经有存在的罚款后退款记录,避免重复生成退款记录
+        boolean exists = this.count(new LambdaQueryWrapper<FinanceFineRefund>().eq(BaseEntity::getDeleted, false).eq(FinanceFineRefund::getFineId, financeFineRefund.getFineId())) > 0;
+        if (!exists) {
+            // 记录不存在,进行插入操作
+            return this.save(financeFineRefund);
+        }
+        return false;
+    }
+
+    /**
      * 更新罚款记录状态
      * @param financeFineRefund 更新内容
      * @return Boolean

+ 3 - 3
service/src/main/java/com/dayou/service/impl/FinanceFineServiceImpl.java

@@ -114,8 +114,8 @@ public class FinanceFineServiceImpl extends ServiceImpl<FinanceFineMapper, Finan
             BigDecimal fineAmount = financeFineMapper.getInvoiceByFundInfo(assetsOrder.getOrderFundId(), assetsOrder.getProductionFundId());
             // 判断罚款金额是否为null(为null说明没开票,通过其他信息设置罚款金额)
             if (ObjectUtil.isNull(fineAmount)) {
-                // 判断应收款是否不为null且不等于1(乱填)
-                if (ObjectUtil.isNotNull(assetsOrder.getProductionShouldAmount()) && !Objects.equals(assetsOrder.getProductionShouldAmount(), BigDecimal.valueOf(1))) {
+                // 判断应收款是否不为null且于1(乱填)
+                if (ObjectUtil.isNotNull(assetsOrder.getProductionShouldAmount()) && assetsOrder.getProductionShouldAmount().compareTo(BigDecimal.valueOf(1)) > 0) {
                     // 填了应收款,按应收款的5%
                     fineAmount = assetsOrder.getProductionShouldAmount().multiply(BigDecimal.valueOf(0.05));
                 } else {
@@ -161,7 +161,7 @@ public class FinanceFineServiceImpl extends ServiceImpl<FinanceFineMapper, Finan
             // 判断罚款金额是否为null(为null说明没开票,通过其他信息设置罚款金额)
             if (ObjectUtil.isNull(fineAmount)) {
                 // 判断应收款是否不为null且不等于1(乱填)
-                if (ObjectUtil.isNotNull(majorOrder.getProductionShouldAmount()) && !Objects.equals(majorOrder.getProductionShouldAmount(), BigDecimal.valueOf(1))) {
+                if (ObjectUtil.isNotNull(majorOrder.getProductionShouldAmount()) && majorOrder.getProductionShouldAmount().compareTo(BigDecimal.valueOf(1)) > 0) {
                     // 填了应收款,按应收款的5%
                     fineAmount = majorOrder.getProductionShouldAmount().multiply(BigDecimal.valueOf(0.05));
                 } else {

+ 1 - 1
service/src/main/java/com/dayou/service/impl/MajorProductionServiceImpl.java

@@ -417,7 +417,7 @@ public class MajorProductionServiceImpl extends ServiceImpl<MajorProductionMappe
                             .refundReason(RETURN_MONEY.getCode())
                             .status(NOT_RETURNED.getCode())
                             .build();
-                    financeFineRefundService.save(financeFineRefund);
+                    financeFineRefundService.saveIfNotExists(financeFineRefund);
                 }
 
                 //插入订单认领流水表

+ 1 - 1
service/src/main/java/com/dayou/service/impl/PersonalServiceImpl.java

@@ -415,7 +415,7 @@ public class PersonalServiceImpl extends ServiceImpl<PersonalMapper, Personal> i
                             .refundReason(RETURN_MONEY.getCode())
                             .status(NOT_RETURNED.getCode())
                             .build();
-                    financeFineRefundService.save(financeFineRefund);
+                    financeFineRefundService.saveIfNotExists(financeFineRefund);
                 }
 
                 FinanceClaim financeClaim = new FinanceClaim();

+ 125 - 5
service/src/main/java/com/dayou/service/impl/ProductionReturnServiceImpl.java

@@ -1,9 +1,12 @@
 package com.dayou.service.impl;
 
+import com.dayou.common.BaseEntity;
 import com.dayou.dto.ProductionReturnSelectDTO;
 import com.dayou.dto.WorkNodeCommit;
 import com.dayou.entity.ProductionReturn;
 import com.dayou.enums.workflow.NodeLogEnum;
+import com.dayou.exception.BusinessException;
+import com.dayou.exception.ErrorCode;
 import com.dayou.mapper.ProductionReturnMapper;
 import com.dayou.service.IProductionReturnService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -60,7 +63,62 @@ public class ProductionReturnServiceImpl extends ServiceImpl<ProductionReturnMap
      */
     @Override
     public Page<ProductionReturnVO> selectPage(Page page, ProductionReturnSelectDTO dto){
-        return productionReturnMapper.selectPage(page, dto);
+        // 判断是否是查询自己的待办
+        if (dto.getQueryScope().equals("TODO")) {
+            dto.setUserId(LoginContext.getUserId());
+        }
+        Page<ProductionReturnVO> productionReturnVOPage = productionReturnMapper.selectPage(page, dto);
+        List<ProductionReturnVO> records = productionReturnVOPage.getRecords();
+        for (ProductionReturnVO vo : records) {
+            switch (vo.getBusinessType()) {
+                case "ASSET_BUSINESS":
+                    switch (vo.getProductionType()) {
+                        case "LETTER":
+                            vo.setProductionType("意见函");
+                            break;
+                        case "CONSULT":
+                            vo.setProductionType("咨询报告");
+                            break;
+                        case "REPORT":
+                            vo.setProductionType("评估报告");
+                            break;
+                        default:
+                            vo.setProductionType("-");
+                            break;
+                    }
+                    break;
+                case "PERSONAL_BUSINESS":
+                    switch (vo.getProductionType()) {
+                        case "FINAL":
+                            vo.setProductionType("结果报告");
+                            break;
+                        case "TECHNIC":
+                            vo.setProductionType("技术报告");
+                            break;
+                        default:
+                            vo.setProductionType("-");
+                            break;
+                    }
+                    break;
+                case "MAJOR_BUSINESS":
+                    switch (vo.getProductionType()) {
+                        case "LETTER":
+                            vo.setProductionType("复评函");
+                            break;
+                        case "STATEMENT":
+                            vo.setProductionType("价值意见书");
+                            break;
+                        case "REPORT":
+                            vo.setProductionType("报告");
+                            break;
+                        default:
+                            vo.setProductionType("-");
+                            break;
+                    }
+                    break;
+            }
+        }
+        return productionReturnVOPage;
     }
 
     /**
@@ -70,7 +128,61 @@ public class ProductionReturnServiceImpl extends ServiceImpl<ProductionReturnMap
      */
     @Override
     public List<ProductionReturnVO> exportList(ProductionReturnSelectDTO dto) {
-        return productionReturnMapper.exportList(dto);
+        // 判断是否是查询自己的待办
+        if (dto.getQueryScope().equals("TODO")) {
+            dto.setUserId(LoginContext.getUserId());
+        }
+        List<ProductionReturnVO> productionReturnVOList = productionReturnMapper.exportList(dto);
+        for (ProductionReturnVO vo : productionReturnVOList) {
+            switch (vo.getBusinessType()) {
+                case "ASSET_BUSINESS":
+                    switch (vo.getProductionType()) {
+                        case "LETTER":
+                            vo.setProductionType("意见函");
+                            break;
+                        case "CONSULT":
+                            vo.setProductionType("咨询报告");
+                            break;
+                        case "REPORT":
+                            vo.setProductionType("评估报告");
+                            break;
+                        default:
+                            vo.setProductionType("-");
+                            break;
+                    }
+                    break;
+                case "PERSONAL_BUSINESS":
+                    switch (vo.getProductionType()) {
+                        case "FINAL":
+                            vo.setProductionType("结果报告");
+                            break;
+                        case "TECHNIC":
+                            vo.setProductionType("技术报告");
+                            break;
+                        default:
+                            vo.setProductionType("-");
+                            break;
+                    }
+                    break;
+                case "MAJOR_BUSINESS":
+                    switch (vo.getProductionType()) {
+                        case "LETTER":
+                            vo.setProductionType("复评函");
+                            break;
+                        case "STATEMENT":
+                            vo.setProductionType("价值意见书");
+                            break;
+                        case "REPORT":
+                            vo.setProductionType("报告");
+                            break;
+                        default:
+                            vo.setProductionType("-");
+                            break;
+                    }
+                    break;
+            }
+        }
+        return productionReturnVOList;
     }
 
 
@@ -79,15 +191,23 @@ public class ProductionReturnServiceImpl extends ServiceImpl<ProductionReturnMap
         return this.getById(id);
     }
 
+    /**
+     * 发起产品退回流程
+     * @param productionReturn 产品退回信息
+     * @return WorkNodeCommit
+     */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public WorkNodeCommit add(ProductionReturn productionReturn){
-        productionReturn.setBusinessType(ASSET_BUSINESS.getCode());
+    public Boolean add(ProductionReturn productionReturn){
+        Integer count = productionReturnMapper.count(productionReturn);
+        if (count > 0) {
+            ErrorCode.throwBusinessException(ErrorCode.CUSTOM_ERROR, "当前已有审核中或已通过的流程,无需重复提交");
+        }
         productionReturn.setClinetManagerId(LoginContext.getCurrentUserId());
         productionReturn.setStatus(REVIEWING.getCode());
         this.save(productionReturn);
         // 发起退回流程
-        return workFlowService.openingOrder(PRODUCTION_RETURN, productionReturn.getId(), null, null);
+        return workFlowService.openingProductionReturn(PRODUCTION_RETURN, productionReturn.getId());
     }
 
     @Override

+ 8 - 0
service/src/main/java/com/dayou/service/workflow/IWorkFlowService.java

@@ -48,4 +48,12 @@ public interface IWorkFlowService extends IService<WorkFlow> {
 
     Boolean openingDeclare(MainBusinessEnum mainBusinessEnum, Long businessId);
 
+    /**
+     * 发起产品退回流程
+     * @param mainBusinessEnum 业务枚举
+     * @param businessId 业务数据主键id
+     * @return Boolean
+     */
+    Boolean openingProductionReturn(MainBusinessEnum mainBusinessEnum, Long businessId);
+
 }

+ 39 - 0
service/src/main/java/com/dayou/service/workflow/WorkFlowServiceImpl.java

@@ -274,6 +274,45 @@ public class WorkFlowServiceImpl extends ServiceImpl<WorkFlowMapper, WorkFlow> i
         return Boolean.TRUE;
     }
 
+    /**
+     * 发起产品退回流程
+     * @param mainBusinessEnum 业务枚举
+     * @param businessId 业务数据主键id
+     * @return Boolean
+     */
+    @Override
+    public Boolean openingProductionReturn(MainBusinessEnum mainBusinessEnum, Long businessId) {
+        WorkFlow businessFlow = this.getOne(new LambdaQueryWrapper<WorkFlow>()
+                .eq(WorkFlow::getCode, mainBusinessEnum.getCode())
+                .eq(WorkFlow::getState, Boolean.FALSE)
+                .eq(BaseEntity::getDeleted, Boolean.FALSE));
+
+        if (businessFlow == null){
+            ErrorCode.throwBusinessException(ErrorCode.WORKFLOW_NOT_EXISTS,mainBusinessEnum.getMsg());
+        }
+
+        WorkNodeDTO firstNode = workNodeService.getOpeningOrderNode(businessFlow.getId());
+        if (firstNode == null){
+            ErrorCode.throwBusinessException(ErrorCode.OPENING_NODE_NOT_EXISTS,mainBusinessEnum.getMsg());
+        }
+
+        WorkFlowNodeInstance instance = new WorkFlowNodeInstance();
+        instance.setFlowId(businessFlow.getId());
+        instance.setNodeId(firstNode.getId());
+        instance.setBusinessId(businessId);
+        instance.setBusinessType(mainBusinessEnum.getCode());
+        instance.setSequence(0);
+        instance.setState(NodeStateEnum.PENDING.name());
+        workFlowNodeInstanceService.save(instance);
+
+        List<WorkNodeTask> tasks = firstNode.getTasks();
+
+        if (CollectionUtil.isNotEmpty(tasks)){
+            workTaskRecordService.doCreateNodeTaskRecord(workNodeProcessable,tasks,instance,null);
+        }
+        return Boolean.TRUE;
+    }
+
     private Boolean handleByState(WorkNodeProcessable workNodeProcessable,WorkNodeCommit workNodeCommit){
         NodeLogEnum state = workNodeCommit.getState();
         if (state == null){

+ 1 - 1
service/src/main/java/com/dayou/task/FinanceFineScheduled.java

@@ -16,7 +16,7 @@ public class FinanceFineScheduled {
     /**
      * 每⽉23日凌晨0点 将逾期订单/产品信息新增到finance_fine表
      */
-    @Scheduled(cron = "0 0 0 23 * ?")
+//    @Scheduled(cron = "0 0 0 23 * ?")
     public void compileFineOrderTask() {
         financeFineService.compileFineOrder();
         log.info("搜集逾期订单/产品信息并添加到罚款表完成");

+ 56 - 0
service/src/main/java/com/dayou/workflow/config/WorkNodeProcessable.java

@@ -4,6 +4,7 @@ package com.dayou.workflow.config;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.db.sql.Order;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
 import com.dayou.bo.SimpleParentModel;
@@ -34,9 +35,13 @@ import java.util.stream.Collectors;
 
 import static com.dayou.enums.FinanceInvoiceState.审核拒绝;
 import static com.dayou.enums.FinanceInvoiceState.审核通过;
+import static com.dayou.enums.FineRefundReasonEnum.*;
+import static com.dayou.enums.FineRefundStatusEnum.NOT_RETURNED;
 import static com.dayou.enums.GlobalConfigEnum.*;
 import static com.dayou.enums.MainBusinessEnum.ASSET_BUSINESS;
 import static com.dayou.enums.MainBusinessEnum.MAJOR_BUSINESS;
+import static com.dayou.enums.ProductionReturnStatus.APPROVE;
+import static com.dayou.enums.ProductionReturnStatus.REJECTION;
 import static com.dayou.enums.workflow.NodeLogEnum.PASS;
 import static com.dayou.enums.workflow.NodeStateEnum.*;
 import static com.dayou.enums.workflow.WorkflowNodeEnum.LEADER_ALLOCATION;
@@ -91,6 +96,15 @@ public class WorkNodeProcessable {
     @Autowired
     private IOrderFundService orderFundService;
 
+    @Autowired
+    private IProductionReturnService productionReturnService;
+
+    @Autowired
+    private IFinanceFineService financeFineService;
+
+    @Autowired
+    private IFinanceFineRefundService financeFineRefundService;
+
 
     /**
      * 提交流程前置处理
@@ -166,6 +180,41 @@ public class WorkNodeProcessable {
                 commissionDeclareService.update(new LambdaUpdateWrapper<CommissionDeclare>().set(CommissionDeclare::getDeclareResult,审核通过.name())
                         .eq(BaseEntity::getId,currentInstanceNode.getBusinessId()));
                 break;
+            case PRODUCTION_RETURN:
+                // 产品退回流程通过后将申请记录改为通过状态
+                productionReturnService.update(new LambdaUpdateWrapper<ProductionReturn>().set(ProductionReturn::getStatus, APPROVE.getCode())
+                        .eq(ProductionReturn::getId, currentInstanceNode.getBusinessId())
+                        .eq(ProductionReturn::getDeleted, false));
+                ProductionReturn productionReturn = productionReturnService.getById(currentInstanceNode.getBusinessId());
+                // 获取订单收款信息
+                OrderFund orderFund = orderFundService.getOne(new LambdaQueryWrapper<OrderFund>()
+                        .eq(BaseEntity::getDeleted, false)
+                        .eq(OrderFund::getBusinessType, productionReturn.getBusinessType())
+                        .eq(OrderFund::getBusinessId, productionReturn.getBusinessId()));
+                ProductionFund productionFund = productionFundService.getOne(new LambdaQueryWrapper<ProductionFund>()
+                        .eq(BaseEntity::getDeleted, false)
+                        .eq(ProductionFund::getBusinessType, productionReturn.getBusinessType())
+                        .eq(ProductionFund::getBusinessId, productionReturn.getBusinessId())
+                        .eq(ProductionFund::getProductionNo, productionReturn.getProductionNo())
+                        .eq(ProductionFund::getOrderFundId, orderFund.getId()));
+                // 新增罚款后退款记录
+                FinanceFine financeFine = financeFineService.getFineByFundInfo(orderFund.getId(), productionFund.getId() != null ? productionFund.getId() : null);
+                // 判断罚款记录是否为空,为空说明没有已确认的罚款,不新增罚款退款记录
+                if (ObjectUtil.isNotNull(financeFine)) {
+                    FinanceFineRefund financeFineRefund = FinanceFineRefund
+                            .builder()
+                            .fineId(financeFine.getId())
+                            .refundAmount(financeFine.getRealFineAmount())
+                            .status(NOT_RETURNED.getCode())
+                            .build();
+                    if (productionReturn.getReturnInvoice()) {
+                        financeFineRefund.setRefundReason(RETURN_PRODUCTION_INVOICE.getCode());
+                    } else {
+                        financeFineRefund.setRefundReason(RETURN_PRODUCTION.getCode());
+                    }
+                    financeFineRefundService.saveIfNotExists(financeFineRefund);
+                }
+                break;
         }
     }
 
@@ -238,6 +287,7 @@ public class WorkNodeProcessable {
     @Transactional
     public boolean ending(WorkNodeCommit commit){
         WorkFlowNodeInstance currentNode = workFlowNodeInstanceService.getById(commit.getInstanceNodeId());
+        //终止前节点控制前置处理。
         beforeEnding(currentNode);
         //只需将当前节点设置为终止状态。
         workFlowNodeInstanceService.update(new LambdaUpdateWrapper<WorkFlowNodeInstance>().set(WorkFlowNodeInstance::getState,CLOSED)
@@ -457,6 +507,12 @@ public class WorkNodeProcessable {
                 // 删除节点任务
                 workTaskRecordService.update(new LambdaUpdateWrapper<WorkTaskRecord>().set(BaseEntity::getDeleted, true).eq(WorkTaskRecord::getInstanceId, currentInstanceNode.getId()));
                 break;
+            case PRODUCTION_RETURN:
+                // 产品退回流程拒绝后将申请记录改为拒绝状态
+                productionReturnService.update(new LambdaUpdateWrapper<ProductionReturn>().set(ProductionReturn::getStatus, REJECTION.getCode())
+                        .eq(ProductionReturn::getId, currentInstanceNode.getBusinessId())
+                        .eq(ProductionReturn::getDeleted, false));
+                break;
         }
     }