This commit is contained in:
磷叶 2024-12-12 18:06:35 +08:00
parent 1e13611d0a
commit 6131dba97a
9 changed files with 198 additions and 92 deletions

View File

@ -19,20 +19,26 @@ export function getReport(reportId, params = {}) {
}
// 新增报表
export function addReport(data) {
export function addReport(data, submit) {
return request({
url: '/yh/report',
method: 'post',
data: data
data: data,
params: {
submit
}
})
}
// 修改报表
export function updateReport(data) {
export function updateReport(data, submit) {
return request({
url: '/yh/report',
method: 'put',
data: data
data: data,
params: {
submit
}
})
}

View File

@ -16,7 +16,6 @@
class="mini-table"
>
<el-table-column type="selection" align="center"/>
<!-- <el-table-column type="index" width="60" label="序号" align="center"/>-->
<el-table-column label="工序" align="center" prop="priceName">
<template #header>
<span class="required-label">工序</span>
@ -36,7 +35,7 @@
</form-col>
</template>
</el-table-column>
<el-table-column label="工序类型" align="center" >
<el-table-column label="工序类型" align="center" width="100">
<template scope="d">
<form-col table label-width="0" :prop="getProp(d.$index, 'priceType')" :rules="rules.priceType">
<hover-show>
@ -88,39 +87,39 @@
</form-col>
</template>
</el-table-column>
<el-table-column label="单价" align="center" prop="pricePrice" width="100">
<el-table-column label="单价" align="center" prop="pricePrice" width="80">
<template scope="d">
<form-col table label-width="0">
{{d.row.pricePrice | dv}}
</form-col>
</template>
</el-table-column>
<el-table-column label="总价" align="center" width="100">
<el-table-column label="总价" align="center" width="80">
<template scope="d">
<form-col table label-width="0">
{{ totalPrice(d.row) | dv }}
</form-col>
</template>
</el-table-column>
<el-table-column label="明细信息" align="center" width="160">
<el-table-column label="明细信息" align="center" width="200">
<template scope="d">
<div class="more-row" v-for="(userProd, index) of d.row.userProdList" @click="handleShowMore(d.row, d.$index)">
{{index + 1}}{{userProd.userName | dv}} {{userProd.num | dv}} {{d.row.priceUnit}}
</div>
<div class="more-row" v-for="(order, index) of d.row.orderProdList" @click="handleShowMore(d.row, d.$index)">
{{index + 1}}{{order.orderErpBillNo}} {{order.num}} {{d.row.priceUnit}}
</div>
<el-tag type="primary" size="mini" class="more-row" v-for="(userProd, index) of d.row.userProdList" @click="handleShowMore(d.row, d.$index)">
{{userProd.userName | dv}} {{userProd.num | dv}} {{d.row.priceUnit}}
</el-tag>
<el-tag type="success" size="mini" v-for="(order, index) of d.row.orderProdList" @click="handleShowMore(d.row, d.$index)">
{{order.orderErpBillNo}} {{order.num}} {{d.row.priceUnit}}
</el-tag>
</template>
</el-table-column>
<el-table-column width="160" align="center" label="操作">
<el-table-column width="120" align="center" label="操作">
<template slot-scope="d">
<el-button type="text" size="mini" @click="handleShowMore(d.row, d.$index)" icon="el-icon-edit">编辑</el-button>
<el-button
type="text"
icon="el-icon-delete"
size="mini"
@click="handleDel(d.$index)">
@click="handleDel(d.row, d.$index)">
删除
</el-button>
</template>
@ -242,6 +241,7 @@ export default {
deptId: this.form.deptId,
status: PriceStatus.PASS, //
disabled: false,
excludePriceIds: this.value.map(item => item.priceId)
}
}
},
@ -329,10 +329,14 @@ export default {
this.selection = selection;
},
//
handleDel(index) {
if (this.value != null) {
handleDel(row, index) {
this.$confirm(`确定删除工序【${row.priceName}】吗?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.value.splice(index, 1);
}
})
},
//
handleBatchUserProduct(){
@ -388,12 +392,15 @@ export default {
num: item.num
}
})
//
//
if (data.updateTotal) {
let totalCount = notNullDecimal(0);
row.userProdList.forEach(item => {
totalCount = notNullDecimal(item.num).add(totalCount);
})
row.num = totalCount.toNumber();
}
})
this.$message.success("批量编辑成功");
}

View File

@ -141,13 +141,20 @@ export default {
erpStatusList: [ProdOrderErpStatus.START_WORK],
materialCategory: this.reportProd.priceCategory,
materialSize: this.reportProd.priceSize,
excludeIds: this.value.map(item => item.orderId),
}
}
},
methods: {
isEmpty,
handleDel(index) {
this.$confirm(`确定删除与当前订单的关联吗?`, "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
this.value.splice(index, 1)
})
},
onChangeProdOrder(row, item) {
row.orderErpQty = item.erpQty;

View File

@ -136,7 +136,7 @@ export default {
this.$refs.form.validate(valid => {
if (valid) {
//
let error = this.checkNum(this.form);
let error = this.preCheckProd(this.form);
if (!isEmpty(error)) {
this.$message.warning(error);
return;

View File

@ -4,7 +4,7 @@
<el-table-column label="员工" align="center">
<template slot-scope="d">
<form-col table label-width="0" :prop="`userProdList[${d.$index}].userId`" :rules="rules.userId">
<user-input v-model="d.row.userId" open-type="dialog" :list-api="listUserWithShift" :query="userQuery"/>
<user-input v-model="d.row.userId" open-type="dialog" :list-api="listUserWithShift" :query="userQueryParams"/>
</form-col>
</template>
</el-table-column>
@ -38,7 +38,7 @@
type="text"
icon="el-icon-delete"
size="mini"
@click="handleDelUserProduct(d.$index)"
@click="handleDelUserProduct(d.row, d.$index)"
>删除
</el-button>
</template>
@ -51,7 +51,7 @@
:show.sync="showUserDialog"
:list-api="listUserWithShift"
@select="onSelectUsers"
:query="userQuery"
:query="userQueryParams"
/>
</div>
@ -101,6 +101,12 @@ export default {
}
},
computed: {
userQueryParams() {
return {
excludeUserIds: this.value.map(item => item.userId),
...this.userQuery
}
},
userIncome() {
return (num) => {
return calcMulDecimal(num, this.price);
@ -114,8 +120,14 @@ export default {
this.showUserDialog = true;
},
//
handleDelUserProduct(index) {
handleDelUserProduct(row, index) {
this.$confirm(`确定删除当前员工产量吗?`, "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
this.value.splice(index, 1);
})
},
//
onSelectUsers(list) {

View File

@ -1,14 +1,20 @@
<template>
<el-dialog :visible.sync="visible" title="批量编辑员工产量" close-on-click-modal width="800px">
<el-form :model="form" label-width="6em" size="mini">
<el-form :model="form" size="mini" :rules="rules" ref="form">
<el-row>
<form-col :span="24" label="工资模式">
<el-radio-group v-model="form.mode">
<el-radio :label="IncomeMode.COUNT">产量</el-radio>
<el-radio :label="IncomeMode.SCORE">计分</el-radio>
<el-radio-button :label="IncomeMode.COUNT">产量</el-radio-button>
<el-radio-button :label="IncomeMode.SCORE">计分</el-radio-button>
</el-radio-group>
<div v-show="form.mode === IncomeMode.SCORE" style="color: red; ">
请注意计分模式下需要提前输入选中行的<strong>总产量</strong>否则无法计算员工产量
请注意计分模式下需要提前输入选中行的 <strong>总产量</strong> 否则无法计算员工产量
</div>
</form-col>
<form-col :span="24" label="更新工序总产量" label-width="8em" v-if="form.mode === IncomeMode.COUNT">
<el-switch v-model="form.updateTotal" active-text="开启" inactive-text="关闭"/>
<div style="color: red; " v-show="form.updateTotal">
请注意开启之后将会根据员工产量汇总并覆盖原有的工序总产量
</div>
</form-col>
</el-row>
@ -25,24 +31,24 @@
</template>
<template slot-scope="d">
<form-col table label-width="0">
<user-input v-model="d.row.userId" :list-api="listUserWithShift" :query="userQuery"/>
<user-input v-model="d.row.userId" :list-api="listUserWithShift" :query="userQueryParams"/>
</form-col>
</template>
</el-table-column>
<el-table-column align="center">
<template #header>
<span class="required-label" v-if="form.mode === IncomeMode.COUNT">
产量
良品数
</span>
<span class="required-label" v-if="form.mode === IncomeMode.SCORE">
分数
</span>
</template>
<template slot-scope="d">
<form-col table label-width="0" v-if="form.mode === IncomeMode.COUNT">
<el-input v-model="d.row.num" type="number" placeholder="请输入员工产量" :min="0"/>
<form-col table label-width="0" v-if="form.mode === IncomeMode.COUNT" :prop="`list[${d.$index}].num`" :rules="rules.list.num">
<el-input v-model="d.row.num" type="number" placeholder="请输入员工产量" :min="1"/>
</form-col>
<form-col table label-width="0" v-if="form.mode === IncomeMode.SCORE">
<form-col table label-width="0" v-if="form.mode === IncomeMode.SCORE" :prop="`list[${d.$index}].score`" :rules="rules.list.score">
<el-input v-model="d.row.score" type="number" placeholder="请输入员工分数" :min="0"/>
</form-col>
</template>
@ -58,7 +64,7 @@
<user-dialog
:show.sync="showUserDialog"
multiple
:query="userQuery"
:query="userQueryParams"
:list-api="listUserWithShift"
@select="onSelectUsers"
/>
@ -94,8 +100,11 @@ export default {
}
},
computed: {
IncomeMode() {
return IncomeMode
userQueryParams() {
return {
excludeUserIds: this.form.list.map(item => item.userId),
...this.userQuery,
}
},
visible: {
get() {
@ -108,32 +117,60 @@ export default {
},
data() {
return {
IncomeMode,
form: {
mode: IncomeMode.COUNT
list: [],
mode: IncomeMode.COUNT,
updateTotal: true,
},
showUserDialog: false,
rules: {
list: {
num: [
{required: true, message: '请输入员工产量', trigger: 'blur'},
],
score: [
{required: true, message: '请输入员工分数', trigger: 'blur'},
]
}
}
}
},
methods: {
listUserWithShift,
onSubmit() {
this.$refs.form.validate(valid => {
if (valid) {
this.$confirm('【注意!】保存后将会覆盖已选中的员工产量数据,是否确认保存当前产量信息?', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$emit('submit', this.form);
})
} else {
this.$message.warning("表单校验不通过,请检查")
}
})
},
handleDel(index) {
this.$confirm(`确定删除当前员工产量吗?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(res => {
this.form.list.splice(index, 1);
})
},
handleAdd() {
this.showUserDialog = true;
},
onSelectUsers(list) {
if (isEmpty(this.form.list)) {
this.form.list = [];
}
list.forEach(item => {
this.form.list.push({
userId: item.userId,
userName: item.nickName,
num: 0,
num: null,
score: 10,
})
})

View File

@ -1,7 +1,8 @@
<template>
<div class="report-edit-container">
<div class="report-edit-container" v-loading="loading">
<edit-header :title="title">
<el-button type="primary" @click="submitForm" icon="el-icon-check" size="small">保存并提交</el-button>
<el-button type="primary" plain @click="submitForm(false)" icon="el-icon-check" size="small">仅保存</el-button>
<el-button type="primary" @click="submitForm(true)" icon="el-icon-s-check" size="small">保存并提交</el-button>
</edit-header>
<div class="app-container" style="padding-bottom: 64px">
@ -20,6 +21,7 @@
style="width: 100%;"
:clearable="false"
:editable="false"
:picker-options="pickerOptions"
/>
</form-col>
<form-col :span="span" label="总金额">
@ -113,7 +115,13 @@ export default {
},
headerCellStyle: {
backgroundColor: "#f5f7fa",
},
//
pickerOptions: {
disabledDate(date) {
return date.getTime() > Date.now();
}
},
}
},
computed: {
@ -149,21 +157,25 @@ export default {
})
},
/** 提交按钮 */
submitForm() {
submitForm(submit) {
this.form.totalAmount = this.totalPrice;
this.$refs["form"].validate(valid => {
if (valid) {
//
for (let i = 0; i < this.form.productList.length; i++) {
let error = this.checkNum(this.form.productList[i]);
let error = this.preCheckProd(this.form.productList[i]);
if (!isEmpty(error)) {
return this.$message.warning(`${i + 1}行工序产量校验未通过:${error}`);
}
}
this.$confirm(`确认${submit ? '保存并提交' : '保存'}当前报表?`, '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.loading = true;
if (this.form.reportId != null) {
updateReport(this.form).then(res => {
updateReport(this.form, submit).then(res => {
if (res.code === 200) {
this.$modal.msgSuccess("修改成功");
this.$tab.closeBack();
@ -172,7 +184,7 @@ export default {
this.loading = false;
})
} else {
addReport(this.form).then(res => {
addReport(this.form, submit).then(res => {
if (res.code === 200) {
this.$modal.msgSuccess("新增成功");
this.$tab.closeBack();
@ -181,6 +193,7 @@ export default {
this.loading = false;
})
}
})
} else {
this.$message.warning("表单校验未通过,请检查")
}

View File

@ -1,27 +1,50 @@
import {notNullDecimal} from "@/utils";
import {isEmpty, notNullDecimal} from "@/utils";
import Decimal from "decimal.js";
import {ReportPriceType} from "@/utils/constants";
export const $reportCheck = {
methods: {
/**
* 校验数量是否一致
* 提交前校验工序产量
*/
checkNum(row) {
preCheckProd(row) {
let num = notNullDecimal(row.num); // 良品数
let userNum = new Decimal(0); // 用户良品数
row.userProdList.forEach(item => {
userNum = userNum.add(notNullDecimal(item.num));
})
console.log(userNum.toNumber(), num.toNumber())
if (userNum.toNumber() > num.toNumber()) {
let totalUserNum = new Decimal(0); // 用户良品数
if (num.toNumber() < 1) {
return "良品数不允许小于1请检查";
}
// 校验员工产量
if (isEmpty(row.userProdList)) {
return "至少要填写一条员工产量";
}
for(let i = 0; i < row.userProdList.length; i++) {
let item = row.userProdList[i];
let userNum = notNullDecimal(item.num);
if (userNum.toNumber() < 1) {
return `${i+1}行员工产量不允许小于1请检查`;
}
totalUserNum = totalUserNum.add(userNum);
}
if (totalUserNum.toNumber() > num.toNumber()) {
return "员工总产量不允许超过工序总产量,请检查"
}
let orderNum = new Decimal(0); // 订单良品数
row.orderProdList.forEach(item => {
orderNum = orderNum.add(notNullDecimal(item.num));
})
if (orderNum.toNumber() > num.toNumber()) {
// 校验订单产量
if (row.priceType === ReportPriceType.BILL && isEmpty(row.orderProdList)) {
return "订单工序至少需要关联一个订单"
}
let totalOrderNum = new Decimal(0); // 订单良品数
for(let i = 0; i < row.orderProdList.length; i++) {
let item = row.orderProdList[i];
let orderNum = notNullDecimal(item.num);
if (orderNum.toNumber() < 1) {
return `${i+1}行订单产量不允许小于1请检查`;
}
totalOrderNum = totalOrderNum.add(orderNum);
}
if (totalOrderNum.toNumber() > num.toNumber()) {
return "订单总产量不允许超过工序总产量,请检查"
}
},

View File

@ -21,6 +21,7 @@
end-placeholder="结束时间"
value-format="yyyy-MM-dd HH:mm:ss"
:default-time="['00:00:00', '23:59:59']"
@change="handleQuery"
/>
</el-form-item>
<el-form-item label="创建部门" prop="deptId">