瀏覽代碼

教材退书规则引擎

大数据与最优化研究所 9 月之前
父節點
當前提交
6d9b036b02

+ 2 - 2
src/main/java/com/xjrsoft/common/enums/RecedeTypeEnum.java

@@ -10,12 +10,12 @@ public enum RecedeTypeEnum {
     /**
      *
      * */
-    PersonalRecede("recede_deans_office", "退到教务处"),
+    RecedeeDansOffice("recede_deans_office", "退到教务处"),
 
     /**
      *
      * */
-    ClassRecede("recede_bookstore", "退到书店");
+    RecedeBookstore("recede_bookstore", "退到书店");
 
     final String code;
     final String value;

+ 11 - 1
src/main/java/com/xjrsoft/module/liteflow/node/WfTextbookRecedeNode.java

@@ -5,8 +5,11 @@ import com.xjrsoft.module.textbook.service.IWfTextbookRecedeService;
 import com.yomahub.liteflow.core.NodeComponent;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
+import org.springframework.transaction.support.TransactionSynchronization;
+import org.springframework.transaction.support.TransactionSynchronizationManager;
 
 import java.util.Map;
+import java.util.concurrent.CompletableFuture;
 
 /**
  * 退书申请
@@ -24,7 +27,14 @@ public class WfTextbookRecedeNode extends NodeComponent {
         Long formId = Convert.toLong(value);
         if (formId != null) {
             // 数据处理
-            wfTextbookRecedeService.dataHandle(formId);
+            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
+                @Override
+                public void afterCommit() {
+                    CompletableFuture.runAsync(() -> {
+                        wfTextbookRecedeService.dataHandle(formId);
+                    });
+                }
+            });
         }
     }
 }

+ 0 - 7
src/main/java/com/xjrsoft/module/textbook/controller/TextbookIssueRecordController.java

@@ -61,13 +61,6 @@ public class TextbookIssueRecordController {
         return RT.ok(textbookIssueRecordService.distributeRecordPage(dto));
     }
 
-//    @GetMapping(value = "/can-return-textbook-list")
-//    @ApiOperation(value="根据教材出库记录查询可以退书的书籍列表(不分页)")
-//    @SaCheckPermission("textbookissuerecord:detail")
-//    public RT<List<CanReturnTextbookListVo>> canReturnTextbookList(@Valid CanReturnTextbookListDto dto){
-//        return RT.ok(textbookIssueRecordService.canReturnTextbookList(dto));
-//    }
-
     @GetMapping(value = "/info")
     @ApiOperation(value="根据id查询教材出库记录信息")
     @SaCheckPermission("textbookissuerecord:detail")

+ 2 - 2
src/main/java/com/xjrsoft/module/textbook/entity/TextbookWarehouseRecord.java

@@ -162,8 +162,8 @@ public class TextbookWarehouseRecord implements Serializable {
     @ApiModelProperty("已出库数量")
     private Integer issuedNumber;
     /**
-    * 领取后退书数量
-    */
+     * 领取后退书数量
+     */
     @ApiModelProperty("领取后退书数量")
     private Integer recedeNumber;
     /**

+ 3 - 2
src/main/java/com/xjrsoft/module/textbook/service/impl/TextbookWarehouseRecordServiceImpl.java

@@ -63,11 +63,12 @@ public class TextbookWarehouseRecordServiceImpl extends MPJBaseServiceImpl<Textb
         textbookWarehouseRecordMPJLambdaWrapper
                 .disableSubLogicDel()
                 .select(TextbookWarehouseRecord::getId)
-                .select(Textbook.class,x -> VoToColumnUtil.fieldsToColumns(TextbookWarehouseRecordPageVo.class).contains(x.getProperty()))
-                .select(TextbookWarehouseRecord.class,x -> VoToColumnUtil.fieldsToColumns(TextbookWarehouseRecordPageVo.class).contains(x.getProperty()))
                 .selectAs(TextbookWarehouseRecord::getPrice, TextbookWarehouseRecordPageVo::getPrice)
                 .selectAs(TextbookWarehouseRecord::getDiscount, TextbookWarehouseRecordPageVo::getDiscount)
                 .selectAs(TextbookWarehouseRecord::getCreateDate, TextbookWarehouseRecordPageVo::getCreateDate)
+                .selectAs(TextbookWarehouseRecord::getSubtotal, TextbookWarehouseRecordPageVo::getSubtotal)
+                .select(Textbook.class,x -> VoToColumnUtil.fieldsToColumns(TextbookWarehouseRecordPageVo.class).contains(x.getProperty()))
+                .select(TextbookWarehouseRecord.class,x -> VoToColumnUtil.fieldsToColumns(TextbookWarehouseRecordPageVo.class).contains(x.getProperty()))
                 .innerJoin(Textbook.class, Textbook::getId, TextbookWarehouseRecord::getTextbookId)
                 .leftJoin(BaseSemester.class, BaseSemester::getId, TextbookWarehouseRecord::getBaseSemesterId,
                         wrapper -> wrapper

+ 1 - 1
src/main/java/com/xjrsoft/module/textbook/service/impl/WfTextbookClaimServiceImpl.java

@@ -63,8 +63,8 @@ public class WfTextbookClaimServiceImpl extends MPJBaseServiceImpl<WfTextbookCla
     private final TextbookClaimUserMapper textbookClaimUserMapper;
 
     private final WorkflowFormRelationMapper workflowFormRelationMapper;
+
     private final TextbookWarehouseRecordMapper textbookWarehouseRecordMapper;
-    private final RoleMapper roleMapper;
 
     @Override
     public IPage<DistributePageVo> distributePageVo(DistributePageDto dto) {

+ 130 - 74
src/main/java/com/xjrsoft/module/textbook/service/impl/WfTextbookRecedeServiceImpl.java

@@ -1,18 +1,27 @@
 package com.xjrsoft.module.textbook.service.impl;
 
+import cn.dev33.satoken.stp.StpUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.github.yulichang.base.MPJBaseServiceImpl;
 import com.xjrsoft.common.enums.DeleteMark;
+import com.xjrsoft.common.enums.IssueModeEnum;
+import com.xjrsoft.common.enums.RecedeTypeEnum;
+import com.xjrsoft.common.enums.WarehouseModeEnum;
 import com.xjrsoft.module.textbook.entity.*;
 import com.xjrsoft.module.textbook.mapper.*;
 import com.xjrsoft.module.textbook.service.IWfTextbookRecedeService;
+import com.xjrsoft.module.workflow.entity.WorkflowFormRelation;
+import com.xjrsoft.module.workflow.mapper.WorkflowFormRelationMapper;
 import lombok.AllArgsConstructor;
 import org.apache.commons.lang3.ObjectUtils;
+import org.camunda.bpm.engine.history.HistoricProcessInstance;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -31,12 +40,14 @@ public class WfTextbookRecedeServiceImpl extends MPJBaseServiceImpl<WfTextbookRe
 
     private final WfTextbookRecedeItemMapper wfTextbookRecedeWfTextbookRecedeItemMapper;
 
-    private final TextbookMapper textbookTextbookMapper;
-
     private final TextbookWarehouseRecordMapper textbookWarehouseRecordMapper;
 
+    private final TextbookWarehouseRecordDetailMapper textbookWarehouseRecordDetailMapper;
+
     private final TextbookIssueRecordMapper textbookIssueRecordMapper;
 
+    private final WorkflowFormRelationMapper workflowFormRelationMapper;
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Boolean add(WfTextbookRecede wfTextbookRecede) {
@@ -99,21 +110,19 @@ public class WfTextbookRecedeServiceImpl extends MPJBaseServiceImpl<WfTextbookRe
     public Boolean dataHandle(Long formId) {
         WfTextbookRecede wfTextbookRecede = this.getByIdDeep(formId);
 
-        if(ObjectUtils.isNotEmpty(wfTextbookRecede)){
+        // 根据数据id找到所在流程得状态
+        WorkflowFormRelation workflowFormRelation = workflowFormRelationMapper.selectOne(
+                Wrappers.lambdaQuery(WorkflowFormRelation.class)
+                        .eq(WorkflowFormRelation::getFormKeyValue, formId)
+        );
+
+        if (ObjectUtils.isNotEmpty(wfTextbookRecede)
+                && ObjectUtils.isNotEmpty(workflowFormRelation)
+                && HistoricProcessInstance.STATE_COMPLETED.equals(workflowFormRelation.getCurrentState())
+        ) {
             List<WfTextbookRecedeItem> wfTextbookRecedeItemList = wfTextbookRecede.getWfTextbookRecedeItemList();
             if(ObjectUtils.isNotEmpty(wfTextbookRecedeItemList)){
-                // 获取本学期所有的入库记录
-                List<TextbookWarehouseRecord> textbookWarehouseRecords = textbookWarehouseRecordMapper.selectList(
-                        Wrappers.lambdaQuery(TextbookWarehouseRecord.class)
-                                .eq(TextbookWarehouseRecord::getBaseSemesterId, wfTextbookRecede.getBaseSemesterId())
-                                .eq(TextbookWarehouseRecord::getDeleteMark, DeleteMark.NODELETE.getCode())
-                );
-
-                Map<Long, TextbookWarehouseRecord> textbookWarehouseRecordMap = textbookWarehouseRecords.stream()
-                        .collect(Collectors.toMap(TextbookWarehouseRecord::getId, t -> t, (t1, t2) -> t1))
-                        ;
-
-                // 获取本学期所有的入库记录
+                // 获取本学期所有的出库记录
                 List<TextbookIssueRecord> textbookIssueRecords = textbookIssueRecordMapper.selectList(
                         Wrappers.lambdaQuery(TextbookIssueRecord.class)
                                 .eq(TextbookIssueRecord::getBaseSemesterId, wfTextbookRecede.getBaseSemesterId())
@@ -124,70 +133,117 @@ public class WfTextbookRecedeServiceImpl extends MPJBaseServiceImpl<WfTextbookRe
                         .collect(Collectors.toMap(TextbookIssueRecord::getId, t -> t, (t1, t2) -> t1))
                         ;
 
+                List<Long> textbookWarehouseRecordIds = textbookIssueRecords.stream()
+                        .map(TextbookIssueRecord::getTextbookWarehouseRecordId)
+                        .collect(Collectors.toList());
+
+                // 获取本学期所有的出库记录对应的所有的入库记录
+                List<TextbookWarehouseRecord> textbookWarehouseRecords = textbookWarehouseRecordMapper.selectList(
+                        Wrappers.lambdaQuery(TextbookWarehouseRecord.class)
+                                .in(ObjectUtils.isNotEmpty(textbookWarehouseRecordIds), TextbookWarehouseRecord::getId, textbookWarehouseRecordIds)
+                                .eq(TextbookWarehouseRecord::getDeleteMark, DeleteMark.NODELETE.getCode())
+                );
+
+                Map<Long, TextbookWarehouseRecord> textbookWarehouseRecordMap = textbookWarehouseRecords.stream()
+                        .collect(Collectors.toMap(TextbookWarehouseRecord::getId, t -> t, (t1, t2) -> t1))
+                        ;
+
                 //遍历每一个退书申请项
-                TextbookWarehouseRecord textbookWarehouseRecord;
-                TextbookIssueRecord textbookIssueRecord;
+                TextbookWarehouseRecord oldTextbookWarehouseRecord;
+                TextbookWarehouseRecordDetail textbookWarehouseRecordDetail;
+                TextbookWarehouseRecord updateTextbookWarehouseRecord;
+                TextbookIssueRecord oldTextbookIssueRecord;
+                TextbookIssueRecord newTextbookIssueRecord;
+                TextbookIssueRecord updateTextbookIssueRecord;
                 for (WfTextbookRecedeItem wfTextbookRecedeItem : wfTextbookRecedeItemList) {
-                    textbookIssueRecord = textbookIssueRecordMap.get(wfTextbookRecedeItem.getTextbookIssueRecordId());
-
-
-//                    //退书类型是到教务处
-//                    if(ObjectUtil.isNotNull(textbook) && wfTextbookRecede.getRecedeType().equals(RecedeTypeEnum.RecedeDeansOffice.getCode())){
-//                        //修改库存
-//                        textbookTextbookMapper.updateById(new Textbook(){{
-//                            setModifyUserId(StpUtil.getLoginIdAsLong());
-//                            setModifyDate(new Date());
-//                            setId(wfTextbookRecedeItem.getTextbookId());
-////                            setStock((ObjectUtil.isNull(textbook.getStock())?0:textbook.getStock()) + (ObjectUtil.isNull(wfTextbookRecedeItem.getNumber())?0:wfTextbookRecedeItem.getNumber()));
-//                        }});
-//                        //增加入库记录
-//                        textbookWarehouseRecordMapper.insert(new TextbookWarehouseRecord(){{
-//                            setCreateUserId(StpUtil.getLoginIdAsLong());
-//                            setCreateDate(new Date());
-//                            setTextbookId(wfTextbookRecedeItem.getTextbookId());
-//                            setDataId(wfTextbookRecede.getId());
-//                            setDataItemId(wfTextbookRecedeItem.getId());
-//                            setWarehouseMode(WarehouseModeEnum.WmRecede.getCode());
-//                            setWarehouseNumber(ObjectUtil.isNull(wfTextbookRecedeItem.getNumber())?0:wfTextbookRecedeItem.getNumber());
-//                            if(wfTextbookRecede.getClassId() != null && wfTextbookRecede.getClassId() > 0){
-//                                BaseClass c = baseClassMapper.selectById(wfTextbookRecede.getClassId());
-//                                setSource(c.getName());
-//                            }
-//                            QueryWrapper<TextbookWarehouseRecord> queryWrapperSortcode = new QueryWrapper<>();
-//                            queryWrapperSortcode.select("IFNULL(MAX(sort_code),0) as sortCode");
-//                            TextbookWarehouseRecord t = textbookWarehouseRecordMapper.selectOne(queryWrapperSortcode);
-//                            setSortCode(t.getSortCode()+1);
-//                        }});
-//                    }
-//
-//                    //退书类型是到书店
-//                    if(ObjectUtil.isNotNull(textbook) && wfTextbookRecede.getRecedeType().equals(RecedeTypeEnum.RecedeBookstore.getCode())){
-//                        //修改库存
-//                        textbookTextbookMapper.updateById(new Textbook(){{
-//                            setModifyUserId(StpUtil.getLoginIdAsLong());
-//                            setModifyDate(new Date());
-//                            setId(wfTextbookRecedeItem.getTextbookId());
-////                            setStock((ObjectUtil.isNull(textbook.getStock())?0:textbook.getStock()) - (ObjectUtil.isNull(wfTextbookRecedeItem.getNumber())?0:wfTextbookRecedeItem.getNumber()) );
-//                        }});
-//                        //增加出库记录
-//                        textbookIssueRecordMapper.insert(new TextbookIssueRecord(){{
-//                            setCreateUserId(StpUtil.getLoginIdAsLong());
-//                            setCreateDate(new Date());
-//                            setTextbookId(wfTextbookRecedeItem.getTextbookId());
-//                            setDataId(wfTextbookRecede.getId());
-//                            setDataItemId(wfTextbookRecedeItem.getId());
-//                            setIssueMode(IssueModeEnum.ImRecede.getCode());
-//                            setIssueNumber(ObjectUtil.isNull(wfTextbookRecedeItem.getNumber())?0:wfTextbookRecedeItem.getNumber());
-//                            QueryWrapper<TextbookIssueRecord> queryWrapperSortcode = new QueryWrapper<>();
-//                            queryWrapperSortcode.select("IFNULL(MAX(sort_code),0) as sortCode");
-//                            TextbookIssueRecord t = textbookIssueRecordMapper.selectOne(queryWrapperSortcode);
-//                            setSortCode(t.getSortCode()+1);
-//                        }});
-//                    }
+                    // 退书项对应的出库记录
+                    oldTextbookIssueRecord = textbookIssueRecordMap.get(wfTextbookRecedeItem.getTextbookIssueRecordId());
+                    // 退书项对应的出库记录对应的入库记录
+                    oldTextbookWarehouseRecord = textbookWarehouseRecordMap.get(oldTextbookIssueRecord.getId());
+
+                    // 退书类型是到教务处
+                    if(RecedeTypeEnum.RecedeeDansOffice.getCode().equals(wfTextbookRecede.getRecedeType())
+                        && ObjectUtils.isNotEmpty(oldTextbookWarehouseRecord)
+                        && ObjectUtils.isNotEmpty(oldTextbookIssueRecord)
+                    ){
+                        // 增加入库详情记录
+                        textbookWarehouseRecordDetail = new TextbookWarehouseRecordDetail();
+                        textbookWarehouseRecordDetail.setTextbookWarehouseRecordId(oldTextbookWarehouseRecord.getId());
+                        textbookWarehouseRecordDetail.setWarehouseMode(WarehouseModeEnum.WmRecede.getCode());
+                        textbookWarehouseRecordDetail.setWarehouseNumber(ObjectUtils.isEmpty(wfTextbookRecedeItem.getNumber()) ? 0 : wfTextbookRecedeItem.getNumber());
+                        textbookWarehouseRecordDetail.setCreateDate(new Date());
+                        textbookWarehouseRecordDetailMapper.insert(textbookWarehouseRecordDetail);
+
+                        // 修改入库记录
+                        updateTextbookWarehouseRecord = new TextbookWarehouseRecord();
+                        updateTextbookWarehouseRecord.setId(oldTextbookWarehouseRecord.getId());
+                        updateTextbookWarehouseRecord.setRecedeNumber(
+                                (ObjectUtils.isNotEmpty(oldTextbookWarehouseRecord.getRecedeNumber()) ? oldTextbookWarehouseRecord.getRecedeNumber() : 0)
+                                        + textbookWarehouseRecordDetail.getWarehouseNumber()
+                        );
+                        updateTextbookWarehouseRecord.setRemainNumber(
+                                (ObjectUtils.isNotEmpty(oldTextbookWarehouseRecord.getRemainNumber()) ? oldTextbookWarehouseRecord.getRemainNumber() : 0)
+                                + textbookWarehouseRecordDetail.getWarehouseNumber()
+                        );
+                        updateTextbookWarehouseRecord.setModifyDate(new Date());
+                        textbookWarehouseRecordMapper.updateById(updateTextbookWarehouseRecord);
+
+                        // 修改出库记录
+                        updateTextbookIssueRecord = new TextbookIssueRecord();
+                        updateTextbookIssueRecord.setId(oldTextbookIssueRecord.getId());
+                        updateTextbookIssueRecord.setRecedeNumber(
+                                (ObjectUtils.isNotEmpty(oldTextbookIssueRecord.getRecedeNumber()) ? oldTextbookIssueRecord.getRecedeNumber() : 0)
+                                        + textbookWarehouseRecordDetail.getWarehouseNumber()
+                        );
+                        updateTextbookIssueRecord.setActualIssueNumber(
+                                (ObjectUtils.isNotEmpty(oldTextbookIssueRecord.getIssueNumber()) ? oldTextbookIssueRecord.getIssueNumber() : 0)
+                                        +  (ObjectUtils.isNotEmpty(oldTextbookIssueRecord.getRecedeNumber()) ? oldTextbookIssueRecord.getRecedeNumber() : 0)
+                        );
+                        updateTextbookIssueRecord.setActualTotalPrice(oldTextbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(oldTextbookIssueRecord.getActualIssueNumber())));
+                        updateTextbookIssueRecord.setModifyDate(new Date());
+                        textbookIssueRecordMapper.updateById(updateTextbookIssueRecord);
+                    }
+
+                    //退书类型是到书店
+                    if(RecedeTypeEnum.RecedeBookstore.getCode().equals(wfTextbookRecede.getRecedeType())
+                            && ObjectUtils.isNotEmpty(oldTextbookWarehouseRecord)
+                    ){
+                        // 新增出库
+                        newTextbookIssueRecord = new TextbookIssueRecord();
+                        newTextbookIssueRecord.setBaseSemesterId(wfTextbookRecede.getBaseSemesterId());
+                        newTextbookIssueRecord.setOrderNumber("退书到书店的出库单号");
+                        newTextbookIssueRecord.setTextbookWarehouseRecordId(oldTextbookWarehouseRecord.getId());
+                        newTextbookIssueRecord.setIssueMode(IssueModeEnum.ImRecede.getCode());
+                        newTextbookIssueRecord.setTextbookId(wfTextbookRecedeItem.getTextbookId());
+                        newTextbookIssueRecord.setIssueNumber(ObjectUtils.isEmpty(wfTextbookRecedeItem.getNumber()) ? 0 : wfTextbookRecedeItem.getNumber());
+                        newTextbookIssueRecord.setRecedeNumber(0);
+                        newTextbookIssueRecord.setActualIssueNumber(newTextbookIssueRecord.getIssueNumber());
+                        newTextbookIssueRecord.setActualTotalPrice(oldTextbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(newTextbookIssueRecord.getActualIssueNumber())));
+                        newTextbookIssueRecord.setIssueUserId(wfTextbookRecede.getCreateUserId());
+                        textbookIssueRecordMapper.insert(newTextbookIssueRecord);
+
+                        // 修改入库记录
+                        updateTextbookWarehouseRecord = new TextbookWarehouseRecord();
+                        updateTextbookWarehouseRecord.setId(oldTextbookWarehouseRecord.getId());
+                        updateTextbookWarehouseRecord.setReturnBookstoreNumber(
+                                (ObjectUtils.isNotEmpty(oldTextbookWarehouseRecord.getReturnBookstoreNumber()) ? oldTextbookWarehouseRecord.getReturnBookstoreNumber() : 0)
+                                        + newTextbookIssueRecord.getIssueNumber()
+                        );
+                        updateTextbookWarehouseRecord.setActualWarehouseNumber(
+                                (ObjectUtils.isNotEmpty(oldTextbookWarehouseRecord.getWarehouseNumber()) ? oldTextbookWarehouseRecord.getWarehouseNumber() : 0)
+                                        - updateTextbookWarehouseRecord.getReturnBookstoreNumber()
+                        );
+                        updateTextbookWarehouseRecord.setActualTotalPrice(oldTextbookWarehouseRecord.getSubtotal().multiply(BigDecimal.valueOf(updateTextbookWarehouseRecord.getActualWarehouseNumber())));
+                        updateTextbookWarehouseRecord.setRemainNumber(
+                                (ObjectUtils.isNotEmpty(oldTextbookWarehouseRecord.getRemainNumber()) ? oldTextbookWarehouseRecord.getRemainNumber() : 0)
+                                        - newTextbookIssueRecord.getIssueNumber()
+                        );
+                        updateTextbookWarehouseRecord.setModifyDate(new Date());
+                        textbookWarehouseRecordMapper.updateById(updateTextbookWarehouseRecord);
+                    }
                 }
             }
         }
-
         return true;
     }
 }