更新统计数据

This commit is contained in:
磷叶 2025-02-28 15:49:23 +08:00
parent 780ed10ece
commit 7fad93f2ae
19 changed files with 619 additions and 364 deletions

View File

@ -0,0 +1,10 @@
import request from '@/utils/request'
// 报表统计
export function getReportSum(query) {
return request({
url: '/dashboard/report/sum',
method: 'get',
params: query
})
}

View File

@ -0,0 +1,10 @@
import request from '@/utils/request'
// 订单产量统计
export function getReportOrderProdSum(query) {
return request({
url: '/dashboard/reportOrderProd/sum',
method: 'get',
params: query
})
}

View File

@ -0,0 +1,10 @@
import request from '@/utils/request'
// 报表产量统计
export function getReportProdSum(query) {
return request({
url: '/dashboard/reportProd/sum',
method: 'get',
params: query
})
}

View File

@ -0,0 +1,10 @@
import request from '@/utils/request'
// 员工产量统计
export function getReportUserProdSum(query) {
return request({
url: '/dashboard/reportUserProd/sum',
method: 'get',
params: query
})
}

View File

@ -239,16 +239,20 @@ aside {
display: flex;
justify-content: space-between;
align-items: center;
}
.card-operator {
.card-operator {
border-top: 1px solid #f0f0f0;
padding-top: 12px;
width: 100%;
display: flex;
justify-content: flex-end;
align-items: center;
// 卡片上的按钮
.card-btn {
padding-top: 0 !important;
padding-bottom: 0 !important;
}
}
}
.fixed {
@ -286,6 +290,14 @@ aside {
padding-left: 0px;
padding-right: 0px;
}
.el-table__body-wrapper {
&::-webkit-scrollbar {
display: none !important;
}
-ms-overflow-style: none !important; /* IE and Edge */
scrollbar-width: none !important; /* Firefox */
}
}
.table-form.el-table th.el-table__cell > .cell {

View File

@ -0,0 +1,76 @@
<template>
<el-cascader
v-model="selectValue"
:placeholder="placeholder"
clearable
filterable
v-on="$listeners"
style="width: 100%;"
:options="options"
:show-all-levels="false"
:props="{
emitPath: false,
multiple: multiple,
expandTrigger: 'hover',
value: 'deptId',
label: 'deptName',
checkStrictly: checkStrictly
}"
/>
</template>
<script>
import { listDept } from "@/api/system/dept";
export default {
name: "DeptSelect",
props: {
value: {
type: [String, Array],
default: null
},
placeholder: {
type: String,
default: "请选择部门"
},
disabled: {
type: Boolean,
default: false
},
multiple: {
type: Boolean,
default: false
},
//
checkStrictly: {
type: Boolean,
default: false
}
},
data() {
return {
options: [],
};
},
computed: {
selectValue: {
get() {
return this.value;
},
set(val) {
this.$emit("input", val);
}
}
},
created() {
this.getOptions();
},
methods: {
getOptions() {
listDept().then(response => {
this.options = this.handleTree(response.data, "deptId", "parentId", "children");
});
},
}
};
</script>

View File

@ -15,7 +15,7 @@
<div class="search-container">
<el-input
v-model="queryParams.keyword"
placeholder="搜索订单编号/物料编码"
placeholder="搜索订单编号/物料编码/计划跟踪号"
clearable
prefix-icon="el-icon-search"
@input="getList"
@ -61,6 +61,10 @@
<div class="label">物料:</div>
<div class="value">{{ item.materialNumber | dv}}</div>
</div>
<div class="detail-item">
<div class="label">计划跟踪号:</div>
<div class="value">{{ item.erpMtoNo | dv}}</div>
</div>
</div>
</div>
<div class="check-icon">

View File

@ -15,18 +15,18 @@
:value="dict.value"
/>
</el-select>
<dept-tree-select v-else-if="type === 'dept'" v-model="queryParams[prop]" class="small-tree-select" width="200px" @change="handleQuery"/>
<dept-select v-else-if="type === 'dept'" v-model="queryParams[prop]" check-strictly @change="handleQuery"/>
<date-range-picker v-else-if="type === 'daterange'" v-model="queryParams[prop]" @change="handleQuery"/>
</el-form-item>
</template>
<script>
import DeptTreeSelect from "@/components/Business/Dept/DeptTreeSelect.vue";
import DeptSelect from "@/components/Business/Dept/DeptSelect.vue";
import DateRangePicker from "@/components/DateRangePicker/index.vue";
export default {
name: "SearchFormItem",
components: {DateRangePicker, DeptTreeSelect},
components: {DateRangePicker, DeptSelect},
props: {
queryParams: {
type: Object,

View File

@ -1,5 +1,5 @@
<template>
<el-table-column class="table-form-col" :header-align="align" :align="align" :width="width" >
<el-table-column class="table-form-col" :prop="prop" :header-align="align" :align="align" :width="width" >
<template #header>
<div @click="handleClickHeader">
<span :class="required ? 'required-label' : ''">{{label}}</span>

View File

@ -5,7 +5,7 @@ const filters = {
},
// 缺省值
defaultValue(data) {
return data == null ? '--' : data;
return data == null || data.length == 0 ? '--' : data;
},
fix2(num) {
if (num == null) {

View File

@ -41,45 +41,9 @@
<el-card class="card-box">
<template #header>
<el-row class="card-header">
<el-col>
<el-col style="font-size: 14px;">
{{report.deptName}} {{report.reportDate}} 日报表
</el-col>
<el-col class="card-operator">
<el-button
type="text"
icon="el-icon-refresh"
@click="handleCancel(report)"
v-has-permi="['yh:report:cancel']"
v-show="ReportStatus.canCancel(report.status)"
style="padding: 0;"
>取消提交</el-button>
<el-button
type="text"
icon="el-icon-check"
@click="handleSubmit(report)"
v-has-permi="['yh:report:submit']"
v-show="ReportStatus.canSubmit(report.status)"
style="padding: 0;"
>提交</el-button>
<el-button
type="text"
icon="el-icon-edit"
class="card-btn"
@click="handleUpdate(report)"
v-has-permi="['yh:report:edit']"
v-show="ReportStatus.canEdit(report.status)"
style="padding: 0;"
>编辑</el-button>
<el-button
type="text"
icon="el-icon-delete"
class="card-btn"
@click="handleDelete(report)"
v-has-permi="['yh:report:remove']"
v-show="ReportStatus.canDel(report.status)"
style="padding: 0;"
>删除</el-button>
</el-col>
</el-row>
</template>
<div class="card-content" @click="handleView(report)">
@ -97,6 +61,44 @@
</el-descriptions-item>
</el-descriptions>
</div>
<div class="card-operator">
<el-button
type="text"
size="mini"
icon="el-icon-refresh"
@click="handleCancel(report)"
v-has-permi="['yh:report:cancel']"
v-show="ReportStatus.canCancel(report.status)"
style="padding: 0;"
>取消提交</el-button>
<el-button
type="text"
size="mini"
icon="el-icon-check"
@click="handleSubmit(report)"
v-has-permi="['yh:report:submit']"
v-show="ReportStatus.canSubmit(report.status)"
style="padding: 0;"
>提交</el-button>
<el-button
type="text"
size="mini"
icon="el-icon-edit"
@click="handleUpdate(report)"
v-has-permi="['yh:report:edit']"
v-show="ReportStatus.canEdit(report.status)"
style="padding: 0;"
>编辑</el-button>
<el-button
type="text"
size="mini"
icon="el-icon-delete"
@click="handleDelete(report)"
v-has-permi="['yh:report:remove']"
v-show="ReportStatus.canDel(report.status)"
style="padding: 0;"
>删除</el-button>
</div>
</el-card>
</el-col>
</el-row>
@ -135,7 +137,7 @@ export default {
row: {},
//
columns: [
{key: 'reportId', visible: true, label: '报表编号', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'reportId', visible: false, label: '报表编号', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'deptName', visible: false, label: '部门', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'reportDate', visible: false, label: '报表日期', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'status', visible: true, label: '状态', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
@ -143,10 +145,10 @@ export default {
{key: 'remark', visible: true, label: '备注', minWidth: null, sortable: false, overflow: false, align: 'center', width: "180"},
{key: 'createBy', visible: true, label: '创建人', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'createTime', visible: true, label: '创建时间', minWidth: null, sortable: true, overflow: false, align: 'center', width: "180"},
{key: 'updateBy', visible: true, label: '更新人', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'updateTime', visible: true, label: '更新时间', minWidth: null, sortable: true, overflow: false, align: 'center', width: "180"},
{key: 'verifyBy', visible: true, label: '审核人', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'verifyTime', visible: true, label: '审核时间', minWidth: null, sortable: false, overflow: false, align: 'center', width: "180"},
{key: 'updateBy', visible: false, label: '更新人', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'updateTime', visible: false, label: '更新时间', minWidth: null, sortable: true, overflow: false, align: 'center', width: "180"},
{key: 'verifyBy', visible: false, label: '审核人', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'verifyTime', visible: false, label: '审核时间', minWidth: null, sortable: false, overflow: false, align: 'center', width: "180"},
],
//
orderSorts: ['ascending', 'descending', null],

View File

@ -1,7 +1,15 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="100px">
<el-form-item label="单据编号" prop="erpBillNo">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="5em">
<el-form-item label="计划跟踪号" prop="erpMtoNo" label-width="6em">
<el-input
v-model="queryParams.erpMtoNo"
placeholder="请输入计划跟踪号"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="编号" prop="erpBillNo">
<el-input
v-model="queryParams.erpBillNo"
placeholder="请输入单据编号"
@ -9,16 +17,6 @@
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="单据状态" prop="erpDocumentStatus">
<el-select v-model="queryParams.erpDocumentStatus" placeholder="请选择单据状态" clearable @change="handleQuery">
<el-option
v-for="dict in dict.type.prod_order_erp_document_status"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="是否返工" prop="erpIsRework">
<el-radio-group v-model="queryParams.erpIsRework">
<el-radio :label="null">全部</el-radio>
@ -27,9 +25,12 @@
</el-radio-group>
</el-form-item>
<el-form-item label="生产车间" prop="deptId">
<dept-tree-select v-model="queryParams.deptId" class="small-tree-select" @change="handleQuery"/>
<dept-select v-model="queryParams.deptId" @change="handleQuery"/>
</el-form-item>
<el-form-item label="业务状态" prop="erpStatusList">
<el-form-item label="物料" prop="materialNumber">
<el-input v-model="queryParams.materialNumber" placeholder="请输入物料" clearable @keyup.enter.native="handleQuery"/>
</el-form-item>
<el-form-item label="状态" prop="erpStatusList">
<el-checkbox-group v-model="queryParams.erpStatusList" @change="handleQuery">
<el-checkbox-button
v-for="dict in dict.type.prod_order_erp_status"
@ -39,21 +40,6 @@
</el-checkbox-button>
</el-checkbox-group>
</el-form-item>
<el-form-item label="物料规格" prop="materialCategory">
<el-input v-model="queryParams.materialCategory" placeholder="请输入物料规格" clearable @keyup.enter.native="handleQuery"/>
</el-form-item>
<el-form-item label="物料大小" prop="materialSize">
<el-input v-model="queryParams.materialSize" placeholder="请输入物料大小" clearable @keyup.enter.native="handleQuery"/>
</el-form-item>
<el-form-item label="表面处理" prop="materialSurface">
<el-input v-model="queryParams.materialSurface" placeholder="请输入物料表面处理" clearable @keyup.enter.native="handleQuery"/>
</el-form-item>
<el-form-item label="盖子方式" prop="materialCover">
<el-input v-model="queryParams.materialCover" placeholder="请输入物料盖子方式" clearable @keyup.enter.native="handleQuery"/>
</el-form-item>
<el-form-item label="盖子方式" prop="materialGraphics">
<el-input v-model="queryParams.materialGraphics" placeholder="请输入物料图案" clearable @keyup.enter.native="handleQuery"/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
@ -105,7 +91,7 @@
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="prodOrderList" @selection-change="handleSelectionChange" :default-sort="defaultSort" @sort-change="onSortChange">
<el-table size="mini" max-height="600px" v-loading="loading" :data="prodOrderList" @selection-change="handleSelectionChange" :default-sort="defaultSort" @sort-change="onSortChange">
<el-table-column type="selection" width="55" align="center" />
<template v-for="column of showColumns">
<el-table-column
@ -124,24 +110,33 @@
{{d.row[column.key]}}
</template>
<template v-else-if="column.key === 'erpDocumentStatus'">
<dict-tag :options="dict.type.prod_order_erp_document_status" :value="d.row[column.key]"/>
<dict-tag :options="dict.type.prod_order_erp_document_status" :value="d.row[column.key]" size="mini"/>
</template>
<template v-else-if="column.key === 'erpStatus'">
<dict-tag :options="dict.type.prod_order_erp_status" :value="d.row[column.key]"/>
<dict-tag :options="dict.type.prod_order_erp_status" :value="d.row[column.key]" size="mini"/>
</template>
<template v-else-if="column.key === 'erpReqSrc'">
<dict-tag :options="dict.type.prod_order_erp_req_src" :value="d.row[column.key]"/>
<dict-tag :options="dict.type.prod_order_erp_req_src" :value="d.row[column.key]" size="mini"/>
</template>
<template v-else-if="column.key === 'erpIsRework'">
<boolean-tag :value="d.row.erpIsRework"/>
<boolean-tag :value="d.row.erpIsRework" size="mini"/>
</template>
<template v-else-if="column.key === 'percentage'">
<prod-order-progress :percentage="percentage(d.row)" width="80px"/>
<prod-order-progress :percentage="percentage(d.row)" width="100%" />
<div>数量:{{d.row.erpQty | dv}} {{d.row.unitName}} </div>
<div>未入库:{{d.row.erpNoStockInQty | dv}} {{d.row.unitName}}</div>
</template>
<template v-else-if="['erpQty', 'erpNoStockInQty'].includes(column.key)">
{{d.row[column.key]}}
<template v-if="!isEmpty(d.row.unitName)">{{d.row.unitName}}</template>
</template>
<template v-else-if="column.key === 'time'">
<template v-if="d.row.erpDate">单据日期:{{d.row.erpDate | dv}}<br/></template>
<!-- <template v-if="d.row.erpCreateDate">创建:{{d.row.erpCreateDate | dv}}<br/></template>
<template v-if="d.row.erpModifyDate">修改:{{d.row.erpModifyDate | dv}}<br/></template> -->
<template v-if="d.row.erpConveyDate">下达:{{d.row.erpConveyDate | dv}}<br/></template>
<template v-if="d.row.syncTime">同步:{{d.row.syncTime | dv}}<br/></template>
</template>
<template v-else>
{{d.row[column.key]}}
</template>
@ -190,72 +185,6 @@
@pagination="getList"
/>
<!-- 添加或修改生产订单对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body :close-on-click-modal="false">
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-row>
<form-col :span="span" label="单据编号" prop="billNo">
<el-input v-model="form.billNo" placeholder="请输入单据编号" />
</form-col>
<form-col :span="span" label="单据日期" prop="billDate">
<el-date-picker clearable
v-model="form.billDate"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择单据日期">
</el-date-picker>
</form-col>
<form-col :span="span" label="规格型号" prop="spec">
<el-input v-model="form.spec" placeholder="请输入规格型号" />
</form-col>
<form-col :span="span" label="生产车间ID" prop="deptId">
<el-input v-model="form.deptId" placeholder="请输入生产车间ID" />
</form-col>
<form-col :span="span" label="单位" prop="unit">
<el-input v-model="form.unit" placeholder="请输入单位" />
</form-col>
<form-col :span="span" label="数量" prop="num">
<el-input v-model="form.num" placeholder="请输入数量" />
</form-col>
<form-col :span="span" label="批号" prop="batchNo">
<el-input v-model="form.batchNo" placeholder="请输入批号" />
</form-col>
<form-col :span="span" label="备注" prop="remark">
<el-input v-model="form.remark" placeholder="请输入备注" />
</form-col>
<form-col :span="span" label="下达时间" prop="releaseTime">
<el-date-picker clearable
v-model="form.releaseTime"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择下达时间">
</el-date-picker>
</form-col>
<form-col :span="span" label="源单编号" prop="sourceNo">
<el-input v-model="form.sourceNo" placeholder="请输入源单编号" />
</form-col>
<form-col :span="span" label="需求单据" prop="demandBill">
<el-input v-model="form.demandBill" placeholder="请输入需求单据" />
</form-col>
<form-col :span="span" label="辅助属性(json)" prop="auxProp">
<el-input v-model="form.auxProp" placeholder="请输入辅助属性(json)" />
</form-col>
<form-col :span="span" label="计划跟踪号" prop="planTrackNo">
<el-input v-model="form.planTrackNo" placeholder="请输入计划跟踪号" />
</form-col>
<form-col :span="span" label="物料编码" prop="materialNo">
<el-input v-model="form.materialNo" placeholder="请输入物料编码" />
</form-col>
<form-col :span="span" label="合格品入库数量" prop="quaStore">
<el-input v-model="form.quaStore" placeholder="请输入合格品入库数量" />
</form-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
@ -270,7 +199,7 @@ import {
} from "@/api/yh/prodOrder";
import {$showColumns} from '@/utils/mixins';
import FormCol from "@/components/FormCol/index.vue";
import DeptTreeSelect from "@/components/Business/Dept/DeptTreeSelect.vue";
import DeptSelect from "@/components/Business/Dept/DeptSelect.vue";
import BooleanTag from "@/components/BooleanTag/index.vue";
import {isEmpty} from "@/utils";
import {$prodOrder} from "@/views/yh/prodOrder/mixins";
@ -286,7 +215,7 @@ export default {
name: "ProdOrder",
mixins: [$showColumns, $prodOrder],
dicts: ['prod_order_erp_document_status', 'prod_order_erp_status', 'prod_order_erp_req_src'],
components: {ProdOrderProgress, BooleanTag, DeptTreeSelect, FormCol},
components: {ProdOrderProgress, BooleanTag, DeptSelect, FormCol},
data() {
return {
span: 24,
@ -294,28 +223,22 @@ export default {
columns: [
{key: 'id', visible: false, label: '生产订单ID', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'erpId', visible: false, label: 'ID', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'erpBillNo', visible: true, label: '单据编号', minWidth: null, sortable: true, overflow: false, align: 'center', width: "100"},
{key: 'erpDocumentStatus', visible: true, label: '单据状态', minWidth: null, sortable: true, overflow: false, align: 'center', width: "100"},
{key: 'erpCreateDate', visible: true, label: '创建日期', minWidth: null, sortable: false, overflow: false, align: 'center', width: "100"},
{key: 'erpModifyDate', visible: true, label: '修改日期', minWidth: null, sortable: false, overflow: false, align: 'center', width: "100"},
{key: 'erpDescription', visible: false, label: '主表备注', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'erpDate', visible: true, label: '单据日期', minWidth: null, sortable: false, overflow: false, align: 'center', width: "100"},
{key: 'materialNumber', visible: true, label: '物料编码', minWidth: null, sortable: false, overflow: false, align: 'center', width: "100"},
{key: 'erpIsRework', visible: true, label: '是否返工', minWidth: null, sortable: true, overflow: false, align: 'center', width: "100"},
{key: 'erpMtoNo', visible: true, label: '跟踪号', minWidth: null, sortable: true, overflow: false, align: 'center', width: "100"},
{key: 'erpBillNo', visible: true, label: '编号', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'erpStatus', visible: true, label: '状态', minWidth: null, sortable: true, overflow: false, align: 'center', width: "80"},
{key: 'erpDocumentStatus', visible: false, label: '单据', minWidth: null, sortable: true, overflow: false, align: 'center', width: "80"},
{key: 'erpDescription', visible: false, label: '主备注', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'materialNumber', visible: true, label: '物料', minWidth: null, sortable: false, overflow: false, align: 'center', width: null},
{key: 'workShopName', visible: true, label: '车间', minWidth: null, sortable: true, overflow: false, align: 'center', width: "100"},
{key: 'erpIsRework', visible: true, label: '返工', minWidth: null, sortable: true, overflow: false, align: 'center', width: "80"},
{key: 'percentage', visible: true, label: '进度', minWidth: null, sortable: false, overflow: false, align: 'left', width: "120"},
{key: 'erpRowId', visible: false, label: '行标识', minWidth: null, sortable: true, overflow: true, align: 'center', width: null},
{key: 'erpMemoItem', visible: true, label: '备注', minWidth: null, sortable: true, overflow: false, align: 'center', width: "100"},
{key: 'erpConveyDate', visible: true, label: '下达日期', minWidth: null, sortable: false, overflow: false, align: 'center', width: "100"},
{key: 'erpStatus', visible: true, label: '业务状态', minWidth: null, sortable: true, overflow: false, align: 'center', width: "100"},
{key: 'workShopName', visible: true, label: '生产车间', minWidth: null, sortable: true, overflow: false, align: 'center', width: "100"},
{key: 'erpReqSrc', visible: true, label: '需求来源', minWidth: null, sortable: true, overflow: false, align: 'center', width: "100"},
{key: 'unitName', visible: false, label: '单位', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'erpQty', visible: true, label: '数量', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'erpMemoItem', visible: true, label: '备注', minWidth: null, sortable: true, overflow: true, align: 'center', width: null},
{key: 'time', visible: true, label: '时间', minWidth: null, sortable: false, overflow: false, align: 'left', width: "170"},
{key: 'erpReqSrc', visible: false, label: '来源', minWidth: null, sortable: true, overflow: false, align: 'center', width: "80"},
{key: 'erpBaseUnitQty', visible: false, label: '基本', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'erpNoStockInQty', visible: true, label: '未入库', minWidth: null, sortable: true, overflow: false, align: 'center', width: "100"},
{key: 'erpBaseNoStockInQty', visible: false, label: '基本未入库', minWidth: null, sortable: true, overflow: false, align: 'center', width: "130"},
{key: 'erpBaseNoStockInQty', visible: false, label: '基本未入库', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'baseUnitName', visible: false, label: '基本单位', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'syncTime', visible: true, label: '同步时间', minWidth: null, sortable: true, overflow: false, align: 'center', width: "100"},
{key: 'percentage', visible: true, label: '进度', minWidth: null, sortable: false, overflow: false, align: 'center', width: "100"},
],
//
orderSorts: ['ascending', 'descending', null],

View File

@ -36,7 +36,7 @@
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" align="center"/>
<el-table-column type="index" min-width="10" align="center" label="#">
<el-table-column type="index" align="left" label="#">
<template slot-scope="d">
{{d.$index + (pageNum - 1) * pageSize + 1}}
</template>
@ -59,12 +59,12 @@
<!-- <table-form-col label="不良品" prop-prefix="productList" prop="defectNum">
<el-input-number slot-scope="d" v-model="d.row.defectNum" placeholder="请输入数量" :min="0" :precision="0" controls-position="right" style="width: 100%"/>
</table-form-col> -->
<table-form-col label="表面" width="80" prop-prefix="productList" prop="surface" :rules="rules.productList.surface" header-icon="el-icon-edit" @click-header="handleBatchEdit('surface')">
<el-select slot-scope="d" v-model="d.row.surface" placeholder="请选择表面处理" filterable clearable allow-create style="width: 100%;">
<table-form-col label="表面" width="76" prop-prefix="productList" prop="surface" :rules="rules.productList.surface" header-icon="el-icon-edit" @click-header="handleBatchEdit('surface')">
<el-select slot-scope="d" v-model="d.row.surface" placeholder="请选择表面处理" @change="onChangeSurface(d.row)" filterable clearable allow-create style="width: 100%;">
<el-option v-for="item in dict.type.surface" :key="item.value" :label="item.label" :value="item.value"/>
</el-select>
</table-form-col>
<table-form-col label="颜色" width="120" prop-prefix="productList" prop="color" :rules="rules.productList.color" header-icon="el-icon-edit" @click-header="handleBatchEdit('color')">
<table-form-col label="颜色" width="115" prop-prefix="productList" prop="color" :rules="rules.productList.color" header-icon="el-icon-edit" @click-header="handleBatchEdit('color')">
<el-select slot-scope="d" v-model="d.row.color" placeholder="请选择颜色" filterable clearable allow-create style="width: 100%;">
<el-option v-for="item in dict.type.color_code" :key="item.value" :label="item.label" :value="item.value"/>
</el-select>
@ -79,7 +79,7 @@
<table-form-col label="单价" prop-prefix="productList" width="100" prop="priceId" required :rules="rules.productList.priceId">
<price-select
slot-scope="d"
v-model="d.row.priceId"
:value="d.row.priceId"
:name="d.row.priceName"
:code="d.row.priceCode"
:status="d.row.priceStatus"
@ -90,35 +90,49 @@
:ref="`priceSelect${d.index}`"
/>
</table-form-col>
<table-form-col label="备注" prop-prefix="productList" prop="remark" align="center" width="60" :rules="rules.productList.remark">
<el-popover
slot-scope="d"
placement="top"
width="400"
trigger="hover"
>
<div slot="reference" style="font-size: 12px; white-space: nowrap;">{{d.row.remark | dv}}</div>
<el-input type="textarea" v-model="d.row.remark" placeholder="请输入备注" maxlength="200" show-word-limit autofocus :autosize="{ minRows: 2, maxRows: 6 }" />
</el-popover>
</table-form-col>
<table-form-col label="工资" prop-prefix="productList" prop="totalAmount" align="right" width="60">
<span slot-scope="d" style="font-size: 12px;" @click="handleDetail(d.row)">{{totalAmount(d.row) | fix2 | dv}}</span>
</table-form-col>
<table-form-col label="详细" prop-prefix="productList" prop="pricePrice" align="right" width="60" :rules="rules.productList.pricePrice">
<div slot-scope="d" @click="handleDetail(d.row)">
<div style="font-size: 12px;">员工:{{d.row.userProdList.length}}</div>
<div style="font-size: 12px;" v-if="d.row.orderProdList.length > 0">订单:{{d.row.orderProdList.length}}</div>
</div>
</table-form-col>
<el-table-column label="操作" align="center" width="120">
<el-table-column label="操作" align="right" width="70">
<template #header>
<el-button size="small" icon="el-icon-plus" type="text" @click="handleAdd">新增工序</el-button>
<el-button size="mini" icon="el-icon-plus" type="text" @click="handleAdd">新增工序</el-button>
</template>
<template slot-scope="d">
<el-button
type="text"
@click="handleChangeSort(d.$index, -1)"
icon="el-icon-upload2"
size="small"
size="mini"
></el-button>
<el-button
type="text"
@click="handleChangeSort(d.$index, 1)"
icon="el-icon-download"
size="small"
size="mini"
></el-button>
<el-button
type="text"
@click="doCopy(d.$index, d.row)"
icon="el-icon-document-copy"
size="small"
>复制</el-button>
size="mini"
></el-button>
</template>
</el-table-column>
@ -251,6 +265,15 @@ export default {
name: row.priceName,
}
}
},
totalAmount() {
return (row) => {
let totalAmount = Decimal(0);
row.userProdList.forEach(item => {
totalAmount = totalAmount.plus(notNullDecimal(item.num).mul(notNullDecimal(row.pricePrice)));
})
return totalAmount.toNumber();
}
}
},
created() {
@ -344,8 +367,12 @@ export default {
this.$refs.table.toggleRowExpansion(row);
},
handlePriceChange(row, val) {
//
this.checkPriceChange(row, val);
// val,
if (val == null) {
row.priceId = null;
row.priceSubName = null;
row.priceSpec = null;
row.pricePrice = null;
@ -355,10 +382,9 @@ export default {
row.priceQuantityDenominator = null;
row.priceCode = null;
row.priceStatus = null;
return;
}
} else {
// val
row.priceId = val.priceId;
row.priceSubName = val.subName || null;
row.priceSpec = val.spec || null;
row.pricePrice = val.price || null;
@ -372,6 +398,28 @@ export default {
row.priceSize = val.size;
row.priceName = val.name;
row.pricePattern = val.pattern;
}
},
checkPriceChange(ov, nv) {
if (ov.orderProdList == null || ov.orderProdList.length == 0) {
return;
}
if (nv == null) {
nv = {};
}
if (ov.priceCategory != nv.priceCategory ||
ov.priceSize != nv.priceSize ||
ov.pricePattern != nv.pricePattern ) {
this.$message.info('由于工序发生变化,关联订单已清空,请重新选择关联订单。');
ov.orderProdList = [];
}
},
onChangeSurface(row) {
if (row.orderProdList == null || row.orderProdList.length == 0) {
return;
}
this.$message.info('由于表面处理发生变化,关联订单已清空,请重新选择关联订单。');
row.orderProdList = [];
},
//
handleChangeUserNum(row) {

View File

@ -6,18 +6,25 @@
stripe
class="mini-table"
@selection-change="handleSelectionChange"
show-summary
:summary-method="getSummary"
>
<el-table-column type="selection" align="center"/>
<el-table-column align="center" label="#" width="50" type="index"/>
<table-form-col label="订单" :prop-prefix="propPrefix" prop="orderId" required :rules="rules.orderId">
<template slot-scope="d">
{{d.row.orderErpBillNo | dv}}
</template>
<table-form-col label="计划跟踪号" :prop-prefix="propPrefix" prop="orderId" required :rules="rules.orderId">
<span slot-scope="d" style="font-size: 12px;">
{{d.row.orderErpMtoNo | dv}}
</span>
</table-form-col>
<table-form-col label="物料编码" :prop-prefix="propPrefix" prop="orderMaterialNumber">
<template slot-scope="d">
<table-form-col label="订单" :prop-prefix="propPrefix" prop="orderId" required :rules="rules.orderId">
<span slot-scope="d" style="font-size: 12px;">
{{d.row.orderErpBillNo | dv}}
</span>
</table-form-col>
<table-form-col label="物料" :prop-prefix="propPrefix" prop="orderMaterialNumber">
<span slot-scope="d" style="font-size: 12px;">
{{d.row.orderMaterialNumber | dv}}
</template>
</span>
</table-form-col>
<table-form-col label="产量" :prop-prefix="propPrefix" prop="num" required :rules="rules.num" header-icon="el-icon-edit" @click-header="handleBatchEdit('num')">
<el-input slot-scope="d" v-model="d.row.num" placeholder="请输入产量">
@ -98,11 +105,35 @@ export default {
materialCategory: this.prod.priceCategory,
materialSize: this.prod.priceSize,
materialGraphics: this.prod.pricePattern,
materialSurface: this.prod.surface,
excludeIds: this.value.map(item => item.orderId),
}
}
},
methods: {
getSummary({ columns, data }) {
const sums = [];
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = '合计';
return;
}
if (column.property === 'num') {
const sum = data.reduce((prev, curr) => {
const value = Number(curr.num);
if (!isNaN(value)) {
return prev + value;
} else {
return prev;
}
}, 0);
sums[index] = sum + this.prod.priceUnit;
} else {
sums[index] = '';
}
});
return sums;
},
//
handleAdd() {
this.showOrderDialog = true;
@ -125,6 +156,7 @@ export default {
// vo
orderErpBillNo: item.erpBillNo,
orderMaterialNumber: item.materialNumber,
orderErpMtoNo: item.erpMtoNo,
}));
if (this.value == null) {
this.$emit('input', list);

View File

@ -6,13 +6,15 @@
stripe
class="mini-table"
@selection-change="handleSelectionChange"
show-summary
:summary-method="getSummary"
>
<el-table-column type="selection" align="center"/>
<el-table-column align="center" label="#" width="50" type="index"/>
<table-form-col label="员工" :prop-prefix="propPrefix" prop="userId" required :rules="rules.userId">
<template slot-scope="d">
<span slot-scope="d" style="font-size: 12px;">
{{d.row.userName | dv}} ({{d.row.userNo | dv}})
</template>
</span>
</table-form-col>
<table-form-col label="产量" :prop-prefix="propPrefix" prop="num" required :rules="rules.num" header-icon="el-icon-edit" @click-header="handleBatchEdit('num')">
<el-input slot-scope="d" v-model="d.row.num" placeholder="请输入产量" @change="handleChangeNum">
@ -21,6 +23,9 @@
</template>
</el-input>
</table-form-col>
<table-form-col label="工资" :prop-prefix="propPrefix" prop="totalAmount" align="right" width="100">
<span slot-scope="d" style="font-size: 12px;">{{totalAmount(d.row) | fix2 | dv}}</span>
</table-form-col>
<el-table-column label="操作" align="center" width="120">
<template #header>
<el-button size="small" icon="el-icon-plus" type="text" @click="handleAdd" >关联员工</el-button>
@ -95,8 +100,42 @@ export default {
excludeUserIds: this.value.map(item => item.userId),
}
},
//
totalAmount() {
return (row) => {
return notNullDecimal(row.num).mul(notNullDecimal(this.prod.pricePrice)).toNumber();
}
}
},
methods: {
getSummary({ columns, data }) {
const sums = [];
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = '合计';
return;
}
if (column.property === 'num') {
const sum = data.reduce((prev, curr) => {
const value = Number(curr.num);
if (!isNaN(value)) {
return prev + value;
} else {
return prev;
}
}, 0);
sums[index] = sum + this.prod.priceUnit;
} else if (column.property === 'totalAmount') {
const sum = data.reduce((prev, curr) => {
return prev + this.totalAmount(curr);
}, 0);
sums[index] = sum.toFixed(2);
} else {
sums[index] = '';
}
});
return sums;
},
listUserWithShift,
handleChangeNum() {
this.emitChangeNum();

View File

@ -1,8 +1,8 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form :model="queryParams" ref="queryForm" size="mini" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="部门" prop="deptId">
<dept-tree-select v-model="form.deptId" class="small-tree-select" @change="handleQuery"/>
<dept-select v-model="queryParams.deptId" @change="handleQuery"/>
</el-form-item>
<el-form-item label="状态" prop="statusList">
<el-checkbox-group v-model="queryParams.statusList" @change="handleQuery">
@ -14,30 +14,6 @@
</el-checkbox-button>
</el-checkbox-group>
</el-form-item>
<el-form-item label="创建人" prop="createBy">
<el-input
v-model="queryParams.createBy"
placeholder="请输入创建人名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="审核人" prop="verifyBy">
<el-input
v-model="queryParams.verifyBy"
placeholder="请输入审核人名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="更新人" prop="updateBy">
<el-input
v-model="queryParams.updateBy"
placeholder="请输入更新人名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="报表日期" prop="reportDateRange">
<el-date-picker
type="daterange"
@ -92,7 +68,9 @@
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="reportList" @selection-change="handleSelectionChange" :default-sort="defaultSort" @sort-change="onSortChange">
<el-table size="mini" max-height="600px" v-loading="loading" :data="reportList" @selection-change="handleSelectionChange" :default-sort="defaultSort" @sort-change="onSortChange"
show-summary
:summary-method="getSummary">
<el-table-column type="selection" width="55" align="center" />
<template v-for="column of showColumns">
<el-table-column
@ -111,11 +89,19 @@
{{d.row[column.key]}}
</template>
<template v-else-if="column.key === 'status'">
<dict-tag :options="dict.type.report_status" :value="d.row[column.key]"/>
<dict-tag :options="dict.type.report_status" :value="d.row[column.key]" size="mini"/>
</template>
<template v-else-if="column.key === 'totalAmount'">
{{d.row.totalAmount | dv}}
</template>
<template v-else-if="column.key === 'createTime'">
<template v-if="d.row.createTime">创建:{{d.row.createTime | dv}}({{d.row.createBy | dv}})<br/></template>
<template v-if="d.row.updateTime">更新:{{d.row.updateTime | dv}}({{d.row.updateBy | dv}})<br/></template>
<template v-if="d.row.verifyTime">审核:{{d.row.verifyTime | dv}}({{d.row.verifyBy | dv}})<br/></template>
</template>
<template v-else-if="column.key === 'productCount'">
{{d.row.productCount | dv}}
</template>
<template v-else>
{{d.row[column.key] | dv}}
</template>
@ -179,10 +165,11 @@
<script>
import {cancelReport, delReport, listReport, submitReport} from "@/api/yh/report";
import {getReportSum} from "@/api/dashboard/report";
import {$showColumns} from '@/utils/mixins';
import FormCol from "@/components/FormCol/index.vue";
import DeptTreeSelect from "@/components/Business/Dept/DeptTreeSelect.vue";
import {DatePickerOptions, ReportStatus} from "@/utils/constants";
import DeptSelect from '@/components/Business/Dept/DeptSelect.vue';
//
const defaultSort = {
@ -194,24 +181,20 @@ export default {
name: "Report",
mixins: [$showColumns],
dicts: ['report_status'],
components: {DeptTreeSelect, FormCol},
components: { FormCol, DeptSelect},
data() {
return {
DatePickerOptions,
ReportStatus,
//
columns: [
{key: 'reportId', visible: true, label: '报表编号', minWidth: null, sortable: true, overflow: false, align: 'center', width: "100"},
{key: 'reportId', visible: false, label: '编号', minWidth: null, sortable: true, overflow: false, align: 'center', width: "100"},
{key: 'deptName', visible: true, label: '部门', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'reportDate', visible: true, label: '报表日期', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'totalAmount', visible: true, label: '总金额', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'reportDate', visible: true, label: '日期', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'status', visible: true, label: '状态', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'createBy', visible: true, label: '创建人', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'createTime', visible: true, label: '创建时间', minWidth: null, sortable: true, overflow: false, align: 'center', width: "180"},
{key: 'updateBy', visible: true, label: '更新人', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'updateTime', visible: true, label: '更新时间', minWidth: null, sortable: true, overflow: false, align: 'center', width: "180"},
{key: 'verifyBy', visible: true, label: '审核人', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'verifyTime', visible: true, label: '审核时间', minWidth: null, sortable: true, overflow: false, align: 'center', width: "180"},
{key: 'totalAmount', visible: true, label: '金额', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'productCount', visible: true, label: '工序', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'createTime', visible: true, label: '时间', minWidth: null, sortable: true, overflow: false, align: 'left', width: "250"},
{key: 'verifyRemark', visible: true, label: '审核意见', minWidth: null, sortable: false, overflow: true, align: 'center', width: null},
],
//
@ -270,13 +253,34 @@ export default {
createBy: [
{ required: true, message: "创建人名称不能为空", trigger: "blur" }
],
}
},
sum: {},
};
},
created() {
this.getList();
},
methods: {
getSum() {
getReportSum(this.queryParams).then(res => {
this.sum = res.data;
})
},
getSummary({ columns, data }) {
const sums = [];
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = '合计';
return;
}
if (column.property === 'totalAmount') {
sums[index] = this.sum.totalAmount + ' 元';
} else {
sums[index] = '';
}
});
return sums;
},
//
handleSubmit(row) {
this.$confirm('确定提交吗?', '提示', {
@ -325,6 +329,7 @@ export default {
this.reportList = response.rows;
this.total = response.total;
this.loading = false;
this.getSum();
});
},
/** 搜索按钮操作 */

View File

@ -1,6 +1,14 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="计划跟踪号" prop="orderErpMtoNo" v-if="isShow('orderErpMtoNo')" label-width="6em">
<el-input
v-model="queryParams.orderErpMtoNo"
placeholder="请输入计划跟踪号"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="生产订单" prop="orderErpBillNo" v-if="isShow('orderErpBillNo')">
<el-input
v-model="queryParams.orderErpBillNo"
@ -9,6 +17,9 @@
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="车间" prop="reportDeptId">
<dept-select v-model="queryParams.reportDeptId" @change="handleQuery"/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
@ -50,8 +61,20 @@
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList" :columns="columns"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="reportOrderProdList" @selection-change="handleSelectionChange" :default-sort="defaultSort" @sort-change="onSortChange">
<el-table-column type="selection" width="55" align="center" />
<el-table
show-summary
:summary-method="sumaryMethod"
v-loading="loading"
size="mini"
max-height="600px"
:data="reportOrderProdList"
@selection-change="handleSelectionChange"
:default-sort="defaultSort"
@sort-change="onSortChange">
<el-table-column
type="selection"
width="55"
align="center" />
<template v-for="column of showColumns">
<el-table-column
:key="column.key"
@ -81,7 +104,7 @@
{{d.row[column.key] | dv}} {{d.row.unitName}}
</template>
<template v-else-if="column.key === 'reportStatus'">
<dict-tag :value="d.row.reportStatus" :options="dict.type.report_status"/>
<dict-tag :value="d.row.reportStatus" :options="dict.type.report_status" size="mini"/>
</template>
<template v-else>
{{d.row[column.key]}}
@ -151,6 +174,8 @@ import {
import {$showColumns} from '@/utils/mixins';
import FormCol from "@/components/FormCol/index.vue";
import ProdOrderLink from "@/components/Business/ProdOrder/ProdOrderLink.vue";
import { getReportOrderProdSum } from "@/api/dashboard/reportOrderProd";
import DeptSelect from "@/components/Business/Dept/DeptSelect.vue";
//
const defaultSort = {
@ -162,7 +187,7 @@ export default {
name: "ReportOrderProd",
mixins: [$showColumns],
dicts: ['report_status'],
components: {ProdOrderLink, FormCol},
components: {ProdOrderLink, FormCol, DeptSelect},
props: {
query: {
type: Object,
@ -175,13 +200,18 @@ export default {
//
columns: [
{key: 'id', visible: false, label: 'ID', minWidth: null, sortable: true, overflow: false, align: 'center', width: "100"},
{key: 'orderErpMtoNo', visible: true, label: '计划跟踪号', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'orderErpBillNo', visible: true, label: '生产订单', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'reportId', visible: false, label: '报表编号', minWidth: null, sortable: true, overflow: false, align: 'center', width: "100"},
{key: 'reportDate', visible: true, label: '报表日期', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'reportStatus', visible: true, label: '报表状态', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'reportDeptName', visible: true, label: '车间', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'reportDate', visible: true, label: '日期', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'reportStatus', visible: true, label: '状态', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'priceName', visible: true, label: '工序', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'priceCategory', visible: true, label: '类别', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'priceSize', visible: true, label: '大小', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'pricePattern', visible: true, label: '图案', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'pricePrice', visible: true, label: '单价', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'orderErpQty', visible: true, label: '订单数量', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'orderErpQty', visible: false, label: '订单数量', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'num', visible: true, label: '良品数', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
],
//
@ -228,7 +258,8 @@ export default {
num: [
{ required: true, message: "生产数量不能为空", trigger: "blur" }
]
}
},
sum: {}, //
};
},
created() {
@ -240,6 +271,20 @@ export default {
this.getList();
},
methods: {
sumaryMethod({ columns, data }) {
const sums = [];
columns.forEach((column, index) => {
if (column.property === 'num') {
sums[index] = this.sum.num;
} else {
sums[index] = '';
}
if (index == 0) {
sums[index] = '合计';
}
});
return sums;
},
/** 当排序按钮被点击时触发 **/
onSortChange(column) {
if (column.order == null) {
@ -258,6 +303,12 @@ export default {
this.reportOrderProdList = response.rows;
this.total = response.total;
this.loading = false;
this.getSum();
});
},
getSum() {
getReportOrderProdSum(this.queryParams).then(response => {
this.sum = response.data;
});
},
//

View File

@ -86,6 +86,9 @@
@sort-change="onSortChange"
@expand-change="onExpandChange"
size="mini"
max-height="600px"
show-summary
:summary-method="getSummary"
>
<el-table-column type="selection" width="55" align="center" v-if="listConfig.showSelection"/>
<el-table-column type="expand" width="20" align="left" fixed="left">
@ -183,63 +186,6 @@
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改报表产量对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body :close-on-click-modal="false">
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-row>
<form-col :span="span" label="报表ID" prop="reportId">
<el-input v-model="form.reportId" placeholder="请输入报表ID" />
</form-col>
<form-col :span="span" label="工序ID" prop="priceId">
<el-input v-model="form.priceId" placeholder="请输入工序ID" />
</form-col>
<form-col :span="span" label="良品数" prop="num">
<el-input v-model="form.num" placeholder="请输入良品数" />
</form-col>
<form-col :span="span" label="不良品数" prop="defectNum">
<el-input v-model="form.defectNum" placeholder="请输入不良品数" />
</form-col>
<form-col :span="span" label="工序类别" prop="priceCategory">
<el-input v-model="form.priceCategory" placeholder="请输入工序类别" />
</form-col>
<form-col :span="span" label="工序大小" prop="priceSize">
<el-input v-model="form.priceSize" placeholder="请输入工序大小" />
</form-col>
<form-col :span="span" label="工序名称" prop="priceName">
<el-input v-model="form.priceName" placeholder="请输入工序名称" />
</form-col>
<form-col :span="span" label="子工序名称" prop="priceSubName">
<el-input v-model="form.priceSubName" placeholder="请输入子工序名称" />
</form-col>
<form-col :span="span" label="工序图案" prop="pricePattern">
<el-input v-model="form.pricePattern" placeholder="请输入工序图案" />
</form-col>
<form-col :span="span" label="工序规格" prop="priceSpec">
<el-input v-model="form.priceSpec" placeholder="请输入工序规格" />
</form-col>
<form-col :span="span" label="工序单价(元)" prop="pricePrice">
<el-input v-model="form.pricePrice" placeholder="请输入工序单价(元)" />
</form-col>
<form-col :span="span" label="工序单位" prop="priceUnit">
<el-input v-model="form.priceUnit" placeholder="请输入工序单位" />
</form-col>
<form-col :span="span" label="工序分类" prop="priceClassify">
<el-input v-model="form.priceClassify" placeholder="请输入工序分类" />
</form-col>
<form-col :span="span" label="工序生产数量倍数(个)" prop="priceQuantity">
<el-input v-model="form.priceQuantity" placeholder="请输入工序生产数量倍数(个)" />
</form-col>
<form-col :span="span" label="删除标志" prop="deleted">
<el-input v-model="form.deleted" placeholder="请输入删除标志" />
</form-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
@ -255,6 +201,7 @@ import {formatFraction, isEmpty} from "@/utils";
import ReportOrderProdDescriptions from "@/views/yh/reportProd/components/ReportOrderProdDescriptions.vue";
import BooleanTag from '@/components/BooleanTag/index.vue'
import {ReportStatus} from "@/utils/constants";
import {getReportProdSum} from "@/api/dashboard/reportProd";
//
const defaultSort = {
@ -287,18 +234,14 @@ export default {
showPage: false,
},
searchColumns: [
{key: 'reportId', label: "报表编号", type: 'input', dictType: null},
{key: 'reportStatus', label: "报表状态", type: 'dict', dictType: 'report_status'},
{key: 'deptId', label: "车间", type: 'dept', dictType: null},
{key: 'reportDateRange', label: "报表日期", type: 'daterange', dictType: null},
{key: 'reportDateRange', label: "日期", type: 'daterange', dictType: null},
{key: 'reportStatus', label: "报表状态", type: 'dict', dictType: 'report_status'},
{key: 'priceName', label: "工序", type: 'input', dictType: null},
{key: 'priceSubName', label: "子工序", type: 'input', dictType: null},
{key: 'priceCategory', label: "类别", type: 'input', dictType: null},
{key: 'priceSize', label: "大小", type: 'input', dictType: null},
{key: 'pricePattern', label: "图案", type: 'input', dictType: null},
{key: 'priceSpec', label: "规格", type: 'input', dictType: null},
{key: 'priceClassify', label: "分类", type: 'input', dictType: null},
{key: 'priceUnit', label: "单位", type: 'input', dictType: null},
],
span: 24,
//
@ -399,7 +342,8 @@ export default {
priceType: [
{ required: true, message: "工序类型不能为空", trigger: "change" }
]
}
},
sum: {},
};
},
created() {
@ -413,6 +357,23 @@ export default {
this.getList();
},
methods: {
getSummary({ columns, data }) {
const sums = [];
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = '合计';
return;
}
if (column.property === 'num') {
sums[index] = this.sum.num;
} else if (column.property === 'totalAmount') {
sums[index] = this.sum.totalAmount + ' 元';
} else {
sums[index] = '';
}
});
return sums;
},
handleRefreshPriceMatchReportProd() {
refreshPriceMatchReportProd(this.ids).then(response => {
if (response.code === 200 && response.data > 0) {
@ -448,8 +409,14 @@ export default {
this.reportProdList = response.rows;
this.total = response.total;
this.loading = false;
this.getSum();
});
},
getSum() {
getReportProdSum(this.queryParams).then(res => {
this.sum = res.data;
})
},
//
cancel() {
this.open = false;

View File

@ -1,12 +1,24 @@
<template>
<div :class="listConfig.containerClass">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form :model="queryParams" ref="queryForm" size="mini" :inline="true" v-show="showSearch" label-width="68px">
<!-- 报表日期 -->
<el-form-item label="部门" prop="deptId">
<dept-tree-select v-model="queryParams.deptId" placeholder="请选择部门" class="small-tree-select" @change="handleQuery"/>
<dept-select v-model="queryParams.deptId" @change="handleQuery"/>
</el-form-item>
<el-form-item label="报表状态" prop="reportStatus">
<el-form-item label="日期" prop="reportDateRange">
<el-date-picker
v-model="queryParams.reportDateRange"
type="daterange"
value-format="yyyy-MM-dd"
clearable
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
@change="handleQuery"
/>
</el-form-item>
<el-form-item label="状态" prop="reportStatus">
<el-select
v-model="queryParams.reportStatus"
placeholder="请选择报表状态"
@ -32,32 +44,36 @@
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="工序名称" prop="priceName">
<el-form-item label="工序" prop="priceName">
<el-input
v-model="queryParams.priceName"
placeholder="请输入工序名称"
placeholder="请输入工序"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="工序代码" prop="priceCode">
<el-form-item label="类别" prop="priceCategory">
<el-input
v-model="queryParams.priceCode"
placeholder="请输入工序代码"
v-model="queryParams.priceCategory"
placeholder="请输入类别"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="报表日期" prop="reportDateRange">
<el-date-picker
v-model="queryParams.reportDateRange"
type="daterange"
value-format="yyyy-MM-dd"
<el-form-item label="大小" prop="priceSize">
<el-input
v-model="queryParams.priceSize"
placeholder="请输入大小"
clearable
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
@change="handleQuery"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="图案" prop="pricePattern">
<el-input
v-model="queryParams.pricePattern"
placeholder="请输入图案"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
@ -104,7 +120,7 @@
</el-row>
<!-- TODO 统计数据 -->
<el-row class="statistics-row">
<!-- <el-row class="statistics-row">
<div class="statistics-item">
<span class="statistics-label">总产量</span>
<span class="statistics-value">{{ statistics.totalNum || 0 }}</span>
@ -113,9 +129,18 @@
<span class="statistics-label">总工资</span>
<span class="statistics-value">{{ statistics.totalPrice || 0 }} </span>
</div>
</el-row>
</el-row> -->
<el-table v-loading="loading" :data="reportUserProdList" @selection-change="handleSelectionChange" :default-sort="defaultSort" @sort-change="onSortChange">
<el-table
max-height="600px"
size="mini"
v-loading="loading"
show-summary
:summary-method="getSummary"
:data="reportUserProdList"
@selection-change="handleSelectionChange"
:default-sort="defaultSort"
@sort-change="onSortChange">
<el-table-column type="selection" width="55" align="center" />
<template v-for="column of showColumns">
<el-table-column
@ -140,10 +165,13 @@
{{d.row[column.key] | dv}} {{ d.row.priceUnit | dv}}
</template>
<template v-else-if="column.key === 'totalPrice'">
{{d.row.totalPrice | dv}}
{{d.row.totalPrice | fix2 | dv}}
</template>
<template v-else-if="column.key === 'reportStatus'">
<dict-tag :value="d.row.reportStatus" :options="dict.type.report_status"/>
<dict-tag :value="d.row.reportStatus" :options="dict.type.report_status" size="mini"/>
</template>
<template v-else-if="column.key === 'userName'">
{{d.row.userName | dv}}({{d.row.userNo | dv}})
</template>
<template v-else>
{{d.row[column.key]}}
@ -212,8 +240,9 @@ import {
} from "@/api/yh/reportUserProd";
import {$listConfig, $showColumns, $showSearch} from '@/utils/mixins';
import FormCol from "@/components/FormCol/index.vue";
import DeptTreeSelect from '@/components/Business/Dept/DeptTreeSelect.vue';
import DeptSelect from '@/components/Business/Dept/DeptSelect.vue';
import {dashboardUserProd} from '@/api/yh/dashboard.js';
import {getReportUserProdSum} from '@/api/dashboard/reportUserProd';
//
const defaultSort = {
@ -225,7 +254,7 @@ export default {
name: "ReportUserProd",
mixins: [$showColumns, $listConfig, $showSearch],
dicts: ['report_status'],
components: {FormCol, DeptTreeSelect},
components: {FormCol, DeptSelect},
props: {
query: {
type: Object,
@ -244,16 +273,18 @@ export default {
//
columns: [
{key: 'id', visible: false, label: '明细ID', minWidth: null, sortable: true, overflow: false, align: 'center', width: "100"},
{key: 'reportDate', visible: true, label: '报表日期', minWidth: null, sortable: true, overflow: false, align: 'center', width: "100"},
{key: 'deptName', visible: true, label: '部门', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'reportStatus', visible: true, label: '报表状态', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'userName', visible: true, label: '员工名称', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'userNo', visible: true, label: '员工编号', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'reportDate', visible: true, label: '日期', minWidth: null, sortable: true, overflow: false, align: 'center', width: "100"},
{key: 'reportStatus', visible: true, label: '状态', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'priceName', visible: true, label: '工序', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'priceCode', visible: true, label: '工序代码', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
// {key: 'priceCode', visible: true, label: '', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'priceCategory', visible: true, label: '类别', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'priceSize', visible: true, label: '大小', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'pricePattern', visible: true, label: '图案', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'userName', visible: true, label: '员工', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'pricePrice', visible: true, label: '单价', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'num', visible: true, label: '产量', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'totalPrice', visible: true, label: '工资', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
{key: 'totalPrice', visible: true, label: '工资', minWidth: null, sortable: true, overflow: false, align: 'right', width: null},
],
//
orderSorts: ['ascending', 'descending', null],
@ -303,6 +334,7 @@ export default {
},
//
statistics: {},
sum: {},
};
},
created() {
@ -317,6 +349,24 @@ export default {
this.getStatistics();
},
methods: {
//
getSummary({ columns, data }) {
const sums = [];
columns.forEach((column, index) => {
if (index === 0) {
sums[index] = '合计';
return;
}
if (column.property === 'totalPrice') {
sums[index] = this.sum.totalAmount + ' 元';
} else if (column.property === 'num') {
sums[index] = this.sum.num;
} else {
sums[index] = '';
}
});
return sums;
},
getStatistics() {
dashboardUserProd(this.queryParams).then(res => {
this.statistics = res.data;
@ -340,8 +390,14 @@ export default {
this.reportUserProdList = response.rows;
this.total = response.total;
this.loading = false;
this.getSum();
});
},
getSum() {
getReportUserProdSum(this.queryParams).then(res => {
this.sum = res.data;
})
},
//
cancel() {
this.open = false;