外协结算-我的待办

liweidong
maxiangong 6 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. 65
      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.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 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.Operation;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.AllArgsConstructor; 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.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R; import org.springblade.core.tool.api.R;
import org.springblade.desk.common.pojo.entity.MesApprovalRecordEntity; 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.MyHistoryMesApprovalRecordVO;
import org.springblade.desk.common.pojo.vo.MyMesApprovalRecordVO; import org.springblade.desk.common.pojo.vo.MyMesApprovalRecordVO;
import org.springblade.desk.common.service.IMesApprovalRecordService; 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.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; 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); IPage<MyHistoryMesApprovalRecordVO> pages = mesApprovalRecordService.selectMyHistoryMesApprovalRecordPage(Condition.getPage(query), mesApprovalRecord);
return R.data(pages); 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 com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springblade.core.mp.base.BaseService; import org.springblade.core.mp.base.BaseService;
import org.springblade.desk.common.pojo.entity.MesApprovalRecordEntity; 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.MyHistoryMesApprovalRecordVO;
import org.springblade.desk.common.pojo.vo.MyMesApprovalRecordVO; 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 * @since 2026-02-26
*/ */
public interface IMesApprovalRecordService extends BaseService<MesApprovalRecordEntity> { public interface IMesApprovalRecordService extends BaseService<MesApprovalRecordEntity> {
/** /**
* 自定义分页 * 自定义分页
* *
* @param page 分页参数 * @param page 分页参数
* @param mesApprovalRecord 查询参数 * @param mesApprovalRecord 查询参数
* @return IPage<MyMesApprovalRecordVO> * @return IPage<MyMesApprovalRecordVO>
*/ */
IPage<MyMesApprovalRecordVO> selectMyMesApprovalRecordPage(Page<MesApprovalRecordEntity> page, MyMesApprovalRecordVO mesApprovalRecord); 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 bizId
* @param mesApprovalRecord 查询参数 * @param bizType
* @return IPage<MyHistoryMesApprovalRecordVO> * @param approvalUser
*/ * @param approvalTime
IPage<MyHistoryMesApprovalRecordVO> selectMyHistoryMesApprovalRecordPage(IPage<MyHistoryMesApprovalRecordVO> page, MyHistoryMesApprovalRecordVO mesApprovalRecord); */
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.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 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.mp.base.BaseServiceImpl;
import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.desk.common.constant.ApprovalStatusConstant; 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.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.MesApprovalRecordEntity;
import org.springblade.desk.common.pojo.entity.MesNotifyMessageEntity; import org.springblade.desk.common.pojo.vo.MesApprovalFlowVO;
import org.springblade.desk.common.pojo.vo.MesNotifyMessageVO; import org.springblade.desk.common.pojo.vo.MesApprovalRecordDetailVO;
import org.springblade.desk.common.pojo.vo.MyHistoryMesApprovalRecordVO; import org.springblade.desk.common.pojo.vo.MyHistoryMesApprovalRecordVO;
import org.springblade.desk.common.pojo.vo.MyMesApprovalRecordVO; 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.desk.common.service.IMesApprovalRecordService;
import org.springblade.system.cache.UserCache; import org.springblade.system.cache.UserCache;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.*;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -59,63 +60,160 @@ import java.util.stream.Collectors;
@Service @Service
public class MesApprovalRecordServiceImpl extends BaseServiceImpl<MesApprovalRecordMapper, MesApprovalRecordEntity> implements IMesApprovalRecordService { public class MesApprovalRecordServiceImpl extends BaseServiceImpl<MesApprovalRecordMapper, MesApprovalRecordEntity> implements IMesApprovalRecordService {
@Override @Resource
public IPage<MyMesApprovalRecordVO> selectMyMesApprovalRecordPage(Page<MesApprovalRecordEntity> page, MyMesApprovalRecordVO mesApprovalRecord) { private MesApprovalDetailFactory mesApprovalDetailFactory;
Page<MesApprovalRecordEntity> mesNotifyMessageVOPage = this.page(page, new LambdaQueryWrapper<MesApprovalRecordEntity>() @Resource
.eq(StrUtil.isNotEmpty(mesApprovalRecord.getBizType()), MesApprovalRecordEntity::getBizType, mesApprovalRecord.getBizType()) private IMesApprovalFlowService approvalFlowService;
.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 @Override
public IPage<MyHistoryMesApprovalRecordVO> selectMyHistoryMesApprovalRecordPage(IPage<MyHistoryMesApprovalRecordVO> page, MyHistoryMesApprovalRecordVO mesApprovalRecord) { public IPage<MyMesApprovalRecordVO> selectMyMesApprovalRecordPage(Page<MesApprovalRecordEntity> page, MyMesApprovalRecordVO mesApprovalRecord) {
List<MesApprovalRecordEntity> myHistoryMesApprovalRecordVOList = baseMapper.selectMyHistoryMesApprovalRecordPage(page, mesApprovalRecord); Page<MesApprovalRecordEntity> mesNotifyMessageVOPage = this.page(page, new LambdaQueryWrapper<MesApprovalRecordEntity>()
// 提取所有的业务ID .eq(StrUtil.isNotEmpty(mesApprovalRecord.getBizType()), MesApprovalRecordEntity::getBizType, mesApprovalRecord.getBizType())
List<Long> bizIdList = myHistoryMesApprovalRecordVOList.stream().map(MesApprovalRecordEntity::getBizId).toList(); .eq(mesApprovalRecord.getStatus() != null, MesApprovalRecordEntity::getStatus, mesApprovalRecord.getStatus())
// 提取所有的业务类型 .like(StrUtil.isNotEmpty(mesApprovalRecord.getContent()), MesApprovalRecordEntity::getContent, mesApprovalRecord.getContent())
List<String> bizTypeList = myHistoryMesApprovalRecordVOList.stream().map(MesApprovalRecordEntity::getBizType).toList(); .orderByDesc(MesApprovalRecordEntity::getCreateTime));
// 根据业务ID和业务类型查询所有的审批记录 Page<MyMesApprovalRecordVO> page1 = new Page<>();
if (!myHistoryMesApprovalRecordVOList.isEmpty()){ if (!mesNotifyMessageVOPage.getRecords().isEmpty()) {
List<MesApprovalRecordEntity> list = this.list(new LambdaQueryWrapper<MesApprovalRecordEntity>() List<MyMesApprovalRecordVO> recordVOList = new ArrayList<>();
.in(MesApprovalRecordEntity::getBizId, bizIdList) mesNotifyMessageVOPage.getRecords().forEach(entity -> {
.in(MesApprovalRecordEntity::getBizType, bizTypeList) MyMesApprovalRecordVO recordVO = new MyMesApprovalRecordVO();
.orderByDesc(MesApprovalRecordEntity::getCreateTime)); BeanUtils.copyProperties(entity, recordVO);
Map<String, List<MesApprovalRecordEntity>> recordMap = list.stream() recordVO.setCreateUserName(AuthUtil.getUserName());
.collect(Collectors.groupingBy( recordVOList.add(recordVO);
entity -> entity.getBizId().toString() + "_" + entity.getBizType() });
)); page1.setRecords(recordVOList);
// 拼接查询数据,无需多次查询 page1.setTotal(page.getTotal());
List<MyHistoryMesApprovalRecordVO> recordVOList = new ArrayList<>(); page1.setSize(page.getSize());
myHistoryMesApprovalRecordVOList.forEach(entity -> { page1.setCurrent(page.getCurrent());
MyHistoryMesApprovalRecordVO recordVO = new MyHistoryMesApprovalRecordVO(); return page1;
BeanUtils.copyProperties(entity, recordVO); }
String key = entity.getBizId().toString() + "_" + entity.getBizType(); return page1;
MesApprovalRecordEntity currentRecord = recordMap.get(key).get(recordMap.get(key).size() - 1); }
MesApprovalRecordEntity firstRecord = recordMap.get(key).get(0);
recordVO.setCurrentNodeName(AuthUtil.getUserRole() + "审批"); @Override
recordVO.setCurrentFlowNodeName(currentRecord.getCurrentRoleName() + "已审批"); public IPage<MyHistoryMesApprovalRecordVO> selectMyHistoryMesApprovalRecordPage(IPage<MyHistoryMesApprovalRecordVO> page, MyHistoryMesApprovalRecordVO mesApprovalRecord) {
recordVO.setStartUserName(UserCache.getUser(firstRecord.getCreateUser()).getName()); List<MesApprovalRecordEntity> myHistoryMesApprovalRecordVOList = baseMapper.selectMyHistoryMesApprovalRecordPage(page, mesApprovalRecord);
recordVO.setEndStatus(currentRecord.getStatus().equals(ApprovalStatusConstant.PASS)); // 提取所有的业务ID
recordVOList.add(recordVO); List<Long> bizIdList = myHistoryMesApprovalRecordVOList.stream().map(MesApprovalRecordEntity::getBizId).toList();
}); // 提取所有的业务类型
page.setRecords(recordVOList); List<String> bizTypeList = myHistoryMesApprovalRecordVOList.stream().map(MesApprovalRecordEntity::getBizType).toList();
} // 根据业务ID和业务类型查询所有的审批记录
return page.setRecords(Collections.emptyList()); 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.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import jakarta.annotation.Resource; import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springblade.common.cache.CacheNames;
import org.springblade.core.mp.base.BaseServiceImpl; import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.secure.utils.AuthUtil; import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R; 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.feign.IMesNotifyMessageClient;
import org.springblade.desk.common.pojo.entity.MesNotifyMessageEntity; 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.mapper.OemSettlementApprovalMapper;
import org.springblade.desk.oem.pojo.entity.OemSettlementApprovalDetailEntity; import org.springblade.desk.oem.pojo.entity.OemSettlementApprovalDetailEntity;
import org.springblade.desk.oem.pojo.entity.OemSettlementApprovalEntity; 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.IOemSettlementApprovalService;
import org.springblade.desk.oem.service.IOemStatementService; import org.springblade.desk.oem.service.IOemStatementService;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@ -50,6 +49,9 @@ public class OemSettlementApprovalServiceImpl extends BaseServiceImpl<OemSettlem
@Resource @Resource
private IMesNotifyMessageClient mesNotifyMessageClient; private IMesNotifyMessageClient mesNotifyMessageClient;
@Resource
private IMesApprovalRecordService mesApprovalRecordService;
@Override @Override
public IPage<OemSettlementApprovalVO> selectApprovalPage(IPage<OemSettlementApprovalVO> page, SettlementApprovalQuery query) { public IPage<OemSettlementApprovalVO> selectApprovalPage(IPage<OemSettlementApprovalVO> page, SettlementApprovalQuery query) {
return page.setRecords(baseMapper.selectApprovalPage(page, query)); return page.setRecords(baseMapper.selectApprovalPage(page, query));
@ -193,7 +195,7 @@ public class OemSettlementApprovalServiceImpl extends BaseServiceImpl<OemSettlem
* 处理校对流程 * 处理校对流程
*/ */
private R handleProofreading(OemSettlementApprovalEntity approval, SettlementApprovalRequest request, private R handleProofreading(OemSettlementApprovalEntity approval, SettlementApprovalRequest request,
Long currentUserId, String currentUserName) { Long currentUserId, String currentUserName) {
Integer approvalStatus = approval.getApprovalStatus(); Integer approvalStatus = approval.getApprovalStatus();
// 校验:只有【待审批】或【校对中】状态可以进行校对 // 校验:只有【待审批】或【校对中】状态可以进行校对
@ -243,7 +245,8 @@ public class OemSettlementApprovalServiceImpl extends BaseServiceImpl<OemSettlem
// 保存审批记录 // 保存审批记录
this.updateById(approval); this.updateById(approval);
// 更新待办
mesApprovalRecordService.updateApproval(approval.getId(), MesApprovalRecordBizTypeEnum.OEM_STATEMENT.getDesc(), currentUserId, now);
return R.success(); return R.success();
} }
@ -280,6 +283,8 @@ public class OemSettlementApprovalServiceImpl extends BaseServiceImpl<OemSettlem
// 更新所有关联结算单的状态为【待推送】 // 更新所有关联结算单的状态为【待推送】
updateStatementsStatus(approval.getId(), OemStatementEntity.PENDING_PUSH_SETTLEMENT, null); updateStatementsStatus(approval.getId(), OemStatementEntity.PENDING_PUSH_SETTLEMENT, null);
// 更新待办
mesApprovalRecordService.updateApproval(approval.getId(), MesApprovalRecordBizTypeEnum.OEM_STATEMENT.getDesc(), currentUserId, now);
return R.success(); return R.success();
} else { } else {
// 审核不通过 // 审核不通过
@ -301,6 +306,8 @@ public class OemSettlementApprovalServiceImpl extends BaseServiceImpl<OemSettlem
// 更新所有关联结算单的状态为【结算异常】 // 更新所有关联结算单的状态为【结算异常】
updateStatementsStatus(approval.getId(), OemStatementEntity.ERR_SETTLEMENT, "MES结算审核不通过"); updateStatementsStatus(approval.getId(), OemStatementEntity.ERR_SETTLEMENT, "MES结算审核不通过");
// 更新待办
mesApprovalRecordService.removeApproval(approval.getId(), MesApprovalRecordBizTypeEnum.OEM_STATEMENT.getDesc());
return R.success("审批已拒绝"); return R.success("审批已拒绝");
} }
@ -308,8 +315,8 @@ public class OemSettlementApprovalServiceImpl extends BaseServiceImpl<OemSettlem
/** /**
* 更新结算单状态 * 更新结算单状态
* *
* @param approvalId 审批ID * @param approvalId 审批ID
* @param newStatus 新状态 * @param newStatus 新状态
* @param abnormalReason 异常原因可选 * @param abnormalReason 异常原因可选
*/ */
private void updateStatementsStatus(Long approvalId, Integer newStatus, String 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 { try {
Long auditLeaderRoleId = 2054852195869057026L; Long auditLeaderRoleId = 2054852195869057026L;
String roleName = "外协结算审核领导"; String roleName = "外协结算审核领导";
// 构建通知消息 // 构建通知消息
String title = String.format("外协结算审批提醒 - %s", String title = String.format("外协结算审批提醒 - %s",
approval.getApprovalNo()); approval.getApprovalNo());
String content = String.format( String content = String.format(
"外协结算审批详情:\n" + "外协结算审批详情:\n" +
"- 审批单号:%s\n" + "- 审批单号:%s\n" +
"- 结算总批数:%d\n" + "- 结算总批数:%d\n" +
"- 结算总面积:%.2f dm²\n" + "- 结算总面积:%.2f dm²\n" +
"- 结算总金额:%.2f 元\n" + "- 结算总金额:%.2f 元\n" +
"- 提交时间:%s\n" + "- 提交时间:%s\n" +
"- 状态:已完成两次校对,等待审核", "- 状态:已完成两次校对,等待审核",
approval.getApprovalNo(), approval.getApprovalNo(),
approval.getTotalCount() != null ? approval.getTotalCount() : 0, approval.getTotalCount() != null ? approval.getTotalCount() : 0,
approval.getTotalArea() != null ? approval.getTotalArea() : BigDecimal.ZERO, approval.getTotalArea() != null ? approval.getTotalArea() : BigDecimal.ZERO,
approval.getTotalAmount() != null ? approval.getTotalAmount() : BigDecimal.ZERO, approval.getTotalAmount() != null ? approval.getTotalAmount() : BigDecimal.ZERO,
approval.getSubmitTime() approval.getSubmitTime()
); );
// 创建通知消息实体 // 创建通知消息实体
MesNotifyMessageEntity notifyMessage = MesNotifyMessageEntity.builder() MesNotifyMessageEntity notifyMessage = MesNotifyMessageEntity.builder()
.title(title) .title(title)
.content(content) .content(content)
.receiveRoleId(auditLeaderRoleId) .receiveRoleId(auditLeaderRoleId)
.receiveRoleName(roleName) .receiveRoleName(roleName)
.receiveUserId(AuthUtil.getUserId()) .receiveUserId(AuthUtil.getUserId())
.build(); .build();
// 通知失败不影响主流程 // 通知失败不影响主流程
// 调用Feign客户端保存通知消息 // 调用Feign客户端保存通知消息
R result = mesNotifyMessageClient.save(notifyMessage); R result = mesNotifyMessageClient.save(notifyMessage);
if (result != null && result.isSuccess()) { if (result != null && result.isSuccess()) {
log.info("成功发送外协结算审批提醒,审批单号: {}, 校对人: {}", log.info("成功发送外协结算审批提醒,审批单号: {}, 校对人: {}",
approval.getApprovalNo(), AuthUtil.getUserName()); approval.getApprovalNo(), AuthUtil.getUserName());
} else { } else {
log.error("发送外协结算审批提醒失败,审批单号: {}, 错误信息: {}", log.error("发送外协结算审批提醒失败,审批单号: {}, 错误信息: {}",
approval.getApprovalNo(), result != null ? result.getMsg() : "返回结果为空"); approval.getApprovalNo(), result != null ? result.getMsg() : "返回结果为空");
} }
} catch (Exception e) { } catch (Exception e) {

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

Loading…
Cancel
Save