From 0e178b7ea916bbf5d216ad632972fa75c69433de Mon Sep 17 00:00:00 2001 From: Harry Yang Date: Fri, 23 Dec 2022 17:24:05 +0800 Subject: [PATCH] =?UTF-8?q?=E9=94=80=E5=94=AE=E5=90=88=E5=90=8C=E6=B8=85?= =?UTF-8?q?=E5=8D=95=E6=98=8E=E7=BB=86=20=E7=BC=96=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/backend/ProcessController.java | 140 ++- .../model/process/ProcurementContract.java | 4 +- .../work/model/process/ProjectProcess.java | 18 +- .../work/model/process/SaleContract.java | 4 +- .../work/model/process/SealTypeArray.java | 21 +- .../model/process/SealTypeArrayConverter.java | 2 +- .../model/process/form/ProcessUpdateForm.java | 56 ++ .../process/form/SaleContractProcessForm.java | 4 +- .../work/service/ProjectProcessService.java | 92 ++ .../admin/business/process-detail.ftl | 2 +- .../templates/admin/business/process-edit.ftl | 847 ++++++++++++++++++ .../templates/admin/business/process-new.ftl | 10 +- 12 files changed, 1143 insertions(+), 57 deletions(-) create mode 100644 src/main/java/cn/palmte/work/model/process/form/ProcessUpdateForm.java create mode 100644 src/main/resources/templates/admin/business/process-edit.ftl diff --git a/src/main/java/cn/palmte/work/controller/backend/ProcessController.java b/src/main/java/cn/palmte/work/controller/backend/ProcessController.java index dd548b9..131222e 100644 --- a/src/main/java/cn/palmte/work/controller/backend/ProcessController.java +++ b/src/main/java/cn/palmte/work/controller/backend/ProcessController.java @@ -9,24 +9,21 @@ import org.springframework.data.domain.ExampleMatcher; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; -import org.springframework.jdbc.core.BatchPreparedStatementSetter; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Controller; import org.springframework.transaction.annotation.Transactional; import org.springframework.ui.Model; -import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import java.math.BigDecimal; -import java.sql.PreparedStatement; -import java.sql.SQLException; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.ArrayList; @@ -59,7 +56,7 @@ import cn.palmte.work.model.process.ProjectProcessRepository; import cn.palmte.work.model.process.SaleContract; import cn.palmte.work.model.process.SealTypeArray; import cn.palmte.work.model.process.form.ProcessQueryForm; -import cn.palmte.work.model.process.form.SaleContractDetailForm; +import cn.palmte.work.model.process.form.ProcessUpdateForm; import cn.palmte.work.model.process.form.SaleContractProcessForm; import cn.palmte.work.service.ProjectBudgetService; import cn.palmte.work.service.ProjectInstanceService; @@ -120,6 +117,17 @@ public class ProcessController { return "/admin/business/process-new"; } + /** + * 编辑流程 + */ + @GetMapping("/edit/{id}") + public String editProcess(Model model, @PathVariable int id) { + model.addAttribute("sealTypes", SealType.values()); + model.addAttribute("taxRate", Arrays.asList(0, 1, 3, 4, 5, 6, 9, 10, 13)); + model.addAttribute("processId", id); + return "/admin/business/process-edit"; + } + /** * 已办流程 */ @@ -232,6 +240,9 @@ public class ProcessController { // 预算毛利率 public BigDecimal budgetGrossMargin; + + public Object contract; + public ProjectProcess process; } @ResponseBody @@ -265,6 +276,46 @@ public class ProcessController { return project.getUnderwrittenMode() == 2 || project.getUnderwrittenMode() == 3 ? "是" : "否"; } + @ResponseBody + @GetMapping("/{id}") + public ProjectReturnValue get(@PathVariable int id) { + ProjectProcess process = processService.getById(id); + Project project = projectRepository.findById(process.getProjectId()); + BigDecimal repaidAmount = getRepaidAmount(id); + Object contract; + switch (process.getProcessType()) { + case sale_contract: { + contract = processService.findSaleContract(process.getId()); + break; + } + case business_procurement: { + contract = processService.findProcurementContract(process.getId()); + break; + } + default: + throw new UnsupportedOperationException("还不支持"); + } + + // 可以在对应表数据查询 是否存在再启用 + List incomeDetails = projectBudgetService.getBudgetIncomeDetail(project); + return ProjectReturnValue.builder() + .process(process) + .contract(contract) + .isPrepaid(isPrepaid(project)) + .projectId(project.getId()) + .incomeDetails(incomeDetails) + .projectName(project.getName()) + .repaidAmount(repaidAmount + "元") + .budgetGrossMargin(project.getGrossProfitMargin()) + .projectNo(project.getProjectNo()) + .applyPersonName(process.getApplyPersonName()) + .contractAmount(project.getContractAmount()) + .terminalCustomer(project.getTerminalCustomer()) + .projectType(Enumerable.of(ProjectType.class, project.getType()).getDescription()) + .cooperationType(Enumerable.of(CooperationType.class, project.getCooperateType()).getDescription()) + .build(); + } + // 销售合同流程 @ResponseBody @@ -280,10 +331,6 @@ public class ProcessController { entity.setApplyPersonId(admin.getId()); entity.setAttachmentUri(JSON.toJSONString(form.getAttachments())); - if (entity.getStatus() == null) { - entity.setStatus(ProcessStatus.to_be_audit); - } - entityManager.persist(entity); HashMap variables = new HashMap<>(); @@ -306,38 +353,55 @@ public class ProcessController { } } - if (entity.getStatus() == ProcessStatus.to_be_audit) { - variables.put("process", entity); - switch (entity.getProcessType()) { - case sale_contract: - projectInstanceService.startSaleContractProcess(entity.getId(), variables); - break; - case business_procurement: - projectInstanceService.startBusinessPurchaseProcess(entity.getId(), variables); - break; - default: - throw new UnsupportedOperationException("还不支持"); + processService.updateIncomeDetails(form.getIncomeDetails()); + processService.startAuditProgress(entity, variables); + + } + + @ResponseBody + @PutMapping + @Transactional + public void update(@RequestBody @Valid ProcessUpdateForm form) throws Exception { + ProjectProcess entity = processService.getById(form.getId()); + + entity.setTaxRate(form.getTaxRate()); + entity.setContractNo(form.getContractNo()); + entity.setContractName(form.getContractName()); + + entity.setSealTypes(SealTypeArray.of(form.getSealTypes())); + entity.setApplyDept(String.join(",", form.getApplyDept())); + entity.setAttachmentUri(JSON.toJSONString(form.getAttachments())); + + entityManager.merge(entity); + + HashMap variables = new HashMap<>(); + switch (entity.getProcessType()) { + case sale_contract: { + SaleContract contract = processService.findSaleContract(form.getId()); + contract.setClientName(form.getClientName()); + contract.setPaymentTerms(form.getPaymentTerms()); + contract.setApplyPersonPhone(form.getApplyPersonPhone()); + + entityManager.merge(contract); + variables.put("contract", contract); + break; } + case business_procurement: { + ProcurementContract contract = processService.findProcurementContract(form.getId()); + contract.setMode(form.getProcurementMode()); + contract.setPaymentTerms(form.getPaymentTerms()); + contract.setSupplierName(form.getSupplierName()); + + entityManager.merge(contract); + variables.put("contract", contract); + break; + } + default: + throw new UnsupportedOperationException("还不支持"); } - List incomeDetails = form.getIncomeDetails(); - 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(); - } - }); - } + processService.startAuditProgress(entity, variables); + processService.updateIncomeDetails(form.getIncomeDetails()); } @ResponseBody diff --git a/src/main/java/cn/palmte/work/model/process/ProcurementContract.java b/src/main/java/cn/palmte/work/model/process/ProcurementContract.java index 7f157c0..0e3fe4d 100644 --- a/src/main/java/cn/palmte/work/model/process/ProcurementContract.java +++ b/src/main/java/cn/palmte/work/model/process/ProcurementContract.java @@ -2,6 +2,8 @@ package cn.palmte.work.model.process; import org.hibernate.annotations.GenericGenerator; +import java.io.Serializable; + import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; @@ -21,7 +23,7 @@ import lombok.Data; @Data @Entity @Table(name = "procurement_contract") -public class ProcurementContract { +public class ProcurementContract implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/src/main/java/cn/palmte/work/model/process/ProjectProcess.java b/src/main/java/cn/palmte/work/model/process/ProjectProcess.java index 2a7044b..dbbe245 100644 --- a/src/main/java/cn/palmte/work/model/process/ProjectProcess.java +++ b/src/main/java/cn/palmte/work/model/process/ProjectProcess.java @@ -1,9 +1,15 @@ package cn.palmte.work.model.process; import com.fasterxml.jackson.annotation.JsonFormat; +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; import org.hibernate.annotations.GenericGenerator; +import java.io.IOException; +import java.io.Serializable; import java.time.LocalDate; import java.time.LocalDateTime; @@ -29,7 +35,7 @@ import lombok.Data; @Data @Entity @Table(name = "project_process") -public class ProjectProcess { +public class ProjectProcess implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -66,6 +72,7 @@ public class ProjectProcess { private String contractName; // 用印类型 + @JsonSerialize(using = SealTypeArraySerializer.class) @Convert(converter = SealTypeArrayConverter.class) private SealTypeArray sealTypes; @@ -105,4 +112,13 @@ public class ProjectProcess { // 合作类型 // @Enumerated(EnumType.STRING) // private CooperationType cooperationType; + + static class SealTypeArraySerializer extends JsonSerializer { + + @Override + public void serialize(SealTypeArray value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + serializers.defaultSerializeValue(value.getList(), gen); + } + } + } diff --git a/src/main/java/cn/palmte/work/model/process/SaleContract.java b/src/main/java/cn/palmte/work/model/process/SaleContract.java index e013ab2..0d5dd7e 100644 --- a/src/main/java/cn/palmte/work/model/process/SaleContract.java +++ b/src/main/java/cn/palmte/work/model/process/SaleContract.java @@ -2,6 +2,8 @@ package cn.palmte.work.model.process; import org.hibernate.annotations.GenericGenerator; +import java.io.Serializable; + import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; @@ -20,7 +22,7 @@ import lombok.Data; @Data @Entity @Table(name = "sale_contract") -public class SaleContract { +public class SaleContract implements Serializable { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/src/main/java/cn/palmte/work/model/process/SealTypeArray.java b/src/main/java/cn/palmte/work/model/process/SealTypeArray.java index 9f0c150..d61be6f 100644 --- a/src/main/java/cn/palmte/work/model/process/SealTypeArray.java +++ b/src/main/java/cn/palmte/work/model/process/SealTypeArray.java @@ -16,31 +16,30 @@ import cn.palmte.work.model.enums.SealType; * @author Harry Yang * @since 2.0 2022/12/14 16:35 */ -//@JsonSerialize @Convert(converter = SealTypeArrayConverter.class) public class SealTypeArray { public static final SealTypeArray EMPTY = new SealTypeArray(); - private final List sealTypes = new ArrayList<>(); + private final List list = new ArrayList<>(); public SealTypeArray() { } - public SealTypeArray(SealType... sealTypes) { - Collections.addAll(this.sealTypes, sealTypes); + public SealTypeArray(SealType... list) { + Collections.addAll(this.list, list); } - public List getSealTypes() { - return sealTypes; + public List getList() { + return list; } - public void setSealTypes(List sealTypes) { - this.sealTypes.clear(); - this.sealTypes.addAll(sealTypes); + public void setList(List list) { + this.list.clear(); + this.list.addAll(list); } @Override public String toString() { - return sealTypes.stream() + return list.stream() .map(SealType::getDescription) .collect(Collectors.joining(",")); } @@ -59,7 +58,7 @@ public class SealTypeArray { public static SealTypeArray of(Collection sealTypes) { SealTypeArray sealTypeArray = new SealTypeArray(); - sealTypeArray.sealTypes.addAll(sealTypes); + sealTypeArray.list.addAll(sealTypes); return sealTypeArray; } diff --git a/src/main/java/cn/palmte/work/model/process/SealTypeArrayConverter.java b/src/main/java/cn/palmte/work/model/process/SealTypeArrayConverter.java index eb36c59..e0fad17 100644 --- a/src/main/java/cn/palmte/work/model/process/SealTypeArrayConverter.java +++ b/src/main/java/cn/palmte/work/model/process/SealTypeArrayConverter.java @@ -20,7 +20,7 @@ public class SealTypeArrayConverter implements AttributeConverter sealTypes = attribute.getSealTypes(); + List sealTypes = attribute.getList(); if (sealTypes.isEmpty()) { return null; } diff --git a/src/main/java/cn/palmte/work/model/process/form/ProcessUpdateForm.java b/src/main/java/cn/palmte/work/model/process/form/ProcessUpdateForm.java new file mode 100644 index 0000000..151c3b5 --- /dev/null +++ b/src/main/java/cn/palmte/work/model/process/form/ProcessUpdateForm.java @@ -0,0 +1,56 @@ +package cn.palmte.work.model.process.form; + +import java.util.List; + +import javax.validation.constraints.NotNull; + +import cn.palmte.work.model.enums.ProcessType; +import cn.palmte.work.model.enums.ProcurementMode; +import cn.palmte.work.model.process.ProcessAttachment; +import lombok.Data; + +/** + * 流程合同更新 + * + * @author Harry Yang + * @since 2.0 2022/12/23 16:39 + */ +@Data +public class ProcessUpdateForm { + + @NotNull + private Integer id; + + private String[] applyDept; + + // 合同编号 + private String contractNo; + + // 合同名称 + private String contractName; + + // 用印类型 + private String[] sealTypes; + + // 税率 + private String taxRate; + + // 收款条件 + private String paymentTerms; + // 备注 + private String remark; + + // 客户名称 + private String clientName; + + // 申请人电话 + private String applyPersonPhone; + + private ProcurementMode procurementMode; + + private String supplierName; + + private List attachments; + + private List incomeDetails; +} diff --git a/src/main/java/cn/palmte/work/model/process/form/SaleContractProcessForm.java b/src/main/java/cn/palmte/work/model/process/form/SaleContractProcessForm.java index 2bb95a6..e44814e 100644 --- a/src/main/java/cn/palmte/work/model/process/form/SaleContractProcessForm.java +++ b/src/main/java/cn/palmte/work/model/process/form/SaleContractProcessForm.java @@ -1,6 +1,5 @@ package cn.palmte.work.model.process.form; -import java.time.LocalDate; import java.util.List; import javax.validation.constraints.NotNull; @@ -67,6 +66,9 @@ public class SaleContractProcessForm { // 收款条件 private String paymentTerms; + // 备注 + private String remark; + private ProcessStatus status; private ProcessType processType; diff --git a/src/main/java/cn/palmte/work/service/ProjectProcessService.java b/src/main/java/cn/palmte/work/service/ProjectProcessService.java index 3a44f4c..0dd5b21 100644 --- a/src/main/java/cn/palmte/work/service/ProjectProcessService.java +++ b/src/main/java/cn/palmte/work/service/ProjectProcessService.java @@ -1,10 +1,15 @@ package cn.palmte.work.service; +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; @@ -12,7 +17,12 @@ 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 @@ -24,6 +34,7 @@ public class ProjectProcessService { private final JdbcTemplate jdbcTemplate; private final EntityManager entityManager; + private final ProjectInstanceService projectInstanceService; /** * 更新流程 审批人,和状态 @@ -61,4 +72,85 @@ public class ProjectProcessService { 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.startSaleContractProcess(entity.getId(), variables); + break; + case business_procurement: + projectInstanceService.startBusinessPurchaseProcess(entity.getId(), variables); + break; + default: + throw new UnsupportedOperationException("还不支持"); + } + } + } + } diff --git a/src/main/resources/templates/admin/business/process-detail.ftl b/src/main/resources/templates/admin/business/process-detail.ftl index 8d6daf3..d5c9ca6 100644 --- a/src/main/resources/templates/admin/business/process-detail.ftl +++ b/src/main/resources/templates/admin/business/process-detail.ftl @@ -59,7 +59,7 @@ ${project.terminalCustomer} - <#list process.sealTypes.sealTypes as item> + <#list process.sealTypes.list as item> ${item.description} diff --git a/src/main/resources/templates/admin/business/process-edit.ftl b/src/main/resources/templates/admin/business/process-edit.ftl new file mode 100644 index 0000000..38f340a --- /dev/null +++ b/src/main/resources/templates/admin/business/process-edit.ftl @@ -0,0 +1,847 @@ +<#assign base=request.contextPath /> +<#import "../../common/defaultLayout.ftl" as defaultLayout> +<@defaultLayout.layout> +<#-- --> + + + +
+
+
+
业务应用 / + {{subTitle}}
+
+ +
+ <#-- 新增销售合同流程 --> + +
+ + +
+ + {{processForm.projectNo}} + + + + + {{projectTitle}} + + + + + {{processForm.applyDate}} + + + + {{processForm.projectType}} + + + + {{processForm.cooperationType}} + + +
+ +
+ + + + + + + {{processForm.applyPersonName}} + + + + {{processForm.applyDeptLeaderName}} + + + + + + +
+ +
+ + + + + + + + + + + {{processForm.contractAmount}}元 + + +
+ +
+ + + + + + <#--TODO 最终用户名称--> + {{processForm.terminalCustomer}} + +
+ +
+ + + <#list sealTypes as sealType> + ${sealType.description} + + + +
+ +
+ + + + <#list taxRate as rate> + + + + + + + {{processForm.isPrepaid}} + + + + {{processForm.repaidAmount}} + + + + {{processForm.budgetGrossMargin}} + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + 点击上传 +
只能上传PDF、excel、word、图片、压缩包,且不超过50MB
+
+
+
+ +
+ + 详细清单 + +
+ +
+ + <#-- --> + + 返回上一级 + 保存草稿 + 提交 + + + +
+ + <#-- 销售合同清单明细 --> + +
+ + + + + + + + + + + + + + + + + + + + + + 返回上一级 + 保存并返回上一级 + + +
+ + <#-- 新增业务采购合同流程 --> + +
+
+
+ +
+ + + + +
+ +
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+ +
+ +
+ + + + +
+ +
+ + +
+ +
+ + +
+ +
+ +
+ +
+ +
+ +
+ +
+ +
+ + <#-- 选择 业务采购清单明细 --> + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ +
+ +
+ + + + + + + + diff --git a/src/main/resources/templates/admin/business/process-new.ftl b/src/main/resources/templates/admin/business/process-new.ftl index e9a9450..8cfc765 100644 --- a/src/main/resources/templates/admin/business/process-new.ftl +++ b/src/main/resources/templates/admin/business/process-new.ftl @@ -36,7 +36,8 @@ .el-upload-list__item-name [class^="el-icon"] { height: unset; } - .el-checkbox{ + + .el-checkbox { margin-right: 10px; } @@ -244,7 +245,7 @@ 返回上一级 保存草稿 - 提交 + 提交 @@ -734,6 +735,11 @@ this.submit() }, + submitForm() { + this.processForm.status = 'to_be_audit' + this.submit() + }, + submit() { this.$refs["saleContractProcessForm"].validate((valid) => { if (valid) {