订单详情(进度需要考虑是否计入审核中的数量)

This commit is contained in:
磷叶 2024-12-06 17:59:59 +08:00
parent 8e2e810e69
commit 0db4935ab9
10 changed files with 238 additions and 37 deletions

View File

@ -1,5 +1,5 @@
<template>
<el-tag :type="value ? trueType : falseType" :size="size">{{value ? trueText : falseText}}</el-tag>
<el-tag v-if="value != null" :type="value ? trueType : falseType" :size="size">{{value ? trueText : falseText}}</el-tag>
</template>
<script>
export default {
@ -7,8 +7,7 @@ export default {
props: {
value: {
type: Boolean,
default: null,
required: true
default: null
},
size: {
type: String,

View File

@ -120,6 +120,12 @@ export const constantRoutes = [
name: 'ReportView',
meta: { title: '报表详情', noCache: false}
},
{
path: 'prodOrder/:id',
component: () => import('@/views/yh/prodOrder/view/view.vue'),
name: 'ProdOrderView',
meta: { title: '订单详情', noCache: false}
},
]
},
{

View File

@ -92,3 +92,21 @@ export const ReportPriceType = {
PUBLIC: "1", // 公共工序
BILL: "2", // 订单工序
}
/**
* 导入日志业务类型
*/
export const LogImportBizType = {
PRICE: "1", // 单价
PROD_ORDER: "2", // 生产订单
}
// 操作日志业务类型
export const OperLogBizType = {
UNKNOWN: "0", // 未知
PRICE: "1", // 单价
REPORT: "2", // 报表
PROD_ORDER: "3", // 生产订单
MATERIAL: "4", // 物料
UNIT: "5", // 单位
}

View File

@ -6,7 +6,6 @@
v-model="queryParams.operIp"
placeholder="请输入操作地址"
clearable
style="width: 240px;"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
@ -15,7 +14,6 @@
v-model="queryParams.title"
placeholder="请输入系统模块"
clearable
style="width: 240px;"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
@ -24,17 +22,11 @@
v-model="queryParams.operName"
placeholder="请输入操作人员"
clearable
style="width: 240px;"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="类型" prop="businessType">
<el-select
v-model="queryParams.businessType"
placeholder="操作类型"
clearable
style="width: 240px"
>
<el-form-item label="操作类型" prop="businessType" >
<el-select v-model="queryParams.businessType" placeholder="请选择操作类型" clearable @change="handleQuery">
<el-option
v-for="dict in dict.type.sys_oper_type"
:key="dict.value"
@ -43,13 +35,18 @@
/>
</el-select>
</el-form-item>
<el-form-item label="状态" prop="status">
<el-select
v-model="queryParams.status"
placeholder="操作状态"
clearable
style="width: 240px"
>
<el-form-item label="业务类型" prop="bizType">
<el-select v-model="queryParams.bizType" placeholder="请选择业务类型" clearable @change="handleQuery">
<el-option
v-for="dict in dict.type.log_biz_type"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="操作状态" prop="status">
<el-select v-model="queryParams.status" placeholder="请选择操作状态" clearable @change="handleQuery">
<el-option
v-for="dict in dict.type.sys_common_status"
:key="dict.value"
@ -65,8 +62,8 @@
value-format="yyyy-MM-dd HH:mm:ss"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
start-placeholder="开始时间"
end-placeholder="结束时间"
:default-time="['00:00:00', '23:59:59']"
></el-date-picker>
</el-form-item>
@ -218,6 +215,12 @@ import { list, delOperlog, cleanOperlog } from "@/api/monitor/operlog";
export default {
name: "Operlog",
dicts: ['sys_oper_type', 'sys_common_status', 'log_biz_type'],
props: {
query: {
type: Object,
default: () => ({})
}
},
data() {
return {
//
@ -253,6 +256,11 @@ export default {
};
},
created() {
this.queryParams = {
...this.queryParams,
...this.query
}
this.getList();
},
methods: {

View File

@ -0,0 +1,37 @@
<template>
<el-progress
v-if="percentage != null && !isNaN(percentage)"
text-inside
:stroke-width="16"
:percentage="percentage"
:color="customColors"
text-color="#fff"
:style="{width: width}"
/>
</template>
<script>
export default {
name: "ProdOrderProgress",
props: {
percentage: {
type: Number,
default: null,
},
customColors: {
type: Array,
default: () => {
return [
{color: '#f56c6c', percentage: 100},
{color: '#f3ab40', percentage: 80},
{color: '#5cb87a', percentage: 60},
{color: '#2f9bfb', percentage: 30},
]
}
},
width: {
type: String,
default: "80px",
}
}
}
</script>

View File

@ -132,6 +132,9 @@
<template v-else-if="column.key === 'erpIsRework'">
<boolean-tag :value="d.row.erpIsRework"/>
</template>
<template v-else-if="column.key === 'percentage'">
<prod-order-progress :percentage="percentage(d.row)" width="80px"/>
</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>
@ -151,6 +154,13 @@
<!-- @click="handleUpdate(scope.row)"-->
<!-- v-has-permi="['yh:prodOrder:edit']"-->
<!-- >修改</el-button>-->
<el-button
size="mini"
type="text"
icon="el-icon-view"
@click="handleView(scope.row)"
v-has-permi="['yh:prodOrder:query']"
>详情</el-button>
<el-button
size="mini"
type="text"
@ -260,6 +270,8 @@ import FormCol from "@/components/FormCol/index.vue";
import DeptTreeSelect from "@/components/Business/Dept/DeptTreeSelect.vue";
import BooleanTag from "@/components/BooleanTag/index.vue";
import {isEmpty} from "@/utils";
import {$prodOrder} from "@/views/yh/prodOrder/mixins";
import ProdOrderProgress from "@/views/yh/prodOrder/components/ProdOrderProgress.vue";
//
const defaultSort = {
@ -269,9 +281,9 @@ const defaultSort = {
export default {
name: "ProdOrder",
mixins: [$showColumns],
mixins: [$showColumns, $prodOrder],
dicts: ['prod_order_erp_document_status', 'prod_order_erp_status', 'prod_order_erp_req_src'],
components: {BooleanTag, DeptTreeSelect, FormCol},
components: {ProdOrderProgress, BooleanTag, DeptTreeSelect, FormCol},
data() {
return {
span: 24,
@ -300,6 +312,7 @@ export default {
{key: 'erpBaseNoStockInQty', visible: false, label: '基本未入库', minWidth: null, sortable: true, overflow: false, align: 'center', width: "130"},
{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],
@ -361,6 +374,9 @@ export default {
this.getList();
},
methods: {
handleView(row) {
this.$router.push(`/view/prodOrder/${row.id}`)
},
isEmpty,
handleSync(query = {}) {
this.$confirm('确定同步生产订单吗?', '提示', {

View File

@ -0,0 +1,16 @@
import {notNullDecimal} from "@/utils";
export const $prodOrder = {
computed: {
// 生产进度百分比
percentage() {
return (row) => {
return notNullDecimal(
notNullDecimal(row.verifiedBaseNum)
.div(notNullDecimal(row.erpBaseUnitQty))
.toFixed(2)
).toNumber();
}
}
}
}

View File

@ -0,0 +1,96 @@
<template>
<div class="app-container" v-loading="loading">
<el-card class="card-box" header="订单信息">
<el-descriptions :column="4">
<el-descriptions-item label="单据编号">{{detail.erpBillNo | dv}}</el-descriptions-item>
<el-descriptions-item label="单据状态">
<dict-tag :options="dict.type.prod_order_erp_document_status" :value="detail.erpDocumentStatus" size="small"/>
</el-descriptions-item>
<el-descriptions-item label="创建日期">{{detail.erpCreateDate | dv}}</el-descriptions-item>
<el-descriptions-item label="修改日期">{{detail.erpModifyDate | dv}}</el-descriptions-item>
<el-descriptions-item label="单据日期">{{detail.erpDate | dv}}</el-descriptions-item>
<el-descriptions-item label="物料编码">{{detail.materialNumber | dv}}</el-descriptions-item>
<el-descriptions-item label="是否返工">
<boolean-tag :value="detail.erpIsRework" size="small"/>
</el-descriptions-item>
<el-descriptions-item label="备注">{{detail.erpMemoItem | dv}}</el-descriptions-item>
<el-descriptions-item label="下达日期">{{detail.erpConveyDate | dv}}</el-descriptions-item>
<el-descriptions-item label="业务状态">
<dict-tag :options="dict.type.prod_order_erp_status" :value="detail.erpStatus" size="small"/>
</el-descriptions-item>
<el-descriptions-item label="生产车间">{{detail.workShopName | dv}}</el-descriptions-item>
<el-descriptions-item label="需求来源">
<dict-tag :options="dict.type.prod_order_erp_req_src" :value="detail.erpReqSrc" size="small"/>
</el-descriptions-item>
<el-descriptions-item label="数量">{{detail.erpQty | dv}} {{detail.unitName}}</el-descriptions-item>
<el-descriptions-item label="未入库数量">{{detail.erpNoStockInQty | dv}} {{detail.unitName}}</el-descriptions-item>
<el-descriptions-item label="同步时间">{{detail.syncTime | dv}}</el-descriptions-item>
<el-descriptions-item label="生产进度">
<prod-order-progress :percentage="percentage(detail)" width="80px"/>
</el-descriptions-item>
</el-descriptions>
</el-card>
<el-card class="card-box">
<el-tabs>
<el-tab-pane label="生产列表" lazy v-if="checkPermi(['yh:reportOrderProd:list'])">
<report-order-prod v-if="detail.id != null" :query="{orderId: detail.id}"/>
</el-tab-pane>
<el-tab-pane label="同步日志" lazy v-if="checkPermi(['yh:logImportDetail:list'])">
<log-import-detail v-if="detail.id != null" :query="{logBizType: LogImportBizType.PROD_ORDER, bstId: detail.id}"/>
</el-tab-pane>
<el-tab-pane label="操作日志" lazy v-if="checkPermi(['yh:logImportDetail:list'])">
<operlog v-if="detail.id != null" :query="{bizType: OperLogBizType.PROD_ORDER, bizId: detail.id}"/>
</el-tab-pane>
</el-tabs>
</el-card>
</div>
</template>
<script>
import {getProdOrder} from "@/api/yh/prodOrder";
import BooleanTag from "@/components/BooleanTag/index.vue";
import ReportOrderProd from "@/views/yh/reportOrderProd/index.vue";
import {checkPermi} from "@/utils/permission";
import LogImport from "@/views/yh/logImport/index.vue";
import LogImportDetail from "@/views/yh/logImportDetail/index.vue";
import {LogImportBizType, OperLogBizType} from "@/utils/constants";
import Operlog from "@/views/monitor/operlog/index.vue";
import ProdOrderProgress from "@/views/yh/prodOrder/components/ProdOrderProgress.vue";
import {$prodOrder} from "@/views/yh/prodOrder/mixins";
export default {
name: "ProdOrderView",
mixins: [$prodOrder],
computed: {
OperLogBizType() {
return OperLogBizType
},
LogImportBizType() {
return LogImportBizType
},
},
components: {ProdOrderProgress, Operlog, LogImportDetail, LogImport, ReportOrderProd, BooleanTag},
dicts: ['prod_order_erp_document_status', 'prod_order_erp_status', 'prod_order_erp_req_src'],
data() {
return {
detail: {},
loading: false,
}
},
created() {
this.getDetail();
},
methods: {
checkPermi,
getDetail() {
this.loading = true;
getProdOrder(this.$route.params.id).then(res => {
this.detail = res.data;
}).finally(() => {
this.loading = false;
})
}
}
}
</script>

View File

@ -68,7 +68,7 @@
<template v-if="column.key === 'id'">
{{d.row[column.key]}}
</template>
<template v-else-if="column.key === 'num'">
<template v-else-if="['num'].includes(column.key)">
{{d.row[column.key] | dv}} {{d.row.priceUnit}}
</template>
<template v-else-if="column.key === 'pricePrice'">
@ -150,19 +150,25 @@ export default {
mixins: [$showColumns],
dicts: ['report_status'],
components: {FormCol},
props: {
query: {
type: Object,
default: () => ({})
}
},
data() {
return {
span: 24,
//
columns: [
{key: 'id', visible: false, label: 'ID', minWidth: null, sortable: true, overflow: false, align: 'center', width: "100"},
{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: 'orderErpBillNo', 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: '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: 'num', visible: true, label: '良品数', minWidth: null, sortable: true, overflow: false, align: 'center', width: null},
],
//
orderSorts: ['ascending', 'descending', null],
@ -212,6 +218,11 @@ export default {
};
},
created() {
this.queryParams = {
...this.queryParams,
...this.query
}
this.getList();
},
methods: {

View File

@ -5,7 +5,7 @@
<el-descriptions-item :key="item.id" label="生产订单" :span="2">{{item.orderErpBillNo | dv}}</el-descriptions-item>
<el-descriptions-item :key="item.id" label="本次提交产量">{{item.num | fix2 | dv}} {{priceUnit}}</el-descriptions-item>
<el-descriptions-item :key="item.id" label="订单进度">
<el-progress text-inside :stroke-width="16" :percentage="percentage(item)" :color="customColors" text-color="#fff" style="width: 80px"/>
<prod-order-progress :percentage="percentage(item)" width="80px"/>
</el-descriptions-item>
<el-descriptions-item :key="item.id" label="订单需求数量">{{item.orderErpBaseUnitQty | fix2 | dv}} {{item.baseUnitName}}</el-descriptions-item>
<el-descriptions-item :key="item.id" label="订单未入库数量">{{item.orderErpBaseNoStockInQty | fix2 | dv}} {{item.baseUnitName}}</el-descriptions-item>
@ -21,9 +21,11 @@
import {notNullDecimal} from "@/utils";
import Decimal from "decimal.js";
import ProdOrderProgress from "@/views/yh/prodOrder/components/ProdOrderProgress.vue";
export default {
name: "ReportOrderProdDescriptions",
components: {ProdOrderProgress},
props: {
data: {
type: Array,
@ -42,12 +44,6 @@ export default {
},
data() {
return {
customColors: [
{color: '#f56c6c', percentage: 100},
{color: '#f3ab40', percentage: 80},
{color: '#5cb87a', percentage: 60},
{color: '#2f9bfb', percentage: 30},
]
}
},
computed: {
@ -60,11 +56,9 @@ export default {
console.log("percentage", verifiedBaseNum.toNumber(), num.toNumber(), orderErpBaseUnitQty.toNumber());
// = ( + * ) / * 100
let result = new Decimal(
return new Decimal(
verifiedBaseNum.add(num).mul(new Decimal(100)).div(orderErpBaseUnitQty).toFixed(2)
).toNumber();
console.log('result', result);
return result;
}
}
},