package cn.palmte.work.service;
import cn.palmte.work.config.activiti.ActProjectTypeEnum;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import javax.persistence.EntityManager;
import javax.persistence.TypedQuery;
import cn.palmte.work.model.Admin;
import cn.palmte.work.model.enums.ProcessStatus;
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;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
/**
* @author Harry Yang
* @since 2.0 2022/12/23 09:39
*/
@Service
@RequiredArgsConstructor
public class ProjectProcessService {
private final JdbcTemplate jdbcTemplate;
private final EntityManager entityManager;
private final ProjectInstanceService projectInstanceService;
/**
* 更新流程 审批人,和状态
*
* @param processId 流程Id
* @param auditId 审批人ID
* @param status 流程状态 可以为空,为空的时候不修改
*/
public void updateAudit(int processId, ProcessStatus status, List 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 auditId) {
TypedQuery query = entityManager.createQuery("from Admin where id in (:ids)", Admin.class);
query.setParameter("ids", auditId);
List 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);
}
/**
* 根据流程ID查询销售合同
*
* @param processId 流程ID
* @return 销售合同
*/
public SaleContract findSaleContract(int processId) {
TypedQuery 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 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 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();
}
});
}
}
/**
* 发起流程审批
*/
public void startAuditProgress(ProjectProcess entity) {
HashMap variables = new HashMap<>();
startAuditProgress(entity, variables);
}
/**
* 发起流程审批
*/
@SneakyThrows
public void startAuditProgress(ProjectProcess entity, Map variables) {
if (entity.getStatus() == ProcessStatus.to_be_audit) {
variables.put("process", entity);
switch (entity.getProcessType()) {
case sale_contract:
projectInstanceService.startProcessByProjectId(entity.getId(), ActProjectTypeEnum.SALE_CONTRACT, variables);
break;
case business_procurement:
projectInstanceService.startProcessByProjectId(entity.getId(), ActProjectTypeEnum.BUSINESS_PURCHASE, variables);
break;
default:
throw new UnsupportedOperationException("还不支持");
}
}
}
}