|
|
@@ -0,0 +1,331 @@
|
|
|
+package org.springblade.box.tube.agreement.service.impl;
|
|
|
+
|
|
|
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
|
|
+import com.baomidou.mybatisplus.core.metadata.IPage;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
|
|
|
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
+import io.seata.spring.annotation.GlobalTransactional;
|
|
|
+import lombok.AllArgsConstructor;
|
|
|
+import org.springblade.box.tube.agreement.mapper.AgreementFilesMapper;
|
|
|
+import org.springblade.box.tube.agreement.mapper.AgreementMapper;
|
|
|
+import org.springblade.box.tube.agreement.service.IAgreementService;
|
|
|
+import org.springblade.box.tube.entity.*;
|
|
|
+import org.springblade.box.tube.vo.AgreementVO;
|
|
|
+import org.springblade.check.dto.AuditProecessDTO;
|
|
|
+import org.springblade.check.entity.AuditPathsActs;
|
|
|
+import org.springblade.check.entity.AuditPathsLevels;
|
|
|
+import org.springblade.check.feign.ICheckClient;
|
|
|
+import org.springblade.client.feign.ISerialClient;
|
|
|
+import org.springblade.core.secure.utils.AuthUtil;
|
|
|
+import org.springblade.core.tool.api.R;
|
|
|
+import org.springblade.core.tool.utils.ObjectUtil;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.transaction.annotation.Transactional;
|
|
|
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
|
|
|
+
|
|
|
+import java.util.Date;
|
|
|
+import java.util.List;
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * 协议管理表 服务实现类
|
|
|
+ *
|
|
|
+ * @author BladeX
|
|
|
+ * @since 2022-12-20
|
|
|
+ */
|
|
|
+@Service
|
|
|
+@AllArgsConstructor
|
|
|
+public class AgreementServiceImpl extends ServiceImpl<AgreementMapper, Agreement> implements IAgreementService {
|
|
|
+
|
|
|
+ private ISerialClient serialClient;//生成系统编号
|
|
|
+ private final AgreementFilesMapper filesMapper;//附件明细
|
|
|
+
|
|
|
+ private final ICheckClient iCheckClient;//审批
|
|
|
+
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获得协议详情
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public Agreement getDetail(Agreement agreement) {
|
|
|
+ if (agreement.getId() == null) {
|
|
|
+ throw new SecurityException("缺少必要参数");
|
|
|
+ }
|
|
|
+ Agreement detail = baseMapper.selectById(agreement.getId());
|
|
|
+ if (ObjectUtil.isNotEmpty(detail)) {
|
|
|
+ //获取附件信息
|
|
|
+ LambdaQueryWrapper<AgreementFiles> filesLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ filesLambdaQueryWrapper.eq(AgreementFiles::getIsDeleted, 0)
|
|
|
+ .eq(AgreementFiles::getTenantId, AuthUtil.getTenantId())
|
|
|
+ .eq(AgreementFiles::getType, "1")
|
|
|
+ .eq(AgreementFiles::getPid, detail.getId());
|
|
|
+ List<AgreementFiles> filesList = filesMapper.selectList(filesLambdaQueryWrapper);
|
|
|
+ detail.setFilesList(filesList);
|
|
|
+ }
|
|
|
+ return detail;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 自定义分页
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public IPage<AgreementVO> selAgreementPage(IPage<AgreementVO> page, Agreement agreement) {
|
|
|
+ return page.setRecords(baseMapper.selAgreementPage(page, agreement));
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 新增或修改协议管理
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
|
|
|
+ public Agreement add(Agreement agreement) {
|
|
|
+ if (agreement.getId() == null) {
|
|
|
+ //获取系统编号
|
|
|
+ R billNo = new R();
|
|
|
+
|
|
|
+ billNo = serialClient.getBillNo("XYGL", "XY", "XYGL");
|
|
|
+ if (!billNo.isSuccess()) {
|
|
|
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
|
|
+ throw new Error("生成系统编号失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ agreement.setSysNo(billNo.getData().toString());
|
|
|
+ agreement.setCreateTime(new Date());
|
|
|
+ agreement.setCreateUser(AuthUtil.getUserId());
|
|
|
+ agreement.setTenantId(AuthUtil.getTenantId());
|
|
|
+ agreement.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
|
|
|
+ agreement.setStatus(0);
|
|
|
+ agreement.setAuditStatus("录入");
|
|
|
+ baseMapper.insert(agreement);
|
|
|
+ } else {
|
|
|
+ agreement.setUpdateTime(new Date());
|
|
|
+ agreement.setUpdateUser(AuthUtil.getUserId());
|
|
|
+ baseMapper.updateById(agreement);
|
|
|
+ }
|
|
|
+
|
|
|
+ //主表附件
|
|
|
+ List<AgreementFiles> filesList = agreement.getFilesList();
|
|
|
+ if (ObjectUtils.isNotNull(filesList) && filesList.size() > 0) {
|
|
|
+ for (AgreementFiles files : filesList) {
|
|
|
+ if (files.getId() == null) {
|
|
|
+ files.setCreateUser(AuthUtil.getUserId());
|
|
|
+ files.setCreateTime(new Date());
|
|
|
+ files.setTenantId(AuthUtil.getTenantId());
|
|
|
+ files.setPid(agreement.getId());
|
|
|
+ files.setType("1");
|
|
|
+ filesMapper.insert(files);
|
|
|
+ } else {
|
|
|
+ files.setUpdateUser(AuthUtil.getUserId());
|
|
|
+ files.setUpdateTime(new Date());
|
|
|
+ files.setPid(agreement.getId());
|
|
|
+ files.setType("1");
|
|
|
+ filesMapper.updateById(files);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ agreement.setFilesList(filesList);
|
|
|
+ }
|
|
|
+
|
|
|
+ return agreement;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 复制单据
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public R copyAgreement(Agreement agreement) {
|
|
|
+ LambdaQueryWrapper<Agreement> lambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ lambdaQueryWrapper.eq(Agreement::getId, agreement.getId())
|
|
|
+ .eq(Agreement::getTenantId, AuthUtil.getTenantId())
|
|
|
+ .eq(Agreement::getIsDeleted, 0);
|
|
|
+ Agreement detail = baseMapper.selectOne(lambdaQueryWrapper);
|
|
|
+
|
|
|
+ if (ObjectUtil.isEmpty(detail)) {
|
|
|
+ throw new SecurityException("信息获取异常");
|
|
|
+ }
|
|
|
+
|
|
|
+ detail.setId(null);
|
|
|
+ detail.setCreateUser(AuthUtil.getUserId());
|
|
|
+ detail.setCreateTime(new Date());
|
|
|
+ detail.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
|
|
|
+ detail.setSysNo("");
|
|
|
+ detail.setTenantId(AuthUtil.getTenantId());
|
|
|
+ detail.setStatus(null);
|
|
|
+ detail.setAuditStatus("");
|
|
|
+
|
|
|
+ //获取附件信息
|
|
|
+ LambdaQueryWrapper<AgreementFiles> filesLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
|
|
+ filesLambdaQueryWrapper.eq(AgreementFiles::getIsDeleted, 0)
|
|
|
+ .eq(AgreementFiles::getTenantId, AuthUtil.getTenantId())
|
|
|
+ .eq(AgreementFiles::getType, "1")
|
|
|
+ .eq(AgreementFiles::getPid, agreement.getId());
|
|
|
+ List<AgreementFiles> filesList = filesMapper.selectList(filesLambdaQueryWrapper);
|
|
|
+ filesList.forEach(e -> {
|
|
|
+ e.setId(null);
|
|
|
+ e.setPid(null);
|
|
|
+ e.setCreateUser(AuthUtil.getUserId());
|
|
|
+ e.setCreateTime(new Date());
|
|
|
+ e.setCreateDept(Long.valueOf(AuthUtil.getDeptId()));
|
|
|
+ });
|
|
|
+ detail.setFilesList(filesList);
|
|
|
+
|
|
|
+ return R.data(detail);
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 报关请核
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
|
|
|
+ public Agreement checkAgreement(Agreement agreement) {
|
|
|
+ Agreement declare = baseMapper.selectById(agreement.getId());
|
|
|
+ if (declare.getStatus() == 1) {
|
|
|
+ throw new SecurityException("订单已开启审核,请勿重复提交");
|
|
|
+ }
|
|
|
+
|
|
|
+ //审批数据
|
|
|
+ AuditProecessDTO auditProecessDTO = new AuditProecessDTO();
|
|
|
+ //获取审批级次
|
|
|
+ List<AuditPathsLevels> auditPathsLevels = null;
|
|
|
+ // 判断是否有审批流,如果审批流已开启就进入审批流,否则直接走申请通过
|
|
|
+ AuditPathsActs pathsActs = null;
|
|
|
+ //是否开启流程
|
|
|
+ pathsActs = iCheckClient.getActsByActId(19, "status");
|
|
|
+ //获取审批信息
|
|
|
+ auditPathsLevels = iCheckClient.listLevelsByActId(19, "status");
|
|
|
+ auditProecessDTO.setTimes(1);
|
|
|
+ auditProecessDTO.setProcessType("协议管理审批");
|
|
|
+
|
|
|
+ // 没开启审批流直接走 通过流程
|
|
|
+ if (pathsActs == null || pathsActs.getIsEnable() == 2) {
|
|
|
+ throw new SecurityException("当前租户未查询到审批流配置");
|
|
|
+ } else {
|
|
|
+
|
|
|
+ if (CollectionUtils.isEmpty(auditPathsLevels)) {
|
|
|
+ throw new SecurityException("开启审批失败:未查询到审批信息");
|
|
|
+ }
|
|
|
+
|
|
|
+ // 绑定审核类型
|
|
|
+ auditProecessDTO.setCheckType("XYGL");//代理订单
|
|
|
+ // 追加跳转路由url
|
|
|
+ auditProecessDTO.setUrl(agreement.getUrl());
|
|
|
+ auditProecessDTO.setPageStatus(agreement.getPageStatus());
|
|
|
+ auditProecessDTO.setPageLabel(agreement.getPageLabel());
|
|
|
+ auditProecessDTO.setOrderRemark(declare.getRemark());//订单备注
|
|
|
+ auditProecessDTO.setPathsLevelsList(auditPathsLevels);
|
|
|
+ auditProecessDTO.setActId(1);
|
|
|
+ auditProecessDTO.setSrcBillId(declare.getId());//申请表id
|
|
|
+ auditProecessDTO.setBillId(declare.getId());//业务id
|
|
|
+ auditProecessDTO.setBillNo(declare.getSysNo());//业务编号
|
|
|
+ auditProecessDTO.setSendUserId(AuthUtil.getUserId());//请核人id
|
|
|
+ auditProecessDTO.setSendName(AuthUtil.getUserName());//请核人名称
|
|
|
+ auditProecessDTO.setSendTime(new Date());//请核时间
|
|
|
+ auditProecessDTO.setBillTime(declare.getCreateTime());//业务日期
|
|
|
+ auditProecessDTO.setTenantId(AuthUtil.getTenantId());//租户id
|
|
|
+ R financeProcess = iCheckClient.createFinanceProcess(auditProecessDTO);
|
|
|
+ if (!financeProcess.isSuccess()) {
|
|
|
+ throw new SecurityException("操作失败,请联系管理员");
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ declare.setStatus(1);
|
|
|
+ declare.setAuditStatus("提交审核");
|
|
|
+ declare.setAuditTime(new Date());
|
|
|
+ baseMapper.updateById(declare);
|
|
|
+
|
|
|
+ return declare;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 审核通过
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public R passCheck(Long id) {
|
|
|
+ Agreement agreement = baseMapper.selectById(id);
|
|
|
+ if (agreement == null) {
|
|
|
+ throw new SecurityException("审批通过失败");
|
|
|
+ }
|
|
|
+ if (agreement.getStatus() == 4) {
|
|
|
+ throw new SecurityException("订单已审批通过请勿重复审批");
|
|
|
+ }
|
|
|
+
|
|
|
+ agreement.setStatus(4);
|
|
|
+ agreement.setAuditStatus("审核完成");
|
|
|
+ baseMapper.updateById(agreement);
|
|
|
+
|
|
|
+ return R.success("操作成功");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 审核中
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public R underReview(Long id) {
|
|
|
+ Agreement agreement = baseMapper.selectById(id);
|
|
|
+ if (agreement == null) {
|
|
|
+ throw new SecurityException("审批通过失败");
|
|
|
+ }
|
|
|
+
|
|
|
+ agreement.setStatus(2);
|
|
|
+ agreement.setAuditStatus("审批中");
|
|
|
+ baseMapper.updateById(agreement);
|
|
|
+
|
|
|
+ return R.success("操作成功");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 审核不通过
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ public R passCancel(Long id) {
|
|
|
+ Agreement agreement = baseMapper.selectById(id);
|
|
|
+ if (agreement == null) {
|
|
|
+ throw new SecurityException("审批驳回失败,未找到单据");
|
|
|
+ }
|
|
|
+ if (agreement.getStatus() == 0) {
|
|
|
+ throw new SecurityException("订单已驳回或未提交审批,请勿重复操作");
|
|
|
+ }
|
|
|
+
|
|
|
+ agreement.setStatus(0);
|
|
|
+ agreement.setAuditStatus("录入");
|
|
|
+ baseMapper.updateById(agreement);
|
|
|
+
|
|
|
+ return R.success("操作成功");
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 撤销审核
|
|
|
+ */
|
|
|
+ @Override
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
+ @GlobalTransactional(rollbackFor = Exception.class, timeoutMills = 12000000)
|
|
|
+ public Agreement revoke(Agreement agreement) {
|
|
|
+ Agreement detail = baseMapper.selectById(agreement.getId());
|
|
|
+ if (ObjectUtil.isEmpty(detail)) {
|
|
|
+ throw new SecurityException("撤销失败,未找到单据");
|
|
|
+ }
|
|
|
+ if (detail.getStatus().equals(2)) {
|
|
|
+ throw new SecurityException("撤销失败,订单正在审批中");
|
|
|
+ } else if (detail.getStatus().equals(3)) {
|
|
|
+ throw new SecurityException("撤销失败,订单已审核通过");
|
|
|
+ } else if (detail.getStatus().equals(0)) {
|
|
|
+ throw new SecurityException("撤销失败,订单未提交审核");
|
|
|
+ }
|
|
|
+
|
|
|
+ if (detail.getStatus() == 1) {
|
|
|
+ //修改单据状态
|
|
|
+ detail.setStatus(0);
|
|
|
+ detail.setAuditStatus("初审撤销");
|
|
|
+ detail.setUpdateUser(AuthUtil.getUserId());
|
|
|
+ detail.setUpdateTime(new Date());
|
|
|
+ //撤销
|
|
|
+ iCheckClient.deteleByBillIdOrGrade(agreement.getId(), 1);
|
|
|
+ }
|
|
|
+ baseMapper.updateById(detail);
|
|
|
+
|
|
|
+ return detail;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|