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; import java.util.stream.Collectors; /** * @title: 推书申请 * @Author szs * @Date: 2024-01-03 * @Version 1.0 */ @Service @AllArgsConstructor public class WfTextbookRecedeServiceImpl extends MPJBaseServiceImpl implements IWfTextbookRecedeService { private final WfTextbookRecedeMapper wfTextbookRecedeWfTextbookRecedeMapper; private final WfTextbookRecedeItemMapper wfTextbookRecedeWfTextbookRecedeItemMapper; 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) { wfTextbookRecedeWfTextbookRecedeMapper.insert(wfTextbookRecede); for (WfTextbookRecedeItem wfTextbookRecedeItem : wfTextbookRecede.getWfTextbookRecedeItemList()) { wfTextbookRecedeItem.setWfTextbookRecedeId(wfTextbookRecede.getId()); wfTextbookRecedeWfTextbookRecedeItemMapper.insert(wfTextbookRecedeItem); } return true; } @Override @Transactional(rollbackFor = Exception.class) public Boolean update(WfTextbookRecede wfTextbookRecede) { wfTextbookRecedeWfTextbookRecedeMapper.updateById(wfTextbookRecede); //********************************* WfTextbookRecedeItem 增删改 开始 *******************************************/ { // 查出所有子级的id List wfTextbookRecedeItemList = wfTextbookRecedeWfTextbookRecedeItemMapper.selectList(Wrappers.lambdaQuery(WfTextbookRecedeItem.class).eq(WfTextbookRecedeItem::getWfTextbookRecedeId, wfTextbookRecede.getId()).select(WfTextbookRecedeItem::getId)); List wfTextbookRecedeItemIds = wfTextbookRecedeItemList.stream().map(WfTextbookRecedeItem::getId).collect(Collectors.toList()); //原有子表单 没有被删除的主键 List wfTextbookRecedeItemOldIds = wfTextbookRecede.getWfTextbookRecedeItemList().stream().map(WfTextbookRecedeItem::getId).filter(Objects::nonNull).collect(Collectors.toList()); //找到需要删除的id List wfTextbookRecedeItemRemoveIds = wfTextbookRecedeItemIds.stream().filter(item -> !wfTextbookRecedeItemOldIds.contains(item)).collect(Collectors.toList()); for (WfTextbookRecedeItem wfTextbookRecedeItem : wfTextbookRecede.getWfTextbookRecedeItemList()) { //如果不等于空则修改 if (wfTextbookRecedeItem.getId() != null) { wfTextbookRecedeWfTextbookRecedeItemMapper.updateById(wfTextbookRecedeItem); } //如果等于空 则新增 else { //已经不存在的id 删除 wfTextbookRecedeItem.setWfTextbookRecedeId(wfTextbookRecede.getId()); wfTextbookRecedeWfTextbookRecedeItemMapper.insert(wfTextbookRecedeItem); } } //已经不存在的id 删除 if(wfTextbookRecedeItemRemoveIds.size() > 0){ wfTextbookRecedeWfTextbookRecedeItemMapper.deleteBatchIds(wfTextbookRecedeItemRemoveIds); } } //********************************* WfTextbookRecedeItem 增删改 结束 *******************************************/ return true; } @Override @Transactional(rollbackFor = Exception.class) public Boolean delete(List ids) { wfTextbookRecedeWfTextbookRecedeMapper.deleteBatchIds(ids); wfTextbookRecedeWfTextbookRecedeItemMapper.delete(Wrappers.lambdaQuery(WfTextbookRecedeItem.class).in(WfTextbookRecedeItem::getWfTextbookRecedeId, ids)); return true; } @Override @Transactional public Boolean dataHandle(Long formId) { WfTextbookRecede wfTextbookRecede = this.getByIdDeep(formId); // 根据数据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 wfTextbookRecedeItemList = wfTextbookRecede.getWfTextbookRecedeItemList(); if(ObjectUtils.isNotEmpty(wfTextbookRecedeItemList)){ // 获取本学期所有的出库记录 List textbookIssueRecords = textbookIssueRecordMapper.selectList( Wrappers.lambdaQuery(TextbookIssueRecord.class) .eq(TextbookIssueRecord::getBaseSemesterId, wfTextbookRecede.getBaseSemesterId()) .eq(TextbookIssueRecord::getDeleteMark, DeleteMark.NODELETE.getCode()) ); Map textbookIssueRecordMap = textbookIssueRecords.stream() .collect(Collectors.toMap(TextbookIssueRecord::getId, t -> t, (t1, t2) -> t1)) ; List textbookWarehouseRecordIds = textbookIssueRecords.stream() .map(TextbookIssueRecord::getTextbookWarehouseRecordId) .collect(Collectors.toList()); // 获取本学期所有的出库记录对应的所有的入库记录 List textbookWarehouseRecords = textbookWarehouseRecordMapper.selectList( Wrappers.lambdaQuery(TextbookWarehouseRecord.class) .in(ObjectUtils.isNotEmpty(textbookWarehouseRecordIds), TextbookWarehouseRecord::getId, textbookWarehouseRecordIds) .eq(TextbookWarehouseRecord::getDeleteMark, DeleteMark.NODELETE.getCode()) ); Map textbookWarehouseRecordMap = textbookWarehouseRecords.stream() .collect(Collectors.toMap(TextbookWarehouseRecord::getId, t -> t, (t1, t2) -> t1)) ; //遍历每一个退书申请项 TextbookWarehouseRecord oldTextbookWarehouseRecord; TextbookWarehouseRecordDetail textbookWarehouseRecordDetail; TextbookWarehouseRecord updateTextbookWarehouseRecord; TextbookIssueRecord oldTextbookIssueRecord; TextbookIssueRecord newTextbookIssueRecord; TextbookIssueRecord updateTextbookIssueRecord; for (WfTextbookRecedeItem wfTextbookRecedeItem : wfTextbookRecedeItemList) { // 退书项对应的出库记录 oldTextbookIssueRecord = textbookIssueRecordMap.get(wfTextbookRecedeItem.getTextbookIssueRecordId()); // 退书项对应的出库记录对应的入库记录 oldTextbookWarehouseRecord = textbookWarehouseRecordMap.get(oldTextbookIssueRecord.getTextbookWarehouseRecordId()); // 退书类型是到教务处 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()); textbookWarehouseRecordDetail.setCreateUserId(wfTextbookRecede.getApplicantUserId()); 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; } }