外协结算-我的待办

liweidong
maxiangong 5 days ago
parent 90f75e139b
commit c0e7c10ad2
  1. 18
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/common/enums/MesApprovalRecordBizTypeEnum.java
  2. 76
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/common/pojo/entity/MesApprovalFlowEntity.java
  3. 24
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/common/pojo/vo/MesApprovalFlowVO.java
  4. 20
      blade-service-api/blade-desk-api/src/main/java/org/springblade/desk/common/pojo/vo/MesApprovalRecordDetailVO.java
  5. 13
      blade-service/blade-desk/src/main/java/org/springblade/desk/common/controller/MesApprovalRecordController.java
  6. 49
      blade-service/blade-desk/src/main/java/org/springblade/desk/common/factory/MesApprovalDetailFactory.java
  7. 15
      blade-service/blade-desk/src/main/java/org/springblade/desk/common/mapper/MesApprovalFlowMapper.java
  8. 50
      blade-service/blade-desk/src/main/java/org/springblade/desk/common/mapper/MesApprovalFlowMapper.xml
  9. 16
      blade-service/blade-desk/src/main/java/org/springblade/desk/common/service/ApprovalRecordDetailStrategy.java
  10. 20
      blade-service/blade-desk/src/main/java/org/springblade/desk/common/service/IMesApprovalFlowService.java
  11. 60
      blade-service/blade-desk/src/main/java/org/springblade/desk/common/service/IMesApprovalRecordService.java
  12. 23
      blade-service/blade-desk/src/main/java/org/springblade/desk/common/service/impl/MesApprovalFlowServiceImpl.java
  13. 228
      blade-service/blade-desk/src/main/java/org/springblade/desk/common/service/impl/MesApprovalRecordServiceImpl.java
  14. 68
      blade-service/blade-desk/src/main/java/org/springblade/desk/common/service/impl/OemStatementApprovalServiceImpl.java
  15. 73
      blade-service/blade-desk/src/main/java/org/springblade/desk/oem/service/impl/OemSettlementApprovalServiceImpl.java
  16. 321
      blade-service/blade-desk/src/main/java/org/springblade/desk/oem/service/impl/OemStatementServiceImpl.java

@ -0,0 +1,18 @@
package org.springblade.desk.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
/**
* 我的待办业务类型枚举
*/
@Getter
@AllArgsConstructor
public enum MesApprovalRecordBizTypeEnum {
OEM_STATEMENT("外协结算校对/审核"),
;
private final String desc;
}

@ -0,0 +1,76 @@
package org.springblade.desk.common.pojo.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.core.mp.base.BaseEntity;
import java.util.Date;
/**
* 审批流程对象
*/
@Data
@TableName("MES_APPROVAL_FLOW")
@Schema(description = "MesApprovalFlow对象")
@EqualsAndHashCode(callSuper = true)
public class MesApprovalFlowEntity extends BaseEntity {
/**
* 业务ID
*/
@Schema(description = "业务ID")
private Long bizId;
/**
* 业务类型
*/
@Schema(description = "业务类型")
private String bizType;
/**
* 节点
*/
@Schema(description = "节点")
private String node;
/**
* 序号
*/
@Schema(description = "序号")
private Integer sort;
/**
* 下节点序号
*/
@Schema(description = "序号")
private Integer nextSort;
/**
* 审核人
*/
@Schema(description = "审核人")
private Long approvalUser;
/**
* 审核时间
*/
@Schema(description = "审核时间")
private Date approvalTime;
public MesApprovalFlowEntity(){
}
public MesApprovalFlowEntity(Long bizId, String bizType, String node, Integer sort, Integer nextSort, Long approvalUser, Date approvalTime, Integer status){
this.bizId = bizId;
this.bizType = bizType;
this.node = node;
this.sort = sort;
this.nextSort = nextSort;
this.approvalUser = approvalUser;
this.approvalTime = approvalTime;
super.setStatus(status);
}
}

@ -0,0 +1,24 @@
package org.springblade.desk.common.pojo.vo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.desk.common.pojo.entity.MesApprovalFlowEntity;
import java.io.Serial;
/**
* 审批流程VO
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class MesApprovalFlowVO extends MesApprovalFlowEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 审批人名称
*/
private String approvalUserName;
}

@ -0,0 +1,20 @@
package org.springblade.desk.common.pojo.vo;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.desk.common.pojo.entity.MesApprovalRecordEntity;
import java.util.List;
/**
* 我的待办详情视图实体类
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class MesApprovalRecordDetailVO<T> extends MesApprovalRecordEntity {
private List<MesApprovalFlowVO> flowList;
private T detailData;
}

@ -27,6 +27,7 @@ package org.springblade.desk.common.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor;
@ -36,9 +37,13 @@ import org.springblade.core.mp.support.Query;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.desk.common.pojo.entity.MesApprovalRecordEntity;
import org.springblade.desk.common.pojo.vo.MesApprovalRecordDetailVO;
import org.springblade.desk.common.pojo.vo.MyHistoryMesApprovalRecordVO;
import org.springblade.desk.common.pojo.vo.MyMesApprovalRecordVO;
import org.springblade.desk.common.service.IMesApprovalRecordService;
import org.springblade.desk.oem.pojo.entity.OemStatementEntity;
import org.springblade.desk.oem.pojo.vo.OemStatementVO;
import org.springblade.desk.oem.wrapper.OemStatementWrapper;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@ -79,4 +84,12 @@ public class MesApprovalRecordController extends BladeController {
IPage<MyHistoryMesApprovalRecordVO> pages = mesApprovalRecordService.selectMyHistoryMesApprovalRecordPage(Condition.getPage(query), mesApprovalRecord);
return R.data(pages);
}
@GetMapping("/detail")
@ApiOperationSupport(order = 1)
@Operation(summary = "详情", description = "传入mesOemStatement")
public R<MesApprovalRecordDetailVO> detail(MesApprovalRecordEntity mesApprovalRecord) {
MesApprovalRecordDetailVO detail = mesApprovalRecordService.getDetail(mesApprovalRecord);
return R.data(detail);
}
}

@ -0,0 +1,49 @@
package org.springblade.desk.common.factory;
import org.springblade.desk.common.service.ApprovalRecordDetailStrategy;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* 待办详情策略工厂类
*/
@Component
public class MesApprovalDetailFactory implements ApplicationContextAware {
private static ApplicationContext context;
private static final Map<String, ApprovalRecordDetailStrategy> STRATEGY_MAP = new ConcurrentHashMap<>();
public ApprovalRecordDetailStrategy getStrategy(String bizType) {
// 1. 先看缓存有没有
if (STRATEGY_MAP.containsKey(bizType)) {
return STRATEGY_MAP.get(bizType);
}
Map<String, ApprovalRecordDetailStrategy> beans = context.getBeansOfType(ApprovalRecordDetailStrategy.class);
ApprovalRecordDetailStrategy target = null;
for (ApprovalRecordDetailStrategy strategy : beans.values()) {
if (bizType.equals(strategy.getBizType())) {
target = strategy;
break;
}
}
if (target == null) {
throw new RuntimeException("不支持的业务类型:" + bizType);
}
// 3. 放入缓存,下次直接用
STRATEGY_MAP.put(bizType, target);
return target;
}
@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
context = applicationContext;
}
}

@ -0,0 +1,15 @@
package org.springblade.desk.common.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.springblade.desk.common.pojo.entity.MesApprovalFlowEntity;
import org.springblade.desk.common.pojo.vo.MesApprovalFlowVO;
import java.util.List;
/**
* 审批流程Mapper
*/
public interface MesApprovalFlowMapper extends BaseMapper<MesApprovalFlowEntity> {
List<MesApprovalFlowVO> queryVOList(MesApprovalFlowEntity mesApprovalFlow);
}

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.springblade.desk.common.mapper.MesApprovalFlowMapper">
<!-- 通用查询映射结果 -->
<resultMap id="mesApprovalFlowResultMap" type="org.springblade.desk.common.pojo.entity.MesApprovalFlowEntity">
<result column="ID" property="id"/>
<result column="BIZ_ID" property="bizId"/>
<result column="BIZ_TYPE" property="bizType"/>
<result column="NODE" property="node"/>
<result column="SORT" property="sort"/>
<result column="NEXT_SORT" property="nextSort"/>
<result column="APPROVAL_USER" property="approvalUser"/>
<result column="APPROVAL_TIME" property="approvalTime"/>
<result column="CREATE_USER" property="createUser"/>
<result column="CREATE_DEPT" property="createDept"/>
<result column="CREATE_TIME" property="createTime"/>
<result column="UPDATE_USER" property="updateUser"/>
<result column="UPDATE_TIME" property="updateTime"/>
<result column="STATUS" property="status"/>
<result column="IS_DELETED" property="isDeleted"/>
</resultMap>
<resultMap id="mesApprovalFlowVOResultMap" type="org.springblade.desk.common.pojo.vo.MesApprovalFlowVO" extends="mesApprovalFlowResultMap">
<result column="APPROVAL_USER_NAME" property="approvalUserName"/>
</resultMap>
<select id="selectMesApprovalFlowPage" resultMap="mesApprovalFlowResultMap">
select * from MES_APPROVAL_FLOW where is_deleted = 0
</select>
<select id="queryVOList" resultMap="mesApprovalFlowVOResultMap">
select a.*,
bu.REAL_NAME as APPROVAL_USER_NAME
from MES_APPROVAL_FLOW a
LEFT JOIN BLADE_USER bu ON a.APPROVAL_USER = bu.id
where a.is_deleted = 0
<if test="bizId != null and bizId != ''">
and a.biz_id = #{bizId}
</if>
<if test="bizType != null and bizType != ''">
and a.biz_type = #{bizType}
</if>
<if test="status != null and status != ''">
and a.status = #{status}
</if>
order by a.sort asc
</select>
</mapper>

@ -0,0 +1,16 @@
package org.springblade.desk.common.service;
/**
* 我的待办详情策略类
* @param <T>
*/
public interface ApprovalRecordDetailStrategy<T> {
String getBizType();
T getDetail(Long bizId);
void createApproval(Long bizId);
}

@ -0,0 +1,20 @@
package org.springblade.desk.common.service;
import org.springblade.core.mp.base.BaseService;
import org.springblade.desk.common.pojo.entity.MesApprovalFlowEntity;
import org.springblade.desk.common.pojo.vo.MesApprovalFlowVO;
import java.util.List;
/**
* 审批流程记录Service
*/
public interface IMesApprovalFlowService extends BaseService<MesApprovalFlowEntity> {
/**
* 根据条件查询VO
* @param mesApprovalFlow
* @return
*/
List<MesApprovalFlowVO> queryVOList(MesApprovalFlowEntity mesApprovalFlow);
}

@ -29,9 +29,12 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springblade.core.mp.base.BaseService;
import org.springblade.desk.common.pojo.entity.MesApprovalRecordEntity;
import org.springblade.desk.common.pojo.vo.MesApprovalRecordDetailVO;
import org.springblade.desk.common.pojo.vo.MyHistoryMesApprovalRecordVO;
import org.springblade.desk.common.pojo.vo.MyMesApprovalRecordVO;
import java.util.Date;
/**
* 审批记录表 服务类
*
@ -39,22 +42,47 @@ import org.springblade.desk.common.pojo.vo.MyMesApprovalRecordVO;
* @since 2026-02-26
*/
public interface IMesApprovalRecordService extends BaseService<MesApprovalRecordEntity> {
/**
* 自定义分页
*
* @param page 分页参数
* @param mesApprovalRecord 查询参数
* @return IPage<MyMesApprovalRecordVO>
*/
IPage<MyMesApprovalRecordVO> selectMyMesApprovalRecordPage(Page<MesApprovalRecordEntity> page, MyMesApprovalRecordVO mesApprovalRecord);
/**
* 自定义分页
*
* @param page 分页参数
* @param mesApprovalRecord 查询参数
* @return IPage<MyMesApprovalRecordVO>
*/
IPage<MyMesApprovalRecordVO> selectMyMesApprovalRecordPage(Page<MesApprovalRecordEntity> page, MyMesApprovalRecordVO mesApprovalRecord);
/**
* 自定义分页
*
* @param page 分页参数
* @param mesApprovalRecord 查询参数
* @return IPage<MyHistoryMesApprovalRecordVO>
*/
IPage<MyHistoryMesApprovalRecordVO> selectMyHistoryMesApprovalRecordPage(IPage<MyHistoryMesApprovalRecordVO> page, MyHistoryMesApprovalRecordVO mesApprovalRecord);
/**
* 待办详情
*
* @param mesApprovalRecord
* @return
*/
MesApprovalRecordDetailVO getDetail(MesApprovalRecordEntity mesApprovalRecord);
/**
* 自定义分页
*
* @param page 分页参数
* @param mesApprovalRecord 查询参数
* @return IPage<MyHistoryMesApprovalRecordVO>
*/
IPage<MyHistoryMesApprovalRecordVO> selectMyHistoryMesApprovalRecordPage(IPage<MyHistoryMesApprovalRecordVO> page, MyHistoryMesApprovalRecordVO mesApprovalRecord);
/**
* 更新待办
*
* @param bizId
* @param bizType
* @param approvalUser
* @param approvalTime
*/
void updateApproval(Long bizId, String bizType, Long approvalUser, Date approvalTime);
/**
* 删除待办
*
* @param bizId
* @param bizType
*/
void removeApproval(Long bizId, String bizType);
}

@ -0,0 +1,23 @@
package org.springblade.desk.common.service.impl;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.desk.common.mapper.MesApprovalFlowMapper;
import org.springblade.desk.common.pojo.entity.MesApprovalFlowEntity;
import org.springblade.desk.common.pojo.vo.MesApprovalFlowVO;
import org.springblade.desk.common.service.IMesApprovalFlowService;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* 审批流程Service实现类
*/
@Service
public class MesApprovalFlowServiceImpl extends BaseServiceImpl<MesApprovalFlowMapper, MesApprovalFlowEntity> implements IMesApprovalFlowService {
@Override
public List<MesApprovalFlowVO> queryVOList(MesApprovalFlowEntity mesApprovalFlow) {
return baseMapper.queryVOList(mesApprovalFlow);
}
}

@ -29,25 +29,26 @@ import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springblade.common.utils.CommonUtil;
import jakarta.annotation.Resource;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.desk.common.constant.ApprovalStatusConstant;
import org.springblade.desk.common.factory.MesApprovalDetailFactory;
import org.springblade.desk.common.mapper.MesApprovalRecordMapper;
import org.springblade.desk.common.pojo.entity.MesApprovalFlowEntity;
import org.springblade.desk.common.pojo.entity.MesApprovalRecordEntity;
import org.springblade.desk.common.pojo.entity.MesNotifyMessageEntity;
import org.springblade.desk.common.pojo.vo.MesNotifyMessageVO;
import org.springblade.desk.common.pojo.vo.MesApprovalFlowVO;
import org.springblade.desk.common.pojo.vo.MesApprovalRecordDetailVO;
import org.springblade.desk.common.pojo.vo.MyHistoryMesApprovalRecordVO;
import org.springblade.desk.common.pojo.vo.MyMesApprovalRecordVO;
import org.springblade.desk.common.service.ApprovalRecordDetailStrategy;
import org.springblade.desk.common.service.IMesApprovalFlowService;
import org.springblade.desk.common.service.IMesApprovalRecordService;
import org.springblade.system.cache.UserCache;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
@ -59,63 +60,160 @@ import java.util.stream.Collectors;
@Service
public class MesApprovalRecordServiceImpl extends BaseServiceImpl<MesApprovalRecordMapper, MesApprovalRecordEntity> implements IMesApprovalRecordService {
@Override
public IPage<MyMesApprovalRecordVO> selectMyMesApprovalRecordPage(Page<MesApprovalRecordEntity> page, MyMesApprovalRecordVO mesApprovalRecord) {
Page<MesApprovalRecordEntity> mesNotifyMessageVOPage = this.page(page, new LambdaQueryWrapper<MesApprovalRecordEntity>()
.eq(StrUtil.isNotEmpty(mesApprovalRecord.getBizType()), MesApprovalRecordEntity::getBizType, mesApprovalRecord.getBizType())
.like(StrUtil.isNotEmpty(mesApprovalRecord.getContent()), MesApprovalRecordEntity::getContent, mesApprovalRecord.getContent())
.orderByDesc(MesApprovalRecordEntity::getCreateTime));
Page<MyMesApprovalRecordVO> page1 = new Page<>();
if (!mesNotifyMessageVOPage.getRecords().isEmpty()){
List<MyMesApprovalRecordVO> recordVOList = new ArrayList<>();
mesNotifyMessageVOPage.getRecords().forEach(entity -> {
MyMesApprovalRecordVO recordVO = new MyMesApprovalRecordVO();
BeanUtils.copyProperties(entity, recordVO);
recordVO.setCreateUserName(AuthUtil.getUserName());
recordVOList.add(recordVO);
});
page1.setRecords(recordVOList);
page1.setTotal(page.getTotal());
page1.setSize(page.getSize());
page1.setCurrent(page.getCurrent());
return page1;
}
return page1;
}
@Resource
private MesApprovalDetailFactory mesApprovalDetailFactory;
@Resource
private IMesApprovalFlowService approvalFlowService;
@Override
public IPage<MyHistoryMesApprovalRecordVO> selectMyHistoryMesApprovalRecordPage(IPage<MyHistoryMesApprovalRecordVO> page, MyHistoryMesApprovalRecordVO mesApprovalRecord) {
List<MesApprovalRecordEntity> myHistoryMesApprovalRecordVOList = baseMapper.selectMyHistoryMesApprovalRecordPage(page, mesApprovalRecord);
// 提取所有的业务ID
List<Long> bizIdList = myHistoryMesApprovalRecordVOList.stream().map(MesApprovalRecordEntity::getBizId).toList();
// 提取所有的业务类型
List<String> bizTypeList = myHistoryMesApprovalRecordVOList.stream().map(MesApprovalRecordEntity::getBizType).toList();
// 根据业务ID和业务类型查询所有的审批记录
if (!myHistoryMesApprovalRecordVOList.isEmpty()){
List<MesApprovalRecordEntity> list = this.list(new LambdaQueryWrapper<MesApprovalRecordEntity>()
.in(MesApprovalRecordEntity::getBizId, bizIdList)
.in(MesApprovalRecordEntity::getBizType, bizTypeList)
.orderByDesc(MesApprovalRecordEntity::getCreateTime));
Map<String, List<MesApprovalRecordEntity>> recordMap = list.stream()
.collect(Collectors.groupingBy(
entity -> entity.getBizId().toString() + "_" + entity.getBizType()
));
// 拼接查询数据,无需多次查询
List<MyHistoryMesApprovalRecordVO> recordVOList = new ArrayList<>();
myHistoryMesApprovalRecordVOList.forEach(entity -> {
MyHistoryMesApprovalRecordVO recordVO = new MyHistoryMesApprovalRecordVO();
BeanUtils.copyProperties(entity, recordVO);
String key = entity.getBizId().toString() + "_" + entity.getBizType();
MesApprovalRecordEntity currentRecord = recordMap.get(key).get(recordMap.get(key).size() - 1);
MesApprovalRecordEntity firstRecord = recordMap.get(key).get(0);
recordVO.setCurrentNodeName(AuthUtil.getUserRole() + "审批");
recordVO.setCurrentFlowNodeName(currentRecord.getCurrentRoleName() + "已审批");
recordVO.setStartUserName(UserCache.getUser(firstRecord.getCreateUser()).getName());
recordVO.setEndStatus(currentRecord.getStatus().equals(ApprovalStatusConstant.PASS));
recordVOList.add(recordVO);
});
page.setRecords(recordVOList);
}
return page.setRecords(Collections.emptyList());
}
@Override
public IPage<MyMesApprovalRecordVO> selectMyMesApprovalRecordPage(Page<MesApprovalRecordEntity> page, MyMesApprovalRecordVO mesApprovalRecord) {
Page<MesApprovalRecordEntity> mesNotifyMessageVOPage = this.page(page, new LambdaQueryWrapper<MesApprovalRecordEntity>()
.eq(StrUtil.isNotEmpty(mesApprovalRecord.getBizType()), MesApprovalRecordEntity::getBizType, mesApprovalRecord.getBizType())
.eq(mesApprovalRecord.getStatus() != null, MesApprovalRecordEntity::getStatus, mesApprovalRecord.getStatus())
.like(StrUtil.isNotEmpty(mesApprovalRecord.getContent()), MesApprovalRecordEntity::getContent, mesApprovalRecord.getContent())
.orderByDesc(MesApprovalRecordEntity::getCreateTime));
Page<MyMesApprovalRecordVO> page1 = new Page<>();
if (!mesNotifyMessageVOPage.getRecords().isEmpty()) {
List<MyMesApprovalRecordVO> recordVOList = new ArrayList<>();
mesNotifyMessageVOPage.getRecords().forEach(entity -> {
MyMesApprovalRecordVO recordVO = new MyMesApprovalRecordVO();
BeanUtils.copyProperties(entity, recordVO);
recordVO.setCreateUserName(AuthUtil.getUserName());
recordVOList.add(recordVO);
});
page1.setRecords(recordVOList);
page1.setTotal(page.getTotal());
page1.setSize(page.getSize());
page1.setCurrent(page.getCurrent());
return page1;
}
return page1;
}
@Override
public IPage<MyHistoryMesApprovalRecordVO> selectMyHistoryMesApprovalRecordPage(IPage<MyHistoryMesApprovalRecordVO> page, MyHistoryMesApprovalRecordVO mesApprovalRecord) {
List<MesApprovalRecordEntity> myHistoryMesApprovalRecordVOList = baseMapper.selectMyHistoryMesApprovalRecordPage(page, mesApprovalRecord);
// 提取所有的业务ID
List<Long> bizIdList = myHistoryMesApprovalRecordVOList.stream().map(MesApprovalRecordEntity::getBizId).toList();
// 提取所有的业务类型
List<String> bizTypeList = myHistoryMesApprovalRecordVOList.stream().map(MesApprovalRecordEntity::getBizType).toList();
// 根据业务ID和业务类型查询所有的审批记录
if (!myHistoryMesApprovalRecordVOList.isEmpty()) {
List<MesApprovalRecordEntity> list = this.list(new LambdaQueryWrapper<MesApprovalRecordEntity>()
.in(MesApprovalRecordEntity::getBizId, bizIdList)
.in(MesApprovalRecordEntity::getBizType, bizTypeList)
.orderByDesc(MesApprovalRecordEntity::getCreateTime));
Map<String, List<MesApprovalRecordEntity>> recordMap = list.stream()
.collect(Collectors.groupingBy(
entity -> entity.getBizId().toString() + "_" + entity.getBizType()
));
// 拼接查询数据,无需多次查询
List<MyHistoryMesApprovalRecordVO> recordVOList = new ArrayList<>();
myHistoryMesApprovalRecordVOList.forEach(entity -> {
MyHistoryMesApprovalRecordVO recordVO = new MyHistoryMesApprovalRecordVO();
BeanUtils.copyProperties(entity, recordVO);
String key = entity.getBizId().toString() + "_" + entity.getBizType();
MesApprovalRecordEntity currentRecord = recordMap.get(key).get(recordMap.get(key).size() - 1);
MesApprovalRecordEntity firstRecord = recordMap.get(key).get(0);
recordVO.setCurrentNodeName(AuthUtil.getUserRole() + "审批");
recordVO.setCurrentFlowNodeName(currentRecord.getCurrentRoleName() + "已审批");
recordVO.setStartUserName(UserCache.getUser(firstRecord.getCreateUser()).getName());
recordVO.setEndStatus(currentRecord.getStatus().equals(ApprovalStatusConstant.PASS));
recordVOList.add(recordVO);
});
page.setRecords(recordVOList);
}
return page.setRecords(Collections.emptyList());
}
@Override
public MesApprovalRecordDetailVO getDetail(MesApprovalRecordEntity mesApprovalRecord) {
MesApprovalRecordEntity approvalRecordEntity = this.getById(mesApprovalRecord.getId());
MesApprovalRecordDetailVO detailVO = new MesApprovalRecordDetailVO();
BeanUtils.copyProperties(approvalRecordEntity, detailVO);
MesApprovalFlowEntity flowQuery = new MesApprovalFlowEntity();
flowQuery.setBizId(approvalRecordEntity.getBizId());
flowQuery.setBizType(approvalRecordEntity.getBizType());
List<MesApprovalFlowVO> flowList = approvalFlowService.queryVOList(flowQuery);
detailVO.setFlowList(flowList);
ApprovalRecordDetailStrategy strategy = mesApprovalDetailFactory.getStrategy(approvalRecordEntity.getBizType());
Object detail = strategy.getDetail(approvalRecordEntity.getBizId());
detailVO.setDetailData(detail);
return detailVO;
}
@Override
public void updateApproval(Long bizId, String bizType, Long approvalUser, Date approvalTime) {
MesApprovalRecordEntity entity = getByBiz(bizId, bizType);
if (entity == null || entity.getStatus() != 1) {
return;
}
MesApprovalRecordEntity upd = new MesApprovalRecordEntity();
upd.setId(entity.getId());
upd.setStatus(2);
this.updateById(upd);
MesApprovalFlowEntity flowQuery = new MesApprovalFlowEntity();
flowQuery.setBizId(bizId);
flowQuery.setBizType(bizType);
List<MesApprovalFlowVO> flowList = approvalFlowService.queryVOList(flowQuery);
MesApprovalFlowVO currentFlow = flowList.stream().filter(flow -> flow.getStatus().equals(2)).findFirst().orElse(null);
if (currentFlow != null) {
MesApprovalFlowEntity currentFlowEntity = new MesApprovalFlowEntity();
currentFlowEntity.setId(currentFlow.getId());
currentFlowEntity.setApprovalUser(approvalUser);
currentFlowEntity.setApprovalTime(approvalTime);
currentFlowEntity.setStatus(3);
approvalFlowService.updateById(currentFlowEntity);
Integer nextSort = currentFlow.getNextSort();
if (nextSort == null) {
return;
}
MesApprovalFlowVO nextFlow = flowList.stream().filter(flow -> flow.getSort().equals(nextSort)).findFirst().orElse(null);
if (nextFlow != null) {
MesApprovalRecordEntity save = new MesApprovalRecordEntity();
BeanUtils.copyProperties(entity, save);
save.setStatus(1);
save.setCreateUser(approvalUser);
save.setCreateTime(approvalTime);
save.setId(null);
this.save(save);
MesApprovalFlowEntity nextFlowEntity = new MesApprovalFlowEntity();
nextFlowEntity.setId(nextFlow.getId());
nextFlowEntity.setStatus(2);
approvalFlowService.updateById(nextFlowEntity);
}
}
}
/**
* 删除待办
*
* @param bizId
* @param bizType
*/
@Override
public void removeApproval(Long bizId, String bizType) {
MesApprovalRecordEntity entity = getByBiz(bizId, bizType);
if (entity == null || entity.getStatus() != 1) {
return;
}
MesApprovalRecordEntity upd = new MesApprovalRecordEntity();
upd.setId(entity.getId());
upd.setStatus(2);
this.updateById(upd);
MesApprovalFlowEntity flowQuery = new MesApprovalFlowEntity();
flowQuery.setBizId(bizId);
flowQuery.setBizType(bizType);
List<MesApprovalFlowVO> flowList = approvalFlowService.queryVOList(flowQuery);
List<Long> ids = flowList.stream().map(MesApprovalFlowVO::getId).collect(Collectors.toList());
approvalFlowService.removeByIds(ids);
}
private MesApprovalRecordEntity getByBiz(Long bizId, String bizType) {
return this.getOne(new LambdaQueryWrapper<MesApprovalRecordEntity>()
.eq(MesApprovalRecordEntity::getBizType, bizType)
.eq(MesApprovalRecordEntity::getBizId, bizId)
.eq(MesApprovalRecordEntity::getStatus, 1));
}
}

@ -0,0 +1,68 @@
package org.springblade.desk.common.service.impl;
import jakarta.annotation.Resource;
import org.springblade.desk.common.enums.MesApprovalRecordBizTypeEnum;
import org.springblade.desk.common.pojo.entity.MesApprovalFlowEntity;
import org.springblade.desk.common.pojo.entity.MesApprovalRecordEntity;
import org.springblade.desk.common.service.ApprovalRecordDetailStrategy;
import org.springblade.desk.common.service.IMesApprovalFlowService;
import org.springblade.desk.common.service.IMesApprovalRecordService;
import org.springblade.desk.oem.pojo.entity.OemSettlementApprovalEntity;
import org.springblade.desk.oem.pojo.vo.OemSettlementApprovalDetailVO;
import org.springblade.desk.oem.service.IOemSettlementApprovalService;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 外协结算待办策略实现类
*/
@Service
public class OemStatementApprovalServiceImpl implements ApprovalRecordDetailStrategy<Map<String, Object>> {
@Resource
private IMesApprovalRecordService mesApprovalRecordService;
@Resource
private IMesApprovalFlowService mesApprovalFlowService;
@Resource
private IOemSettlementApprovalService oemSettlementApprovalService;
@Override
public String getBizType() {
return MesApprovalRecordBizTypeEnum.OEM_STATEMENT.getDesc();
}
@Override
public Map<String, Object> getDetail(Long bizId) {
List<OemSettlementApprovalDetailVO> oc = oemSettlementApprovalService.getApprovalDetailList(bizId, true);
List<OemSettlementApprovalDetailVO> ocCategory = oemSettlementApprovalService.getApprovalDetailList(bizId, false);
Map<String, Object> resultMap = new HashMap<>();
resultMap.put("oc", oc);
resultMap.put("ocCategory", ocCategory);
return resultMap;
}
@Override
public void createApproval(Long bizId) {
// 创建待办
MesApprovalRecordEntity approvalRecord = new MesApprovalRecordEntity();
approvalRecord.setBizId(bizId);
approvalRecord.setBizType(getBizType());
approvalRecord.setContent(getBizType());
mesApprovalRecordService.save(approvalRecord);
// 创建审批流程
OemSettlementApprovalEntity oemSettlementApproval = oemSettlementApprovalService.getById(bizId);
List<MesApprovalFlowEntity> flowList = new ArrayList<>();
flowList.add(new MesApprovalFlowEntity(oemSettlementApproval.getId(), getBizType(), "提交", 1, 2, oemSettlementApproval.getCreateUser(), oemSettlementApproval.getCreateTime(), 3));
flowList.add(new MesApprovalFlowEntity(oemSettlementApproval.getId(), getBizType(), "一级校对", 2, 3, null, null, 2));
flowList.add(new MesApprovalFlowEntity(oemSettlementApproval.getId(), getBizType(), "二级校对", 3, 4, null, null, 1));
flowList.add(new MesApprovalFlowEntity(oemSettlementApproval.getId(), getBizType(), "审核", 4, null, null, null, 1));
mesApprovalFlowService.saveBatch(flowList);
}
}

@ -2,15 +2,15 @@ package org.springblade.desk.oem.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springblade.common.cache.CacheNames;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.desk.common.enums.MesApprovalRecordBizTypeEnum;
import org.springblade.desk.common.feign.IMesNotifyMessageClient;
import org.springblade.desk.common.pojo.entity.MesNotifyMessageEntity;
import org.springblade.desk.common.service.IMesApprovalRecordService;
import org.springblade.desk.oem.mapper.OemSettlementApprovalMapper;
import org.springblade.desk.oem.pojo.entity.OemSettlementApprovalDetailEntity;
import org.springblade.desk.oem.pojo.entity.OemSettlementApprovalEntity;
@ -23,7 +23,6 @@ import org.springblade.desk.oem.service.IOemSettlementApprovalDetailService;
import org.springblade.desk.oem.service.IOemSettlementApprovalService;
import org.springblade.desk.oem.service.IOemStatementService;
import org.springframework.beans.BeanUtils;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@ -50,6 +49,9 @@ public class OemSettlementApprovalServiceImpl extends BaseServiceImpl<OemSettlem
@Resource
private IMesNotifyMessageClient mesNotifyMessageClient;
@Resource
private IMesApprovalRecordService mesApprovalRecordService;
@Override
public IPage<OemSettlementApprovalVO> selectApprovalPage(IPage<OemSettlementApprovalVO> page, SettlementApprovalQuery query) {
return page.setRecords(baseMapper.selectApprovalPage(page, query));
@ -63,12 +65,12 @@ public class OemSettlementApprovalServiceImpl extends BaseServiceImpl<OemSettlem
}
OemSettlementApprovalVO vo = new OemSettlementApprovalVO();
BeanUtils.copyProperties(entity, vo);
// 设置审批状态名称
if (entity.getApprovalStatus() != null) {
vo.setApprovalStatusName(OemSettlementApprovalEntity.ApprovalStatusEnum.getNameByCode(entity.getApprovalStatus()));
}
return vo;
}
@ -193,7 +195,7 @@ public class OemSettlementApprovalServiceImpl extends BaseServiceImpl<OemSettlem
* 处理校对流程
*/
private R handleProofreading(OemSettlementApprovalEntity approval, SettlementApprovalRequest request,
Long currentUserId, String currentUserName) {
Long currentUserId, String currentUserName) {
Integer approvalStatus = approval.getApprovalStatus();
// 校验:只有【待审批】或【校对中】状态可以进行校对
@ -226,11 +228,11 @@ public class OemSettlementApprovalServiceImpl extends BaseServiceImpl<OemSettlem
approval.setProofreader2Id(currentUserId);
approval.setProofreader2Name(currentUserName);
approval.setProofreadTime2(now);
// 校对人2通过后更新为【待审核】
if (request.getApprovalResult() == 1) {
// 5-待审核
approval.setApprovalStatus(OemSettlementApprovalEntity.ApprovalStatusEnum.WAITING_AUDIT.getCode());
approval.setApprovalStatus(OemSettlementApprovalEntity.ApprovalStatusEnum.WAITING_AUDIT.getCode());
// 送消息通知
sendNotificationToAuditLeader(approval);
} else {
@ -243,7 +245,8 @@ public class OemSettlementApprovalServiceImpl extends BaseServiceImpl<OemSettlem
// 保存审批记录
this.updateById(approval);
// 更新待办
mesApprovalRecordService.updateApproval(approval.getId(), MesApprovalRecordBizTypeEnum.OEM_STATEMENT.getDesc(), currentUserId, now);
return R.success();
}
@ -280,6 +283,8 @@ public class OemSettlementApprovalServiceImpl extends BaseServiceImpl<OemSettlem
// 更新所有关联结算单的状态为【待推送】
updateStatementsStatus(approval.getId(), OemStatementEntity.PENDING_PUSH_SETTLEMENT, null);
// 更新待办
mesApprovalRecordService.updateApproval(approval.getId(), MesApprovalRecordBizTypeEnum.OEM_STATEMENT.getDesc(), currentUserId, now);
return R.success();
} else {
// 审核不通过
@ -301,6 +306,8 @@ public class OemSettlementApprovalServiceImpl extends BaseServiceImpl<OemSettlem
// 更新所有关联结算单的状态为【结算异常】
updateStatementsStatus(approval.getId(), OemStatementEntity.ERR_SETTLEMENT, "MES结算审核不通过");
// 更新待办
mesApprovalRecordService.removeApproval(approval.getId(), MesApprovalRecordBizTypeEnum.OEM_STATEMENT.getDesc());
return R.success("审批已拒绝");
}
@ -308,8 +315,8 @@ public class OemSettlementApprovalServiceImpl extends BaseServiceImpl<OemSettlem
/**
* 更新结算单状态
*
* @param approvalId 审批ID
* @param newStatus 新状态
* @param approvalId 审批ID
* @param newStatus 新状态
* @param abnormalReason 异常原因可选
*/
private void updateStatementsStatus(Long approvalId, Integer newStatus, String abnormalReason) {
@ -340,48 +347,48 @@ public class OemSettlementApprovalServiceImpl extends BaseServiceImpl<OemSettlem
/**
* 发送通知给外协结算审核领导
*/
private void sendNotificationToAuditLeader(OemSettlementApprovalEntity approval) {
private void sendNotificationToAuditLeader(OemSettlementApprovalEntity approval) {
try {
Long auditLeaderRoleId = 2054852195869057026L;
String roleName = "外协结算审核领导";
// 构建通知消息
String title = String.format("外协结算审批提醒 - %s",
approval.getApprovalNo());
approval.getApprovalNo());
String content = String.format(
"外协结算审批详情:\n" +
"- 审批单号:%s\n" +
"- 结算总批数:%d\n" +
"- 结算总面积:%.2f dm²\n" +
"- 结算总金额:%.2f 元\n" +
"- 提交时间:%s\n" +
"- 状态:已完成两次校对,等待审核",
approval.getApprovalNo(),
approval.getTotalCount() != null ? approval.getTotalCount() : 0,
approval.getTotalArea() != null ? approval.getTotalArea() : BigDecimal.ZERO,
approval.getTotalAmount() != null ? approval.getTotalAmount() : BigDecimal.ZERO,
approval.getSubmitTime()
"外协结算审批详情:\n" +
"- 审批单号:%s\n" +
"- 结算总批数:%d\n" +
"- 结算总面积:%.2f dm²\n" +
"- 结算总金额:%.2f 元\n" +
"- 提交时间:%s\n" +
"- 状态:已完成两次校对,等待审核",
approval.getApprovalNo(),
approval.getTotalCount() != null ? approval.getTotalCount() : 0,
approval.getTotalArea() != null ? approval.getTotalArea() : BigDecimal.ZERO,
approval.getTotalAmount() != null ? approval.getTotalAmount() : BigDecimal.ZERO,
approval.getSubmitTime()
);
// 创建通知消息实体
MesNotifyMessageEntity notifyMessage = MesNotifyMessageEntity.builder()
.title(title)
.content(content)
.receiveRoleId(auditLeaderRoleId)
.receiveRoleName(roleName)
.receiveUserId(AuthUtil.getUserId())
.build();
.title(title)
.content(content)
.receiveRoleId(auditLeaderRoleId)
.receiveRoleName(roleName)
.receiveUserId(AuthUtil.getUserId())
.build();
// 通知失败不影响主流程
// 调用Feign客户端保存通知消息
R result = mesNotifyMessageClient.save(notifyMessage);
if (result != null && result.isSuccess()) {
log.info("成功发送外协结算审批提醒,审批单号: {}, 校对人: {}",
approval.getApprovalNo(), AuthUtil.getUserName());
approval.getApprovalNo(), AuthUtil.getUserName());
} else {
log.error("发送外协结算审批提醒失败,审批单号: {}, 错误信息: {}",
approval.getApprovalNo(), result != null ? result.getMsg() : "返回结果为空");
approval.getApprovalNo(), result != null ? result.getMsg() : "返回结果为空");
}
} catch (Exception e) {

@ -15,12 +15,16 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.mp.support.Query;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
import org.springblade.core.tool.utils.Func;
import org.springblade.desk.common.enums.MesApprovalRecordBizTypeEnum;
import org.springblade.desk.common.factory.MesApprovalDetailFactory;
import org.springblade.desk.common.feign.IMesNotifyMessageClient;
import org.springblade.desk.common.pojo.entity.MesApprovalRecordEntity;
import org.springblade.desk.common.pojo.entity.MesNotifyMessageEntity;
import org.springblade.desk.common.service.ApprovalRecordDetailStrategy;
import org.springblade.desk.common.service.IMesApprovalRecordService;
import org.springblade.desk.oem.mapper.OemStatementMapper;
import org.springblade.desk.oem.mapper.PlatingTypeRulesMapper;
import org.springblade.desk.oem.pojo.entity.*;
@ -95,6 +99,12 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
@Resource
private IErpOemSettlementClient erpOemSettlementClient;
@Resource
private IMesApprovalRecordService mesApprovalRecordService;
@Resource
private MesApprovalDetailFactory mesApprovalDetailFactory;
public static final String DEPT_CODE_REWORK = "3400";
public static final String MANUAL_AUTO = "0";
public static final String MANUAL_HAND = "1";
@ -582,21 +592,15 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
* */
if (3 == oemSettleAccountsApproval.getApprovalStatus()) {
//审核通过
updateWrapper.set("ros_status", OemStatementEntity.PENDING_PUSH_SETTLEMENT)
.set("memo", "外协结算完成")
.in("id", ids);
updateWrapper.set("ros_status", OemStatementEntity.PENDING_PUSH_SETTLEMENT).set("memo", "外协结算完成").in("id", ids);
} else {
//审核不通过:(1)原因为不需要结算的更新为【无需结算】(2)原因是基础数据有误的更新为【结算异常】
if (1 == oemSettleAccountsApproval.getReason()) {
updateWrapper.set("ros_status", OemStatementEntity.ERR_SETTLEMENT)
.set("memo", "无需结算").set("total_price", null).set("unit_price", null)
.set("quotation", "")
updateWrapper.set("ros_status", OemStatementEntity.ERR_SETTLEMENT).set("memo", "无需结算").set("total_price", null).set("unit_price", null).set("quotation", "")
.in("id", ids);
} else {
updateWrapper.set("ros_status", OemStatementEntity.ERR_SETTLEMENT)
.set("memo", "基础数据有误")
.in("id", ids);
updateWrapper.set("ros_status", OemStatementEntity.ERR_SETTLEMENT).set("memo", "基础数据有误").in("id", ids);
}
}
@ -606,22 +610,20 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
@Override
public R notNeedSettlement(List<StatementVO> list) {
if (null != list && list.size() > 0) {
List<OemStatementEntity> saves = list.stream()
.map(statementVO -> {
OemStatementEntity entity = new OemStatementEntity();
BeanUtils.copyProperties(statementVO, entity);
entity.setRosStatus(OemStatementEntity.ERR_SETTLEMENT);
entity.setMemo("无需结算");
entity.setTotalPrice(null);
entity.setUnitPrice(null);
entity.setQuotation("");
entity.setUpdateTime(new Date());
List<OemStatementEntity> saves = list.stream().map(statementVO -> {
OemStatementEntity entity = new OemStatementEntity();
BeanUtils.copyProperties(statementVO, entity);
entity.setRosStatus(OemStatementEntity.ERR_SETTLEMENT);
entity.setMemo("无需结算");
entity.setTotalPrice(null);
entity.setUnitPrice(null);
entity.setQuotation("");
entity.setUpdateTime(new Date());
entity.setSettleTime(new Date());
entity.setSettleTime(new Date());
return entity;
})
.collect(Collectors.toList());
return entity;
}).collect(Collectors.toList());
// baseMapper.insertOrUpdate(saves);
// 逐条处理
@ -632,14 +634,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
} else {
// 更新,使用UpdateWrapper确保null值被更新
LambdaUpdateWrapper<OemStatementEntity> wrapper = Wrappers.lambdaUpdate();
wrapper.set(OemStatementEntity::getTotalPrice, entity.getTotalPrice())
.set(OemStatementEntity::getUnitPrice, entity.getUnitPrice())
.set(OemStatementEntity::getQuotation, entity.getQuotation())
.set(OemStatementEntity::getRosStatus, entity.getRosStatus())
.set(OemStatementEntity::getMemo, entity.getMemo())
.set(OemStatementEntity::getUpdateTime, entity.getUpdateTime())
.set(OemStatementEntity::getSettleTime, entity.getSettleTime())
.eq(OemStatementEntity::getId, entity.getId());
wrapper.set(OemStatementEntity::getTotalPrice, entity.getTotalPrice()).set(OemStatementEntity::getUnitPrice, entity.getUnitPrice()).set(OemStatementEntity::getQuotation, entity.getQuotation()).set(OemStatementEntity::getRosStatus, entity.getRosStatus()).set(OemStatementEntity::getMemo, entity.getMemo()).set(OemStatementEntity::getUpdateTime, entity.getUpdateTime()).set(OemStatementEntity::getSettleTime, entity.getSettleTime()).eq(OemStatementEntity::getId, entity.getId());
baseMapper.update(null, wrapper);
}
@ -1218,6 +1213,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
}
@Override
@Transactional
public R generateSettlement() {
List<OemStatementEntity> saves = new ArrayList<>();
// 查询未生成的结算数据
@ -1244,7 +1240,11 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
// 记录结算日志
oemStatementTaskLogService.saveMaxPutStoreTime(maxPutStoreTimeDate);
// 记录结算数据
return R.status(this.saveOrUpdateBatch(saves));
this.saveOrUpdateBatch(saves);
for (OemStatementEntity save : saves) {
}
return R.success();
}
/**
@ -1255,9 +1255,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
private List<StatementVO> selectUnsettled(StatementQuery query) {
Date lastMaxPutStoreTime = oemStatementTaskLogService.getLastMaxPutStoreTime();
if (lastMaxPutStoreTime != null) {
query.setPostPlatingStorageTimeStart(lastMaxPutStoreTime.toInstant()
.atZone(ZoneId.systemDefault())
.toLocalDate());
query.setPostPlatingStorageTimeStart(lastMaxPutStoreTime.toInstant().atZone(ZoneId.systemDefault()).toLocalDate());
}
return baseMapper.selectUnsettled(query);
}
@ -1272,12 +1270,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
R<List<Dict>> RProcessCapabilityType = dictClient.getList("ProcessCapabilityType");
if (RProcessCapabilityType.isSuccess()) {
List<Dict> dictList = RProcessCapabilityType.getData();
dictMap = dictList.stream()
.collect(Collectors.toMap(
Dict::getDictKey,
Dict::getDictValue,
(oldVal, newVal) -> oldVal
));
dictMap = dictList.stream().collect(Collectors.toMap(Dict::getDictKey, Dict::getDictValue, (oldVal, newVal) -> oldVal));
}
return dictMap;
}
@ -1289,34 +1282,25 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
*/
private List<StatementVO> duplicatePutStore(List<StatementVO> statementVOS, List<OemStatementEntity> saves) {
// 校验车间订单工序是否存在结算数据
List<Long> woIds = statementVOS.stream()
.filter(vo -> vo.getId() != null)
.map(StatementVO::getWoId)
.filter(woId -> woId != null)
.collect(Collectors.toList());
List<Long> woIds = statementVOS.stream().filter(vo -> vo.getId() != null).map(StatementVO::getWoId).filter(woId -> woId != null).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(woIds)) {
// 查询存在已结算数据的订单
List<Long> settledWoIds = baseMapper.selectSettledWoIds(woIds);
// 存在已结算数据的订单跳过,不存在已结算数据的订单标记为重复镀后入库
statementVOS = statementVOS.stream()
.filter(vo -> {
boolean needRemove = vo.getId() != null
&& vo.getWoId() != null
&& settledWoIds.contains(vo.getWoId());
return !needRemove;
})
.map(vo -> {
if (vo.getId() != null) {
OemStatementEntity entity = new OemStatementEntity();
entity.setId(vo.getId());
entity.setRosStatus(OemStatementEntity.ERR_SETTLEMENT);
entity.setMemo("重复镀后入库");
saves.add(entity);
vo.setId(null); // 清空ID
}
return vo;
})
.collect(Collectors.toList());
statementVOS = statementVOS.stream().filter(vo -> {
boolean needRemove = vo.getId() != null && vo.getWoId() != null && settledWoIds.contains(vo.getWoId());
return !needRemove;
}).map(vo -> {
if (vo.getId() != null) {
OemStatementEntity entity = new OemStatementEntity();
entity.setId(vo.getId());
entity.setRosStatus(OemStatementEntity.ERR_SETTLEMENT);
entity.setMemo("重复镀后入库");
saves.add(entity);
vo.setId(null); // 清空ID
}
return vo;
}).collect(Collectors.toList());
}
return statementVOS;
}
@ -1400,7 +1384,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
for (Map.Entry<String, List<StatementVO>> entry : groupByPsName.entrySet()) {
String psName = entry.getKey();
List<OemStandardProcessEntity> standardProcessList = standardMap.getOrDefault(psName, Collections.emptyList());
if(CollectionUtils.isEmpty(standardProcessList)){
if (CollectionUtils.isEmpty(standardProcessList)) {
continue;
}
for (StatementVO statementVO : entry.getValue()) {
@ -1591,92 +1575,17 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
return listR.getData();
}
return Collections.emptyList();
//假数据测试用
// //假数据测试用
// List<PriceSheetVO> priceSheetAllList = new ArrayList<>();
// PriceSheetVO priceSheet1 = new PriceSheetVO();
// priceSheet1.setPrice("60");
// priceSheet1.setSplycode("wx000001");
// priceSheet1.setSplyname(oemName);
// priceSheet1.setPrtum("件");
// priceSheet1.setWono("110");
// priceSheet1.setSeqid("GXJG-20250228018");
// priceSheet1.setGxinfo("光亮腐蚀");
// priceSheet1.setStartdat("2026-01-15");
// priceSheet1.setValiddat("2026-12-31");
// priceSheet1.setStairflag("1");
// priceSheet1.setCoating_desc("涂色标");
// priceSheet1.setPrtlotno("JHT");
// priceSheetAllList.add(priceSheet1);
// PriceSheetVO priceSheet2 = new PriceSheetVO();
// priceSheet2.setPrice("120");
// priceSheet2.setSplycode("wx000001");
// priceSheet2.setSplyname(oemName);
// priceSheet2.setPrtum("件");
// priceSheet2.setWono("110");
// priceSheet2.setSeqid("GXJG-20250228018");
// priceSheet2.setGxinfo("光亮腐蚀");
// priceSheet2.setStartdat("2026-01-15");
// priceSheet2.setValiddat("2026-12-31");
// priceSheet2.setStairflag("1");
// priceSheet2.setCoating_desc("涂色带");
// priceSheet2.setPrtlotno("JHT");
// priceSheetAllList.add(priceSheet2);
// PriceSheetVO priceSheet3 = new PriceSheetVO();
// priceSheet3.setPrice("180");
// priceSheet3.setSplycode("wx000001");
// priceSheet3.setSplyname(oemName);
// priceSheet3.setPrtum("件");
// priceSheet3.setWono("110");
// priceSheet3.setSeqid("GXJG-20250228018");
// priceSheet3.setGxinfo("光亮腐蚀");
// priceSheet3.setStartdat("2026-01-15");
// priceSheet3.setValiddat("2026-12-31");
// priceSheet3.setStairflag("1");
// priceSheet3.setCoating_desc("涂箭头");
// priceSheet3.setPrtlotno("JHT");
// priceSheetAllList.add(priceSheet3);
// PriceSheetVO priceSheet4 = new PriceSheetVO();
// priceSheet4.setPrice("60");
// priceSheet4.setSplycode("wx000001");
// priceSheet4.setSplyname(oemName);
// priceSheet4.setPrtum("件");
// priceSheet4.setWono("320");
// priceSheet4.setSeqid("GXJG-20250228018");
// priceSheet4.setGxinfo("热处理铜合金电镀低应力镍");
// priceSheet4.setStartdat("2026-01-15");
// priceSheet4.setValiddat("2026-12-31");
// priceSheet4.setStairflag("1");
// priceSheet4.setCoating_desc("涂色标");
// priceSheet4.setPrtlotno("JHT");
// priceSheetAllList.add(priceSheet4);
// PriceSheetVO priceSheet5 = new PriceSheetVO();
// priceSheet5.setPrice("60");
// priceSheet5.setSplycode("wx000001");
// priceSheet5.setSplyname(oemName);
// priceSheet5.setPrtum("件");
// priceSheet5.setWono("320");
// priceSheet5.setSeqid("GXJG-20250228018");
// priceSheet5.setGxinfo("热处理铜合金电镀低应力镍");
// priceSheet5.setStartdat("2026-01-15");
// priceSheet5.setValiddat("2026-12-31");
// priceSheet5.setStairflag("1");
// priceSheet5.setCoating_desc("涂色带");
// priceSheet5.setPrtlotno("JHT");
// priceSheetAllList.add(priceSheet5);
// PriceSheetVO priceSheet6 = new PriceSheetVO();
// priceSheet6.setPrice("60");
// priceSheet6.setSplycode("wx000001");
// priceSheet6.setSplyname(oemName);
// priceSheet6.setPrtum("件");
// priceSheet6.setWono("320");
// priceSheet6.setSeqid("GXJG-20250228018");
// priceSheet6.setGxinfo("热处理铜合金电镀低应力镍");
// priceSheet6.setStartdat("2026-01-15");
// priceSheet6.setValiddat("2026-12-31");
// priceSheet6.setStairflag("1");
// priceSheet6.setCoating_desc("涂箭头");
// priceSheet6.setPrtlotno("JHT");
// priceSheetAllList.add(priceSheet6);
// PriceSheetVO sheet = new PriceSheetVO();
// sheet.setStairflag("1");
// sheet.setSplycode("Y523");
// sheet.setGxinfo("化学钝化");
// sheet.setPrtno("21E8-004-30450-H1");
// sheet.setPrice("100");
// sheet.setStartdat("2026-01-01 00:00:00");
// sheet.setValiddat("2026-12-31 00:00:00");
// priceSheetAllList.add(sheet);
// return priceSheetAllList;
}
@ -2045,9 +1954,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
quotationSb.append(tjtPriceSheetList.get(0).getSeqid()).append("、");
prtum = tjtPriceSheetList.get(0).getPrtum();
}
String quotation = quotationSb.length() > 0
? quotationSb.substring(0, quotationSb.length() - 1)
: "";
String quotation = quotationSb.length() > 0 ? quotationSb.substring(0, quotationSb.length() - 1) : "";
statementVO.setRosStatus(StatementVO.IN_SETTLEMENT);
statementVO.setMemo("结算中");
statementVO.setSettleTime(new Date());
@ -2118,11 +2025,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
if (list == null || list.isEmpty()) {
return null;
}
return list.stream()
.map(StatementVO::getPutStoreTime)
.filter(Objects::nonNull)
.max(Date::compareTo)
.orElse(null);
return list.stream().map(StatementVO::getPutStoreTime).filter(Objects::nonNull).max(Date::compareTo).orElse(null);
}
@Override
@ -2131,11 +2034,9 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
page.setSize(999);
List<StatementVO> statementVOS = baseMapper.selectOemStatementPage(page, mesOemStatement);
statementVOS = statementVOS.stream().filter(vo -> {
String memo = vo.getMemo();
return !"无需结算".equals(memo)
&& !"重复镀后入库".equals(memo);
})
.collect(Collectors.toList());
String memo = vo.getMemo();
return !"无需结算".equals(memo) && !"重复镀后入库".equals(memo);
}).collect(Collectors.toList());
List<OemStatementEntity> saves = new ArrayList<>();
BigDecimal price = BigDecimal.ZERO;
if (mesOemStatement.getPrice() != null) {
@ -2152,7 +2053,9 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
if (CollectionUtils.isEmpty(saves)) {
return R.fail("没有需要结算的数据");
}
return R.status(this.saveOrUpdateBatch(saves));
// 记录结算数据
this.saveOrUpdateBatch(saves);
return R.success();
}
@Override
@ -2161,11 +2064,9 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
page.setSize(999);
List<StatementVO> statementVOS = baseMapper.selectOemStatementPage(page, mesOemStatement);
statementVOS = statementVOS.stream().filter(vo -> {
String memo = vo.getMemo();
return !"无需结算".equals(memo)
&& !"重复镀后入库".equals(memo);
})
.collect(Collectors.toList());
String memo = vo.getMemo();
return !"无需结算".equals(memo) && !"重复镀后入库".equals(memo);
}).collect(Collectors.toList());
BigDecimal price = BigDecimal.ZERO;
if (mesOemStatement.getPrice() != null) {
price = mesOemStatement.getPrice();
@ -2196,14 +2097,11 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
}
// 2. 过滤掉异常原因为"无需结算、重复镀后入库"的数据
List<StatementVO> needMatchList = errorStatements.stream()
.filter(vo -> {
String memo = vo.getMemo();
// 排除"无需结算"和"重复镀后入库"
return !StrUtil.contains(memo, "无需结算")
&& !StrUtil.contains(memo, "重复镀后入库");
})
.collect(Collectors.toList());
List<StatementVO> needMatchList = errorStatements.stream().filter(vo -> {
String memo = vo.getMemo();
// 排除"无需结算"和"重复镀后入库"
return !StrUtil.contains(memo, "无需结算") && !StrUtil.contains(memo, "重复镀后入库");
}).collect(Collectors.toList());
if (CollectionUtils.isEmpty(needMatchList)) {
return R.success("没有需要匹配标准工序代码的数据");
@ -2222,8 +2120,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
entity.setStandardProcessCode(vo.getStandardProcessCode());
entity.setUpdateTime(new Date());
return entity;
})
.collect(Collectors.toList());
}).collect(Collectors.toList());
if (!CollectionUtils.isEmpty(updateList)) {
this.updateBatchById(updateList);
@ -2309,7 +2206,8 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
return R.fail("没有需要结算的记录");
}
// 记录结算数据
return R.status(this.saveOrUpdateBatch(saves));
this.saveOrUpdateBatch(saves);
return R.success();
}
@Override
@ -2385,12 +2283,8 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
// 计算汇总数据
int totalCount = statements.size();
BigDecimal totalArea = statements.stream()
.map(s -> s.getTotalArea() != null ? s.getTotalArea() : BigDecimal.ZERO)
.reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal totalAmount = statements.stream()
.map(s -> s.getTotalPrice() != null ? s.getTotalPrice() : BigDecimal.ZERO)
.reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal totalArea = statements.stream().map(s -> s.getTotalArea() != null ? s.getTotalArea() : BigDecimal.ZERO).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal totalAmount = statements.stream().map(s -> s.getTotalPrice() != null ? s.getTotalPrice() : BigDecimal.ZERO).reduce(BigDecimal.ZERO, BigDecimal::add);
// 审批主表记录
@ -2427,6 +2321,8 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
// 发送消息通知给“外协结算校对员”角色的用户
sendNotificationToProofreaders(approval);
ApprovalRecordDetailStrategy strategy = mesApprovalDetailFactory.getStrategy(MesApprovalRecordBizTypeEnum.OEM_STATEMENT.getDesc());
strategy.createApproval(approval.getId());
return R.success();
}
@ -2436,9 +2332,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
*/
private void generateApprovalDetails(Long approvalId, List<OemStatementEntity> statements) {
// 1. 按厂家ID和结算大类ID分组
Map<String, List<OemStatementEntity>> groupedMap = statements.stream()
.filter(s -> s.getOcId() != null && s.getStatementCategoryId() != null)
.collect(Collectors.groupingBy(s -> s.getOcId() + "_" + s.getStatementCategoryId()));
Map<String, List<OemStatementEntity>> groupedMap = statements.stream().filter(s -> s.getOcId() != null && s.getStatementCategoryId() != null).collect(Collectors.groupingBy(s -> s.getOcId() + "_" + s.getStatementCategoryId()));
if (groupedMap.isEmpty()) {
throw new RuntimeException("没有符合条件的结算单生成分组明细,缺少外协厂家或结算大类数据");
@ -2475,12 +2369,8 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
// 计算分组的统计数据
int batchCount = groupStatements.size();
BigDecimal groupTotalArea = groupStatements.stream()
.map(s -> s.getTotalArea() != null ? s.getTotalArea() : BigDecimal.ZERO)
.reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal groupTotalAmount = groupStatements.stream()
.map(s -> s.getTotalPrice() != null ? s.getTotalPrice() : BigDecimal.ZERO)
.reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal groupTotalArea = groupStatements.stream().map(s -> s.getTotalArea() != null ? s.getTotalArea() : BigDecimal.ZERO).reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal groupTotalAmount = groupStatements.stream().map(s -> s.getTotalPrice() != null ? s.getTotalPrice() : BigDecimal.ZERO).reduce(BigDecimal.ZERO, BigDecimal::add);
// 计算占比(按结算大类汇总,不按厂家)
BigDecimal totalAreaByCategory = categoryAreaMap.getOrDefault(categoryId, BigDecimal.ZERO);
@ -2490,13 +2380,11 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
BigDecimal amountRatio = BigDecimal.ZERO;
if (totalAreaByCategory.compareTo(BigDecimal.ZERO) > 0) {
areaRatio = groupTotalArea.divide(totalAreaByCategory, 4, RoundingMode.HALF_UP)
.multiply(new BigDecimal("100"));
areaRatio = groupTotalArea.divide(totalAreaByCategory, 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100"));
}
if (totalAmountByCategory.compareTo(BigDecimal.ZERO) > 0) {
amountRatio = groupTotalAmount.divide(totalAmountByCategory, 4, RoundingMode.HALF_UP)
.multiply(new BigDecimal("100"));
amountRatio = groupTotalAmount.divide(totalAmountByCategory, 4, RoundingMode.HALF_UP).multiply(new BigDecimal("100"));
}
// 创建明细记录
@ -2546,32 +2434,12 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
String roleName = "外协结算校对员";
// 构建通知消息
String title = String.format("外协结算审批提醒 - %s",
approval.getApprovalNo());
String content = String.format(
"外协结算审批详情:\n" +
"- 审批单号:%s\n" +
"- 结算总批数:%d\n" +
"- 结算总面积:%.2f dm²\n" +
"- 结算总金额:%.2f 元\n" +
"- 提交时间:%s\n" +
"- 状态:待校对,请进行校对",
approval.getApprovalNo(),
approval.getTotalCount() != null ? approval.getTotalCount() : 0,
approval.getTotalArea() != null ? approval.getTotalArea() : BigDecimal.ZERO,
approval.getTotalAmount() != null ? approval.getTotalAmount() : BigDecimal.ZERO,
approval.getSubmitTime()
);
String title = String.format("外协结算审批提醒 - %s", approval.getApprovalNo());
String content = String.format("外协结算审批详情:\n" + "- 审批单号:%s\n" + "- 结算总批数:%d\n" + "- 结算总面积:%.2f dm²\n" + "- 结算总金额:%.2f 元\n" + "- 提交时间:%s\n" + "- 状态:待校对,请进行校对", approval.getApprovalNo(), approval.getTotalCount() != null ? approval.getTotalCount() : 0, approval.getTotalArea() != null ? approval.getTotalArea() : BigDecimal.ZERO, approval.getTotalAmount() != null ? approval.getTotalAmount() : BigDecimal.ZERO, approval.getSubmitTime());
// 创建通知消息实体
MesNotifyMessageEntity notifyMessage = MesNotifyMessageEntity.builder()
.title(title)
.content(content)
.receiveRoleId(proofreaderRoleId)
.receiveRoleName(roleName)
.receiveUserId(AuthUtil.getUserId())
.build();
MesNotifyMessageEntity notifyMessage = MesNotifyMessageEntity.builder().title(title).content(content).receiveRoleId(proofreaderRoleId).receiveRoleName(roleName).receiveUserId(AuthUtil.getUserId()).build();
// 调用Feign客户端保存通知消息
R result = mesNotifyMessageClient.save(notifyMessage);
@ -2627,8 +2495,7 @@ public class OemStatementServiceImpl extends BaseServiceImpl<OemStatementMapper,
log.info("推送成功,ID: {}, 车间订单号: {}", statement.getId(), statement.getWoCode());
} else {
failCount++;
String errorMsg = String.format("ID:%s, 错误:%s", statement.getId(),
result != null ? result.getMsg() : "未知错误");
String errorMsg = String.format("ID:%s, 错误:%s", statement.getId(), result != null ? result.getMsg() : "未知错误");
errorMessages.add(errorMsg);
log.error("推送失败,{}", errorMsg);
}

Loading…
Cancel
Save