11 changed files with 555 additions and 104 deletions
@ -0,0 +1,96 @@ |
|||
package com.qs.serve.modules.vtb.entity; |
|||
|
|||
import java.time.LocalDate; |
|||
import java.io.Serializable; |
|||
import java.math.BigDecimal; |
|||
import java.time.LocalDateTime; |
|||
|
|||
import com.baomidou.mybatisplus.annotation.*; |
|||
import com.fasterxml.jackson.annotation.JsonFormat; |
|||
import com.fasterxml.jackson.annotation.JsonIgnore; |
|||
import com.fasterxml.jackson.annotation.JsonProperty; |
|||
import lombok.Data; |
|||
import org.hibernate.validator.constraints.Length; |
|||
import org.springframework.format.annotation.DateTimeFormat; |
|||
|
|||
import javax.validation.constraints.NotNull; |
|||
import javax.validation.constraints.NotBlank; |
|||
|
|||
/** |
|||
* 核销审批线 实体类 |
|||
* @author YenHex |
|||
* @since 2023-02-14 |
|||
*/ |
|||
@Data |
|||
@TableName("vtb_verification_yard") |
|||
public class VtbVerificationYard implements Serializable { |
|||
|
|||
private static final long serialVersionUID = 1L; |
|||
|
|||
/** id */ |
|||
@TableId(type = IdType.AUTO) |
|||
private Long id; |
|||
|
|||
/** 核算id */ |
|||
@NotNull(message = "核算id不能为空") |
|||
private Long verificationId; |
|||
|
|||
/** 科目核销编码 */ |
|||
@NotBlank(message = "科目核销编码不能为空") |
|||
@Length(max = 32,message = "科目核销编码长度不能超过32字") |
|||
private String verificationSubCode; |
|||
|
|||
/** 状态:0-否定,1-同意,2-退回 */ |
|||
@NotNull(message = "状态:0-否定,1-同意,2-退回不能为空") |
|||
private Integer state; |
|||
|
|||
/** OA节点id */ |
|||
@NotBlank(message = "OA节点id不能为空") |
|||
@Length(max = 40,message = "OA节点id长度不能超过40字") |
|||
private String affairId; |
|||
|
|||
/** 评论 */ |
|||
@NotBlank(message = "评论不能为空") |
|||
@Length(max = 255,message = "评论长度不能超过255字") |
|||
private String comment; |
|||
|
|||
/** 备注 */ |
|||
@Length(max = 255,message = "备注长度不能超过255字") |
|||
private String remark; |
|||
|
|||
/** 创建时间 */ |
|||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
|||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") |
|||
@TableField(fill = FieldFill.INSERT) |
|||
private LocalDateTime createTime; |
|||
|
|||
/** 最后更新时间 */ |
|||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
|||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") |
|||
@TableField(fill = FieldFill.UPDATE) |
|||
private LocalDateTime updateTime; |
|||
|
|||
/** 所属租户 */ |
|||
@JsonIgnore |
|||
@JsonProperty |
|||
private String tenantId; |
|||
|
|||
/** 创建人 */ |
|||
@TableField(fill = FieldFill.INSERT) |
|||
private String createBy; |
|||
|
|||
/** 更新人 */ |
|||
@TableField(fill = FieldFill.UPDATE) |
|||
private String updateBy; |
|||
|
|||
/** 逻辑删除标记(0:显示;1:隐藏) */ |
|||
@JsonIgnore |
|||
@JsonProperty |
|||
private String delFlag; |
|||
|
|||
/** 是否无效 */ |
|||
@NotNull(message = "是否无效不能为空") |
|||
private Integer effectiveFlag; |
|||
|
|||
} |
|||
|
@ -0,0 +1,145 @@ |
|||
package com.qs.serve.modules.vtb.entity; |
|||
|
|||
import java.time.LocalDate; |
|||
import java.io.Serializable; |
|||
import java.math.BigDecimal; |
|||
import java.time.LocalDateTime; |
|||
|
|||
import com.baomidou.mybatisplus.annotation.*; |
|||
import com.fasterxml.jackson.annotation.JsonFormat; |
|||
import com.fasterxml.jackson.annotation.JsonIgnore; |
|||
import com.fasterxml.jackson.annotation.JsonProperty; |
|||
import lombok.Data; |
|||
import org.hibernate.validator.constraints.Length; |
|||
import org.springframework.format.annotation.DateTimeFormat; |
|||
|
|||
import javax.validation.constraints.NotNull; |
|||
import javax.validation.constraints.NotBlank; |
|||
|
|||
/** |
|||
* 核销审批线明细 实体类 |
|||
* @author YenHex |
|||
* @since 2023-02-14 |
|||
*/ |
|||
@Data |
|||
@TableName("vtb_verification_yard_item") |
|||
public class VtbVerificationYardItem implements Serializable { |
|||
|
|||
private static final long serialVersionUID = 1L; |
|||
|
|||
/** id */ |
|||
@TableId(type = IdType.AUTO) |
|||
private Long id; |
|||
|
|||
/** 核销线id */ |
|||
@NotNull(message = "核销线id不能为空") |
|||
private Long yardId; |
|||
|
|||
/** 核算id */ |
|||
@NotNull(message = "核算id不能为空") |
|||
private Long verificationId; |
|||
|
|||
/** 科目核销编码 */ |
|||
@NotBlank(message = "科目核销编码不能为空") |
|||
@Length(max = 32,message = "科目核销编码长度不能超过32字") |
|||
private String verificationSubCode; |
|||
|
|||
/** 费用申请id */ |
|||
@NotNull(message = "费用申请id不能为空") |
|||
private Long costApplyId; |
|||
|
|||
/** 活动id */ |
|||
@NotNull(message = "活动id不能为空") |
|||
private Long activityId; |
|||
|
|||
/** 科目id */ |
|||
@NotNull(message = "科目id不能为空") |
|||
private Long subjectId; |
|||
|
|||
/** 科目编码 */ |
|||
@NotBlank(message = "科目编码不能为空") |
|||
@Length(max = 50,message = "科目编码长度不能超过50字") |
|||
private String subjectCode; |
|||
|
|||
/** 科目名称 */ |
|||
@NotBlank(message = "科目名称不能为空") |
|||
@Length(max = 50,message = "科目名称长度不能超过50字") |
|||
private String subjectName; |
|||
|
|||
/** 客户id */ |
|||
@NotNull(message = "客户id不能为空") |
|||
private Long supplierId; |
|||
|
|||
/** 客户编码 */ |
|||
@NotBlank(message = "客户编码不能为空") |
|||
@Length(max = 30,message = "客户编码长度不能超过30字") |
|||
private String supplierCode; |
|||
|
|||
/** 客户名称 */ |
|||
@NotBlank(message = "客户名称不能为空") |
|||
@Length(max = 30,message = "客户名称长度不能超过30字") |
|||
private String supplierName; |
|||
|
|||
/** 上次审批金额 */ |
|||
@NotNull(message = "上次审批金额不能为空") |
|||
private BigDecimal lastAmount; |
|||
|
|||
/** 本次审批金额 */ |
|||
@NotNull(message = "本次审批金额不能为空") |
|||
private BigDecimal currAmount; |
|||
|
|||
/** 场次 */ |
|||
@NotNull(message = "场次不能为空") |
|||
private Integer countSession; |
|||
|
|||
/** 人数 */ |
|||
@NotNull(message = "人数不能为空") |
|||
private Integer countPerson; |
|||
|
|||
/** 备注 */ |
|||
@Length(max = 255,message = "备注长度不能超过255字") |
|||
private String remark; |
|||
|
|||
/** 创建时间 */ |
|||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
|||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") |
|||
@TableField(fill = FieldFill.INSERT) |
|||
private LocalDateTime createTime; |
|||
|
|||
/** 最后更新时间 */ |
|||
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
|||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") |
|||
@TableField(fill = FieldFill.UPDATE) |
|||
private LocalDateTime updateTime; |
|||
|
|||
/** 所属租户 */ |
|||
@JsonIgnore |
|||
@JsonProperty |
|||
private String tenantId; |
|||
|
|||
/** 创建人 */ |
|||
@TableField(fill = FieldFill.INSERT) |
|||
private String createBy; |
|||
|
|||
/** 更新人 */ |
|||
@TableField(fill = FieldFill.UPDATE) |
|||
private String updateBy; |
|||
|
|||
/** 逻辑删除标记(0:显示;1:隐藏) */ |
|||
@JsonIgnore |
|||
@JsonProperty |
|||
private String delFlag; |
|||
|
|||
/** 是否无效 */ |
|||
@NotNull(message = "是否无效不能为空") |
|||
private Integer effectiveFlag; |
|||
|
|||
public void initSetNull(){ |
|||
this.setCreateBy(null); |
|||
this.setCreateTime(null); |
|||
this.setUpdateBy(null); |
|||
this.setUpdateTime(null); |
|||
} |
|||
|
|||
} |
|||
|
@ -0,0 +1,14 @@ |
|||
package com.qs.serve.modules.vtb.mapper; |
|||
|
|||
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
|||
import com.qs.serve.modules.vtb.entity.VtbVerificationYardItem; |
|||
|
|||
/** |
|||
* 核销审批线明细 Mapper |
|||
* @author YenHex |
|||
* @date 2023-02-14 |
|||
*/ |
|||
public interface VtbVerificationYardItemMapper extends BaseMapper<VtbVerificationYardItem> { |
|||
|
|||
} |
|||
|
@ -0,0 +1,14 @@ |
|||
package com.qs.serve.modules.vtb.mapper; |
|||
|
|||
import com.baomidou.mybatisplus.core.mapper.BaseMapper; |
|||
import com.qs.serve.modules.vtb.entity.VtbVerificationYard; |
|||
|
|||
/** |
|||
* 核销审批线 Mapper |
|||
* @author YenHex |
|||
* @date 2023-02-14 |
|||
*/ |
|||
public interface VtbVerificationYardMapper extends BaseMapper<VtbVerificationYard> { |
|||
|
|||
} |
|||
|
@ -0,0 +1,196 @@ |
|||
package com.qs.serve.modules.vtb.service; |
|||
|
|||
import com.qs.serve.common.model.dto.R; |
|||
import com.qs.serve.common.util.CollectionUtil; |
|||
import com.qs.serve.common.util.CopierUtil; |
|||
import com.qs.serve.modules.seeyon.entity.CtpAffair; |
|||
import com.qs.serve.modules.seeyon.service.SeeYonService; |
|||
import com.qs.serve.modules.sys.entity.SysUser; |
|||
import com.qs.serve.modules.sys.service.SysAttachService; |
|||
import com.qs.serve.modules.sys.service.SysUserService; |
|||
import com.qs.serve.modules.tbs.common.TbsActivityState; |
|||
import com.qs.serve.modules.tbs.common.TbsSeeYonConst; |
|||
import com.qs.serve.modules.tbs.entity.TbsActivity; |
|||
import com.qs.serve.modules.tbs.entity.TbsCostApply; |
|||
import com.qs.serve.modules.tbs.entity.bo.TbsAffairCommitBo; |
|||
import com.qs.serve.modules.tbs.entity.vo.CtpAffairVo; |
|||
import com.qs.serve.modules.tbs.service.TbsActivityService; |
|||
import com.qs.serve.modules.tbs.service.TbsCostApplyService; |
|||
import com.qs.serve.modules.vtb.common.VtbVerificationState; |
|||
import com.qs.serve.modules.vtb.entity.VtbVerification; |
|||
import com.qs.serve.modules.vtb.entity.VtbVerificationSubject; |
|||
import com.qs.serve.modules.vtb.entity.VtbVerificationYard; |
|||
import com.qs.serve.modules.vtb.entity.VtbVerificationYardItem; |
|||
import lombok.AllArgsConstructor; |
|||
import org.jetbrains.annotations.NotNull; |
|||
import org.springframework.stereotype.Service; |
|||
import org.springframework.web.bind.annotation.RequestBody; |
|||
|
|||
import javax.validation.Valid; |
|||
import java.math.BigDecimal; |
|||
import java.time.LocalDateTime; |
|||
import java.util.ArrayList; |
|||
import java.util.List; |
|||
import java.util.stream.Collectors; |
|||
|
|||
/** |
|||
* @author YenHex |
|||
* @since 2023/2/14 |
|||
*/ |
|||
@Service |
|||
@AllArgsConstructor |
|||
public class VtbVerificationApplication { |
|||
|
|||
private VtbVerificationService vtbVerificationService; |
|||
private VtbVerificationSubjectService vtbVerificationSubjectService; |
|||
private VtbVerificationYardService yardService; |
|||
private VtbVerificationYardItemService yardItemService; |
|||
|
|||
private TbsActivityService tbsActivityService; |
|||
private TbsCostApplyService tbsCostApplyService; |
|||
private SysUserService sysUserService; |
|||
private SeeYonService seeYonService; |
|||
|
|||
public R<?> commitAffair(@RequestBody @Valid TbsAffairCommitBo affairCommit){ |
|||
VtbVerification verification = vtbVerificationService.getById(affairCommit.getCostApplyId()); |
|||
if(!verification.getVerificationState().equals(VtbVerificationState.Commiting.getCode())){ |
|||
return R.error("费用申请处于未非审批状态!"); |
|||
} |
|||
VtbVerificationYard yard = new VtbVerificationYard(); |
|||
yard.setVerificationId(verification.getId()); |
|||
yard.setVerificationSubCode(verification.getVerificationCode()); |
|||
yard.setState(affairCommit.getState()); |
|||
yard.setAffairId(affairCommit.getAffairId()); |
|||
yard.setComment(affairCommit.getComment()); |
|||
|
|||
boolean isBackCommit = affairCommit.getState()==2; |
|||
R<String> result = seeYonService.commonCommit(affairCommit, TbsSeeYonConst.VERIFICATION_CODE); |
|||
if(result.getStatus()==200){ |
|||
// 判断是否含有下个节点
|
|||
String flag = result.getData(); |
|||
//审批中(next)、完成(finish)、拒绝(refused)
|
|||
if("finish".equals(flag)){ |
|||
VtbVerification vtbVer = new VtbVerification(); |
|||
vtbVer.setId(verification.getId()); |
|||
vtbVer.setVerificationState(VtbVerificationState.Finished.getCode()); |
|||
vtbVer.setFinishedTime(LocalDateTime.now()); |
|||
vtbVerificationService.updateById(vtbVer); |
|||
vtbVerificationService.successCommit(verification.getId()); |
|||
}else if ("stop".equals(flag)){ |
|||
if(isBackCommit){ |
|||
VtbVerification vtbVer = new VtbVerification(); |
|||
vtbVer.setId(verification.getId()); |
|||
vtbVer.setVerificationState(VtbVerificationState.Rollback.getCode()); |
|||
vtbVer.setSyFormId(""); |
|||
vtbVer.setSyFlowId(""); |
|||
vtbVerificationService.updateById(vtbVer); |
|||
}else { |
|||
VtbVerification vtbVer = new VtbVerification(); |
|||
vtbVer.setId(verification.getId()); |
|||
vtbVer.setVerificationState(VtbVerificationState.Stop.getCode()); |
|||
vtbVerificationService.updateById(vtbVer); |
|||
} |
|||
//还原活动为待核销状态
|
|||
TbsActivity activity = new TbsActivity(); |
|||
activity.setId(verification.getActivityId()); |
|||
activity.setActivityState(TbsActivityState.STATE_0_Todo); |
|||
tbsActivityService.updateById(activity); |
|||
}else if (!"next".equals(flag)){ |
|||
return R.error("远程调用返回,非指定状态"); |
|||
} |
|||
yardService.save(yard); |
|||
//非终止或者驳回,保存审批线金额明细
|
|||
if(!"stop".equals(flag)){ |
|||
List<VtbVerificationSubject> verificationSubjects = vtbVerificationSubjectService.listByVerificationId(verification.getId()); |
|||
List<VtbVerificationYardItem> yardItemList = new ArrayList<>(); |
|||
for (VtbVerificationSubject currVs : verificationSubjects) { |
|||
BigDecimal changeAmount = null; |
|||
if(CollectionUtil.isNotEmpty(affairCommit.getAffairSubjectLines())){ |
|||
for (TbsAffairCommitBo.AffairSubjectLine affairSubjectLine : affairCommit.getAffairSubjectLines()) { |
|||
if(currVs.getId().equals(affairSubjectLine.getVerificationSubjectId())){ |
|||
changeAmount = affairSubjectLine.getAmount(); |
|||
break; |
|||
} |
|||
} |
|||
} |
|||
//保存明细判断是否更变金额
|
|||
VtbVerificationYardItem yardItem = CopierUtil.copy(currVs,new VtbVerificationYardItem()); |
|||
yardItem.initSetNull(); |
|||
BigDecimal lastAmount = currVs.getUsedAmount(); |
|||
yardItem.setLastAmount(lastAmount); |
|||
//金额有更变
|
|||
if(changeAmount!=null&&changeAmount.compareTo(lastAmount)!=0){ |
|||
yardItem.setCurrAmount(changeAmount); |
|||
BigDecimal diff = changeAmount.subtract(lastAmount); |
|||
if(diff.compareTo(BigDecimal.ZERO)>0){ |
|||
yardItem.setRemark(currVs.getSubjectName()+"["+currVs.getSubjectCode()+"]增加费用:"+diff); |
|||
}else { |
|||
yardItem.setRemark(currVs.getSubjectName()+"["+currVs.getSubjectCode()+"]减少费用:"+diff.negate()); |
|||
} |
|||
}else { |
|||
yardItem.setCurrAmount(lastAmount); |
|||
} |
|||
yardItemList.add(yardItem); |
|||
} |
|||
yardItemService.saveBatch(yardItemList); |
|||
} |
|||
return R.ok(); |
|||
}else if (result.getStatus()==500){ |
|||
return result; |
|||
} |
|||
return R.error("远程调用失败"); |
|||
} |
|||
|
|||
@NotNull |
|||
public List<CtpAffairVo> buildCtpAffairVoList(List<CtpAffair> ctpAffairs) { |
|||
if(CollectionUtil.isEmpty(ctpAffairs)){ |
|||
return new ArrayList<>(); |
|||
} |
|||
List<String> oaUserIds = ctpAffairs.stream().map(CtpAffair::getMemberId).collect(Collectors.toList()); |
|||
List<SysUser> userList = sysUserService.listByOaMemberIds(oaUserIds); |
|||
List<String> verificationIds = ctpAffairs.stream().map(CtpAffair::getCostApplyId).collect(Collectors.toList()); |
|||
List<VtbVerification> vtbVerificationList = new ArrayList<>(); |
|||
List<TbsActivity> activityList = new ArrayList<>(); |
|||
List<TbsCostApply> costApplyList = new ArrayList<>(); |
|||
if(verificationIds.size()>0){ |
|||
vtbVerificationList = vtbVerificationService.listByIds(verificationIds); |
|||
List<Long> actIds = vtbVerificationList.stream().map(VtbVerification::getActivityId).collect(Collectors.toList()); |
|||
if(actIds.size()>0){ |
|||
activityList = tbsActivityService.listByIds(actIds); |
|||
List<Long> costIds = activityList.stream().map(TbsActivity::getCostApplyId).distinct().collect(Collectors.toList()); |
|||
costApplyList = tbsCostApplyService.listByIds(costIds); |
|||
} |
|||
} |
|||
List<CtpAffairVo> result = new ArrayList<>(); |
|||
for (CtpAffair ctpAffair : ctpAffairs) { |
|||
CtpAffairVo ctpAffairVo = new CtpAffairVo(); |
|||
for (VtbVerification verification : vtbVerificationList) { |
|||
if(verification.getId().toString().equals(ctpAffair.getCostApplyId())){ |
|||
ctpAffairVo.setVerification(verification); |
|||
for (TbsActivity activity : activityList) { |
|||
if(verification.getActivityId().equals(activity.getId())){ |
|||
ctpAffairVo.setActivityInfo(activity); |
|||
for (TbsCostApply costApply : costApplyList) { |
|||
if(activity.getCostApplyId().equals(costApply.getId())){ |
|||
ctpAffairVo.setCostApply(costApply); |
|||
break; |
|||
} |
|||
} |
|||
break; |
|||
} |
|||
} |
|||
break; |
|||
} |
|||
} |
|||
for (SysUser user : userList) { |
|||
if(ctpAffair.getMemberId().equals(user.getSyUserId())){ |
|||
ctpAffairVo.setUserInfo(user.toSysUserVo()); |
|||
} |
|||
} |
|||
ctpAffairVo.setAffairInfo(ctpAffair); |
|||
result.add(ctpAffairVo); |
|||
} |
|||
return result; |
|||
} |
|||
|
|||
} |
@ -0,0 +1,14 @@ |
|||
package com.qs.serve.modules.vtb.service; |
|||
|
|||
import com.baomidou.mybatisplus.extension.service.IService; |
|||
import com.qs.serve.modules.vtb.entity.VtbVerificationYardItem; |
|||
|
|||
/** |
|||
* 核销审批线明细 服务接口 |
|||
* @author YenHex |
|||
* @date 2023-02-14 |
|||
*/ |
|||
public interface VtbVerificationYardItemService extends IService<VtbVerificationYardItem> { |
|||
|
|||
} |
|||
|
@ -0,0 +1,14 @@ |
|||
package com.qs.serve.modules.vtb.service; |
|||
|
|||
import com.baomidou.mybatisplus.extension.service.IService; |
|||
import com.qs.serve.modules.vtb.entity.VtbVerificationYard; |
|||
|
|||
/** |
|||
* 核销审批线 服务接口 |
|||
* @author YenHex |
|||
* @date 2023-02-14 |
|||
*/ |
|||
public interface VtbVerificationYardService extends IService<VtbVerificationYard> { |
|||
|
|||
} |
|||
|
@ -0,0 +1,22 @@ |
|||
package com.qs.serve.modules.vtb.service.impl; |
|||
|
|||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
|||
import lombok.AllArgsConstructor; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.springframework.stereotype.Service; |
|||
import com.qs.serve.modules.vtb.entity.VtbVerificationYardItem; |
|||
import com.qs.serve.modules.vtb.service.VtbVerificationYardItemService; |
|||
import com.qs.serve.modules.vtb.mapper.VtbVerificationYardItemMapper; |
|||
|
|||
/** |
|||
* 核销审批线明细 服务实现类 |
|||
* @author YenHex |
|||
* @since 2023-02-14 |
|||
*/ |
|||
@Slf4j |
|||
@Service |
|||
@AllArgsConstructor |
|||
public class VtbVerificationYardItemServiceImpl extends ServiceImpl<VtbVerificationYardItemMapper,VtbVerificationYardItem> implements VtbVerificationYardItemService { |
|||
|
|||
} |
|||
|
@ -0,0 +1,22 @@ |
|||
package com.qs.serve.modules.vtb.service.impl; |
|||
|
|||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
|||
import lombok.AllArgsConstructor; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.springframework.stereotype.Service; |
|||
import com.qs.serve.modules.vtb.entity.VtbVerificationYard; |
|||
import com.qs.serve.modules.vtb.service.VtbVerificationYardService; |
|||
import com.qs.serve.modules.vtb.mapper.VtbVerificationYardMapper; |
|||
|
|||
/** |
|||
* 核销审批线 服务实现类 |
|||
* @author YenHex |
|||
* @since 2023-02-14 |
|||
*/ |
|||
@Slf4j |
|||
@Service |
|||
@AllArgsConstructor |
|||
public class VtbVerificationYardServiceImpl extends ServiceImpl<VtbVerificationYardMapper,VtbVerificationYard> implements VtbVerificationYardService { |
|||
|
|||
} |
|||
|
Loading…
Reference in new issue