fourcal/src/main/java/cn/palmte/work/service/ProjectProcessService.java

268 lines
8.8 KiB
Java
Raw Normal View History

2022-12-23 02:59:25 +00:00
package cn.palmte.work.service;
2022-12-27 06:18:04 +00:00
import cn.palmte.work.config.activiti.ActConstant;
2022-12-23 09:24:05 +00:00
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
2022-12-23 02:59:25 +00:00
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
2022-12-26 08:43:15 +00:00
import java.math.BigDecimal;
2022-12-23 09:24:05 +00:00
import java.sql.PreparedStatement;
import java.sql.SQLException;
2022-12-27 06:14:05 +00:00
import java.util.ArrayList;
2022-12-23 09:24:05 +00:00
import java.util.HashMap;
2022-12-23 02:59:25 +00:00
import java.util.List;
2022-12-23 09:24:05 +00:00
import java.util.Map;
2022-12-27 06:14:05 +00:00
import java.util.Objects;
2022-12-23 02:59:25 +00:00
import java.util.stream.Collectors;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
2022-12-26 08:43:15 +00:00
import cn.palmte.work.config.activiti.ActProjectTypeEnum;
2022-12-23 02:59:25 +00:00
import cn.palmte.work.model.Admin;
2022-12-27 06:14:05 +00:00
import cn.palmte.work.model.AdminRepository;
import cn.palmte.work.model.Dept;
import cn.palmte.work.model.DeptRepository;
2022-12-26 08:43:15 +00:00
import cn.palmte.work.model.Project;
import cn.palmte.work.model.ProjectRepository;
2022-12-23 02:59:25 +00:00
import cn.palmte.work.model.enums.ProcessStatus;
2022-12-23 09:24:05 +00:00
import cn.palmte.work.model.process.ProcurementContract;
import cn.palmte.work.model.process.ProjectProcess;
import cn.palmte.work.model.process.SaleContract;
import cn.palmte.work.model.process.form.SaleContractDetailForm;
2022-12-27 06:14:05 +00:00
import lombok.Data;
2022-12-23 02:59:25 +00:00
import lombok.RequiredArgsConstructor;
2022-12-23 09:24:05 +00:00
import lombok.SneakyThrows;
2022-12-23 02:59:25 +00:00
/**
* @author <a href="https://github.com/TAKETODAY">Harry Yang</a>
* @since 2.0 2022/12/23 09:39
*/
@Service
@RequiredArgsConstructor
public class ProjectProcessService {
private final JdbcTemplate jdbcTemplate;
private final EntityManager entityManager;
2022-12-23 09:24:05 +00:00
private final ProjectInstanceService projectInstanceService;
2022-12-26 08:43:15 +00:00
private final ProjectRepository projectRepository;
2022-12-23 02:59:25 +00:00
2022-12-27 06:14:05 +00:00
private final DeptRepository deptRepository;
private final AdminRepository userRepository;
@Data
static class DeptReturnValue {
private int id;
private int leaderId;
private String leaderName;
private String name;
private List<DeptReturnValue> children;
public void addChildren(DeptReturnValue child) {
if (children == null) {
children = new ArrayList<>();
}
children.add(child);
}
}
public List<DeptReturnValue> filterDept() {
List<Dept> deptList = deptRepository.findEnable();
List<Dept> level1 = filterByLevel(deptList, 1);
List<Dept> level2 = filterByLevel(deptList, 2);
List<Dept> level3 = filterByLevel(deptList, 3);
List<DeptReturnValue> returnValues = new ArrayList<>();
for (Dept dept : level1) {
DeptReturnValue returnValue = createReturnValue(dept);
for (Dept dept2 : level2) {
if (Objects.equals(dept2.getParentId(), dept.getId())) {
DeptReturnValue returnValue2 = createReturnValue(dept2);
returnValue.addChildren(returnValue2);
for (Dept dept3 : level3) {
if (Objects.equals(dept3.getParentId(), dept2.getId())) {
returnValue2.addChildren(createReturnValue(dept3));
}
}
}
}
returnValues.add(returnValue);
}
return returnValues;
}
private static List<Dept> filterByLevel(List<Dept> deptList, int level) {
ArrayList<Dept> ret = new ArrayList<>();
for (Dept dept : deptList) {
if (Objects.equals(dept.getLevel(), level)) {
ret.add(dept);
}
}
return ret;
}
private DeptReturnValue createReturnValue(Dept dept) {
DeptReturnValue returnValue = new DeptReturnValue();
returnValue.setId(dept.getId());
returnValue.setName(dept.getName());
returnValue.setLeaderId(dept.getManagerId());
Admin user = userRepository.getAdminById(dept.getManagerId());
returnValue.setLeaderName(user.getRealName());
return returnValue;
}
2022-12-23 02:59:25 +00:00
/**
*
*
* @param processId Id
* @param auditId ID
* @param status
*/
public void updateAudit(int processId, ProcessStatus status, List<Integer> auditId) {
String currentAudit = getCurrentAudit(auditId);
String currentAuditId = auditId.stream().map(String::valueOf).collect(Collectors.joining(","));
if (status != null) {
if (!CollectionUtils.isEmpty(auditId)) {
jdbcTemplate.update(
"update project_process set current_audit=?,current_audit_id=?,status=? where id=?", currentAudit, currentAuditId, status.getValue(), processId);
}
}
else {
jdbcTemplate.update("update project_process set current_audit=?,current_audit_id=? where id=?", currentAudit, currentAuditId, processId);
}
}
private String getCurrentAudit(List<Integer> auditId) {
TypedQuery<Admin> query = entityManager.createQuery("from Admin where id in (:ids)", Admin.class);
query.setParameter("ids", auditId);
List<Admin> resultList = query.getResultList();
return resultList.stream().map(Admin::getRealName)
.collect(Collectors.joining(","));
}
/**
*
*/
public void updateProcessStatus(int processId, ProcessStatus status) {
jdbcTemplate.update("update project_process set `status`=? where id=?", status.getValue(), processId);
}
2022-12-23 09:24:05 +00:00
/**
* ID
*
* @param processId ID
* @return
*/
public SaleContract findSaleContract(int processId) {
TypedQuery<SaleContract> query = entityManager.createQuery(
"from SaleContract where processId=:processId", SaleContract.class);
query.setParameter("processId", processId);
return query.getSingleResult();
}
/**
* ID
*
* @param processId ID
* @return
*/
public ProcurementContract findProcurementContract(int processId) {
TypedQuery<ProcurementContract> query = entityManager.createQuery(
"from ProcurementContract where processId=:processId", ProcurementContract.class);
query.setParameter("processId", processId);
return query.getSingleResult();
}
public ProjectProcess getById(int id) {
return entityManager.find(ProjectProcess.class, id);
}
/**
*
*/
public void updateIncomeDetails(List<SaleContractDetailForm> incomeDetails) {
if (!CollectionUtils.isEmpty(incomeDetails)) {
jdbcTemplate.batchUpdate("update project_budget_income_detail set expiration_date =? where id =? ",
new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i) throws SQLException {
SaleContractDetailForm detailForm = incomeDetails.get(i);
ps.setString(1, detailForm.getExpirationDate());
ps.setInt(2, detailForm.getId());
}
@Override
public int getBatchSize() {
return incomeDetails.size();
}
});
}
}
2022-12-26 08:43:15 +00:00
public BigDecimal getProjectRepaidAmount(int projectId) {
Map<String, Object> map = jdbcTemplate.queryForMap(
"select ifnull(sum(underwritten_plan), 0) repaidAmount from project_budget_plan_detail where project_id = ?", projectId);
return (BigDecimal) map.values().iterator().next();
}
2022-12-23 09:24:05 +00:00
/**
*
*/
public void startAuditProgress(ProjectProcess entity) {
HashMap<String, Object> variables = new HashMap<>();
2022-12-26 08:43:15 +00:00
Project project = projectRepository.findById(entity.getProjectId());
// 是否垫资
variables.put("isPrepaid", isProjectPrepaid(project));
// 垫资金额
BigDecimal repaidAmount = getProjectRepaidAmount(entity.getProjectId());
variables.put("repaidAmount", repaidAmount);
// 合同金额
2022-12-27 06:18:04 +00:00
variables.put("contractAmount", project.getContractAmount() == null ? 0 : project.getContractAmount());
2022-12-26 08:43:15 +00:00
// 项目类型
2022-12-26 09:10:30 +00:00
variables.put("projectType", project.getType());
2022-12-26 08:43:15 +00:00
// 合作类型
2022-12-26 09:10:30 +00:00
variables.put("cooperationType", project.getCooperateType() == null ? 0 : project.getCooperateType());
2022-12-27 06:14:05 +00:00
// 部门领导ID
2022-12-27 06:18:04 +00:00
variables.put(ActConstant.DEPT_LEADER_ID, entity.getApplyDeptLeaderId());
2022-12-26 08:43:15 +00:00
2022-12-23 09:24:05 +00:00
startAuditProgress(entity, variables);
}
2022-12-26 08:43:15 +00:00
/**
*
*/
public boolean isProjectPrepaid(Project project) {
return project.getUnderwrittenMode() == 2 || project.getUnderwrittenMode() == 3;
}
2022-12-23 09:24:05 +00:00
/**
*
*/
@SneakyThrows
public void startAuditProgress(ProjectProcess entity, Map<String, Object> variables) {
if (entity.getStatus() == ProcessStatus.to_be_audit) {
switch (entity.getProcessType()) {
case sale_contract:
2022-12-23 09:44:31 +00:00
projectInstanceService.startProcessByProjectId(entity.getId(), ActProjectTypeEnum.SALE_CONTRACT, variables);
2022-12-23 09:24:05 +00:00
break;
2022-12-26 10:03:45 +00:00
case procurement_contract:
2022-12-23 09:44:31 +00:00
projectInstanceService.startProcessByProjectId(entity.getId(), ActProjectTypeEnum.BUSINESS_PURCHASE, variables);
2022-12-23 09:24:05 +00:00
break;
default:
throw new UnsupportedOperationException("还不支持");
}
}
}
2022-12-23 02:59:25 +00:00
}