销售合同清单明细 功能

在修改了数据库:
alter table project_budget_income_detail
    add column expiration_date varchar(32) NULL comment '质保期';

alter table project_budget_income_detail_temp
    add column expiration_date varchar(32) NULL comment '质保期';
master
Harry Yang 2022-12-14 14:20:25 +08:00
parent b115b252ee
commit 65d853fc7b
3 changed files with 116 additions and 38 deletions

View File

@ -1,14 +1,19 @@
package cn.palmte.work.controller.backend;
import org.springframework.jdbc.core.BatchPreparedStatementSetter;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
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.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Arrays;
@ -39,10 +44,13 @@ public class ProcessController {
private final ProjectRepository projectRepository;
private final ProjectBudgetService projectBudgetService;
public ProcessController(ProjectRepository projectRepository, DeptRepository deptRepository, ProjectBudgetService projectBudgetService) {
private final JdbcTemplate jdbcTemplate;
public ProcessController(ProjectRepository projectRepository, DeptRepository deptRepository, ProjectBudgetService projectBudgetService, JdbcTemplate jdbcTemplate) {
this.projectRepository = projectRepository;
this.deptRepository = deptRepository;
this.projectBudgetService = projectBudgetService;
this.jdbcTemplate = jdbcTemplate;
}
static class FormMetadata {
@ -191,7 +199,7 @@ public class ProcessController {
@ResponseBody
@PostMapping
public void post(SaleContractForm form) {
public void post(@RequestBody SaleContractForm form) {
System.out.println(form);
}
@ -216,9 +224,21 @@ public class ProcessController {
@ResponseBody
@PostMapping("/sale-contract-details")
public void saleContractDetails(SaleContractDetailForm form) {
public void saleContractDetails(@RequestBody List<SaleContractDetailForm> form) {
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 = form.get(i);
ps.setString(1, detailForm.expirationDate);
ps.setInt(2, detailForm.id);
}
@Override
public int getBatchSize() {
return form.size();
}
});
}
}

View File

@ -37,6 +37,10 @@ public class ProjectBudgetIncomeDetailBase {
@Column(name = "tax_rate")
private BigDecimal taxRate;
// 质保期 5 个字符
@Column(name = "expiration_date")
public String expirationDate;
public Integer getId() {
return id;
}
@ -117,6 +121,14 @@ public class ProjectBudgetIncomeDetailBase {
this.taxRate = taxRate;
}
public String getExpirationDate() {
return expirationDate;
}
public void setExpirationDate(String expirationDate) {
this.expirationDate = expirationDate;
}
public BigDecimal getTotalTaxInclude(){
if(null == price){
return null;

View File

@ -28,6 +28,10 @@
.admin-content-body {
margin-bottom: 100px;
}
.el-table__empty-block {
height: 60px !important;
}
</style>
<div class="admin-content" id="app">
@ -227,21 +231,27 @@
<#-- 销售合同清单明细 -->
<div class="am-u-sm-12 am-u-md-12" v-if="isSaleContractDetailMode">
<el-table border :data="businessPurchaseDetails">
<el-table-column type="index" :index="1" label="序号"></el-table-column>
<el-table border :data="saleContractDetails" @row-dblclick="dbclick">
<el-table-column type="index" :index="1" label="序号" fixed></el-table-column>
<el-table-column prop="name" label="名称" fixed width="120"></el-table-column>
<el-table-column prop="type" label="类别"></el-table-column>
<el-table-column prop="name" label="名称"></el-table-column>
<el-table-column prop="spec" label="规格型号"></el-table-column>
<el-table-column prop="param" label="参数"></el-table-column>
<el-table-column prop="unit" label="单位"></el-table-column>
<el-table-column prop="amount" label="数量"></el-table-column>
<el-table-column prop="price" label="单价"></el-table-column>
<el-table-column prop="price" label="单价" width="100"></el-table-column>
<el-table-column prop="taxRate" label="税率"></el-table-column>
<el-table-column prop="totalTaxInclude" label="含税金额"></el-table-column>
<el-table-column prop="totalTaxExclude" label="不含税金额"></el-table-column>
<el-table-column prop="totalTax" label="含税总金额"></el-table-column>
<el-table-column prop="totalTaxInclude" label="含税金额" width="100"></el-table-column>
<el-table-column prop="totalTaxExclude" label="不含税金额" width="100"></el-table-column>
<el-table-column prop="totalTax" label="含税总金额" width="100"></el-table-column>
<el-table-column prop="fee" label="税金"></el-table-column>
<el-table-column prop="expirationDate" label="质保期"></el-table-column>
<el-table-column prop="expirationDate" label="质保期" fixed="right" width="150">
<template slot-scope="scope">
<el-input maxlength="5" size="mini" placeholder="请输入质保期"
v-model="scope.row.expirationDate"></el-input>
</template>
</el-table-column>
</el-table>
@ -592,8 +602,6 @@
],
fileList: [],
saleContractDetails: [],
businessPurchaseDetails: [],
showBusinessPurchaseDetails: false,
}
}
@ -614,23 +622,36 @@
this.changeMode(saleContractProcess)
},
goToSaleContractDetail() {
this.changeMode(saleContractDetail)
const loading = this.$loading({
lock: true,
text: '正在加载项目',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
})
const { id } = this.processForm
if (id) {
this.changeMode(saleContractDetail)
const loading = this.$loading({
lock: true,
text: '正在加载项目',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
})
fetch("${base}/process/sale-contract-details/" + id)
.then(res => res.json())
.then(data => {
this.saleContractDetails = data
})
.catch(err => {
this.$message.error("销售合同清单明细加载失败");
})
.finally(() => loading.close())
}
else {
this.$message.warning("项目还未选择")
}
},
fetch("${base}/process/sale-contract-details/" + this.processForm.id)
.then(res => res.json())
.then(data => {
this.businessPurchaseDetails = data
})
.catch(err => {
this.$message.error("销售合同清单明细加载失败");
})
.finally(() => loading.close())
dbclick(row, event, column) {
row.input = !row.input
},
render(obj) {
console.log(obj)
},
queryProject(q, callback) {
@ -654,7 +675,7 @@
})
},
handleSelectProject(selected) {
const {id, name} = selected
const { id, name } = selected
if (!id) {
this.processForm = {}
return
@ -707,7 +728,11 @@
},
body: JSON.stringify(processForm),
}).then(response => {
this.$message({
showClose: true,
message: '提交成功',
type: 'success'
})
}).catch(err => {
this.$message.error("项目提交失败");
}).finally(() => loading.close())
@ -726,21 +751,25 @@
background: 'rgba(0, 0, 0, 0.7)'
})
const processForm = this.processForm
const form = this.saleContractDetails.map(detail => ({
id: detail.id, expirationDate: detail.expirationDate
}))
fetch("${base}/process/sale-contract-details", {
method: 'POST', // or 'PUT'
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(processForm),
body: JSON.stringify(form),
}).then(response => {
this.$message({
showClose: true,
message: '提交成功',
type: 'success'
})
this.goToSaleContractProcess()
}).catch(err => {
this.$message.error("项目提交失败");
}).finally(() => loading.close())
},
handleRemove(file, fileList) {
@ -766,7 +795,7 @@
data,
computed: {
projectTitle() {
const {projectNo, name, applyPerson, applyDate} = this.processForm
const { projectNo, name, applyPerson, applyDate } = this.processForm
if (projectNo && name) {
return projectNo.trim() + "-" + name.trim() + "-" + applyPerson + "-" + applyDate
}
@ -799,6 +828,23 @@
},
methods,
mounted() {
fetch("${base}/process/projects/135")
.then(res => res.json())
.then(data => {
this.processForm = {
sealType: [],
projectId: 135,
applyDate: new Date().toLocaleDateString(),
...data
}
this.projectSelected = true
})
.catch(err => {
this.$message.error("测试项目'加载失败");
})
},
})
</script>