diff --git a/klp-ui/src/api/wms/coil.js b/klp-ui/src/api/wms/coil.js index 31472a82..fc627750 100644 --- a/klp-ui/src/api/wms/coil.js +++ b/klp-ui/src/api/wms/coil.js @@ -190,7 +190,8 @@ export function listCoilWithIds(data) { return request({ url: '/wms/materialCoil/listByPost', method: 'post', - data + data, + timeout: 600000 }) } diff --git a/klp-ui/src/api/wms/pendingAction.js b/klp-ui/src/api/wms/pendingAction.js index c0aba021..d6d17579 100644 --- a/klp-ui/src/api/wms/pendingAction.js +++ b/klp-ui/src/api/wms/pendingAction.js @@ -23,7 +23,8 @@ export function listPendingAction(query) { return request({ url: '/wms/coilPendingAction/list', method: 'get', - params: query + params: query, + timeout: 600000 }) } diff --git a/klp-ui/src/components/KLPUI/KLPTable/index.vue b/klp-ui/src/components/KLPUI/KLPTable/index.vue index 4bc14c76..180f77cd 100644 --- a/klp-ui/src/components/KLPUI/KLPTable/index.vue +++ b/klp-ui/src/components/KLPUI/KLPTable/index.vue @@ -9,7 +9,7 @@
+ @cell-mouse-enter="handleCellEnter" @row-mouseleave="handleRowLeave" :height="height"> diff --git a/klp-ui/src/views/wms/report/duge/comprehensive.vue b/klp-ui/src/views/wms/report/duge/comprehensive.vue new file mode 100644 index 00000000..3dacb83a --- /dev/null +++ b/klp-ui/src/views/wms/report/duge/comprehensive.vue @@ -0,0 +1,37 @@ + + + \ No newline at end of file diff --git a/klp-ui/src/views/wms/report/js/calc.js b/klp-ui/src/views/wms/report/js/calc.js index 79e6d870..a4986f77 100644 --- a/klp-ui/src/views/wms/report/js/calc.js +++ b/klp-ui/src/views/wms/report/js/calc.js @@ -14,7 +14,7 @@ const calcSummary = (list, lossList) => { const totalAvgWeight = totalCount > 0 ? (totalWeight / totalCount)?.toFixed(2) : 0 // 成品比率 - const passRate = outCount > 0 ? (outTotalWeight / lossTotalWeight) : 0 + const passRate = outCount > 0 && lossTotalWeight > 0 ? (outTotalWeight / lossTotalWeight) : 0 // 损失比率 const lossRate = totalCount > 0 ? (1 - passRate) : 0 // 异常率,成品在warehouseId在'2019583656787259393', @@ -25,6 +25,9 @@ const calcSummary = (list, lossList) => { return item.warehouseId == '2019583656787259393' || item.warehouseId == '2019583325311414274' || item.warehouseId == '2019583429955104769' || item.warehouseId == '2019583137616310273' }).length / totalCount : 0 + // 正品率(1-异常率) + const passRate2 = totalCount != 0 ? (1 - abRate) : 0 + return { outCount, outTotalWeight: outTotalWeight.toFixed(2), @@ -38,6 +41,7 @@ const calcSummary = (list, lossList) => { passRate: (passRate * 100)?.toFixed(2) + '%', lossRate: (lossRate * 100)?.toFixed(2) + '%', abRate: (abRate * 100)?.toFixed(2) || 0, + passRate2: (passRate2 * 100)?.toFixed(2) || 0, } } @@ -45,14 +49,25 @@ const calcAbSummary = (list) => { // 异常统计,统计四个异常库中的各自的数量和总重 let o = { jishuCount: 0, - jishuWeight: 0, miniCount: 0, - miniWeight: 0, rubbishCount: 0, - rubbishWeight: 0, returnCount: 0, + + jishuWeight: 0, + miniWeight: 0, + rubbishWeight: 0, returnWeight: 0, + + // 计入技术部的钢卷占比 + jishuRate: 0, + // 计入小钢卷库的钢卷占比 + miniRate: 0, + // 计入废品库的钢卷占比 + rubbishRate: 0, + // 计入退货库的钢卷占比 + returnRate: 0, } + const totalCount = list.length for (let i = 0; i < list.length; i++) { // { label: '技术部', value: '2019583656787259393' }, // { label: '小钢卷库', value: '2019583325311414274' }, @@ -83,13 +98,19 @@ const calcAbSummary = (list) => { } return [ { label: '技术部钢卷数', value: o['jishuCount'] }, - { label: '技术部钢卷重量', value: o['jishuWeight'] }, { label: '小钢卷库钢卷数', value: o['miniCount'] }, - { label: '小钢卷库钢卷重量', value: o['miniWeight'] }, { label: '废品库钢卷数', value: o['rubbishCount'] }, - { label: '废品库钢卷重量', value: o['rubbishWeight'] }, { label: '退货库钢卷数', value: o['returnCount'] }, - { label: '退货库钢卷重量', value: o['returnWeight'] }, + + { label: '技术部钢卷重量', value: o['jishuWeight'].toFixed(2) }, + { label: '小钢卷库钢卷重量', value: o['miniWeight'].toFixed(2) }, + { label: '废品库钢卷重量', value: o['rubbishWeight'].toFixed(2) }, + { label: '退货库钢卷重量', value: o['returnWeight'].toFixed(2) }, + + { label: '技术部占比', value: totalCount > 0 ? (o['jishuCount'] / totalCount * 100).toFixed(2) + '%' : '0.00%' }, + { label: '小钢卷库占比', value: totalCount > 0 ? (o['miniCount'] / totalCount * 100).toFixed(2) + '%' : '0.00%' }, + { label: '废品库占比', value: totalCount > 0 ? (o['rubbishCount'] / totalCount * 100).toFixed(2) + '%' : '0.00%' }, + { label: '退货库占比', value: totalCount > 0 ? (o['returnCount'] / totalCount * 100).toFixed(2) + '%' : '0.00%' }, ] } @@ -110,8 +131,68 @@ const calcTeamSummary = (list) => { return teamSummary } +const calcMSummary = (list, lossList) => { + // 统计,需要二外处理M卷,也就是钢卷的currentCoilNo中带有M的钢卷,在统计产出钢卷的数量和重量时需要忽略并记录,并且在统计消耗钢卷的总重量时也需要移除 + + // 筛选出 M 卷 + const mCoils = list.filter(item => item.currentCoilNo && item.currentCoilNo.includes('M')) + // 非 M 卷 + const nonMCoils = list.filter(item => !item.currentCoilNo || !item.currentCoilNo.includes('M')) + + // 非 M 卷作为产出统计 + const outCount = nonMCoils.length + const outTotalWeight = nonMCoils.reduce((acc, cur) => acc + (parseFloat(cur.netWeight) || 0), 0) + const outAvgWeight = outCount > 0 ? (outTotalWeight / outCount)?.toFixed(2) : 0 + + // 计算产出的 M 卷总重量 + const mOutTotalWeight = mCoils.reduce((acc, cur) => acc + (parseFloat(cur.netWeight) || 0), 0) + + // 消耗钢卷统计(数量包括所有卷,但总重量减去产出的 M 卷重量) + const lossCount = lossList.length + const lossTotalWeight = lossList.reduce((acc, cur) => acc + (parseFloat(cur.netWeight) || 0), 0) - mOutTotalWeight + const lossAvgWeight = lossCount > 0 ? (lossTotalWeight / lossCount)?.toFixed(2) : 0 + + // 合计 + const totalCount = outCount + lossCount + const totalWeight = parseFloat((outTotalWeight + lossTotalWeight).toFixed(2)) + const totalAvgWeight = totalCount > 0 ? (totalWeight / totalCount)?.toFixed(2) : 0 + + // 成品比率 + const passRate = outCount > 0 && lossTotalWeight > 0 ? (outTotalWeight / lossTotalWeight) : 0 + // 损失比率 + const lossRate = totalCount > 0 ? (1 - passRate) : 0 + + // 异常率,成品在warehouseId在'2019583656787259393', + // '2019583325311414274', + // '2019583429955104769', + // '2019583137616310273',这四个库中的占比 + const abRate = totalCount != 0 ? nonMCoils.filter(item => { + return item.warehouseId == '2019583656787259393' || item.warehouseId == '2019583325311414274' || item.warehouseId == '2019583429955104769' || item.warehouseId == '2019583137616310273' + }).length / totalCount : 0 + + // 正品率(1-异常率) + const passRate2 = totalCount != 0 ? (1 - abRate) : 0 + + return { + outCount, + outTotalWeight: outTotalWeight.toFixed(2), + outAvgWeight, + lossCount, + lossTotalWeight: lossTotalWeight.toFixed(2), + lossAvgWeight, + totalCount, + totalWeight: totalWeight.toFixed(2), + totalAvgWeight, + passRate: (passRate * 100)?.toFixed(2) + '%', + lossRate: (lossRate * 100)?.toFixed(2) + '%', + abRate: (abRate * 100)?.toFixed(2) || 0, + passRate2: (passRate2 * 100)?.toFixed(2) || 0, + } +} + export { calcSummary, calcAbSummary, calcTeamSummary, + calcMSummary, } \ No newline at end of file diff --git a/klp-ui/src/views/wms/report/lajiao/comprehensive.vue b/klp-ui/src/views/wms/report/lajiao/comprehensive.vue new file mode 100644 index 00000000..59b7ee5e --- /dev/null +++ b/klp-ui/src/views/wms/report/lajiao/comprehensive.vue @@ -0,0 +1,37 @@ + + + \ No newline at end of file diff --git a/klp-ui/src/views/wms/report/merge/index.vue b/klp-ui/src/views/wms/report/merge/index.vue index 8bf716de..ecb4dd29 100644 --- a/klp-ui/src/views/wms/report/merge/index.vue +++ b/klp-ui/src/views/wms/report/merge/index.vue @@ -61,6 +61,31 @@ {{ summary.lossRate }} {{ summary.abRate }} + + {{ summary.passRate2 }} + + + + + {{ mSummary.outCount }} + {{ mSummary.outTotalWeight }}t + {{ mSummary.outAvgWeight }}t + + {{ mSummary.lossCount }} + {{ mSummary.lossTotalWeight }}t + {{ mSummary.lossAvgWeight }}t + + {{ mSummary.totalCount }} + {{ mSummary.totalWeight }}t + {{ mSummary.totalAvgWeight }}t + + + {{ mSummary.passRate }} + {{ mSummary.lossRate }} + + {{ mSummary.abRate }} + + {{ mSummary.passRate2 }} @@ -94,7 +119,7 @@ import MutiSelect from "@/components/MutiSelect"; import ProductInfo from "@/components/KLPService/Renderer/ProductInfo"; import RawMaterialInfo from "@/components/KLPService/Renderer/RawMaterialInfo"; import CoilNo from "@/components/KLPService/Renderer/CoilNo.vue"; -import { calcSummary } from "@/views/wms/report/js/calc"; +import { calcSummary, calcMSummary } from "@/views/wms/report/js/calc"; import CoilTable from "@/views/wms/report/components/coilTable"; import ColumnsSetting from "@/views/wms/report/components/setting/columns"; @@ -191,6 +216,9 @@ export default { summary() { return calcSummary(this.outList, this.lossList) }, + mSummary() { + return calcMSummary(this.outList, this.lossList) + }, }, created() { this.handleQuery() diff --git a/klp-ui/src/views/wms/report/shuang/comprehensive.vue b/klp-ui/src/views/wms/report/shuang/comprehensive.vue new file mode 100644 index 00000000..363a0419 --- /dev/null +++ b/klp-ui/src/views/wms/report/shuang/comprehensive.vue @@ -0,0 +1,37 @@ + + + \ No newline at end of file diff --git a/klp-ui/src/views/wms/report/template/comprehensive.vue b/klp-ui/src/views/wms/report/template/comprehensive.vue new file mode 100644 index 00000000..7ed1e539 --- /dev/null +++ b/klp-ui/src/views/wms/report/template/comprehensive.vue @@ -0,0 +1,402 @@ + + + + + \ No newline at end of file diff --git a/klp-ui/src/views/wms/report/template/day.vue b/klp-ui/src/views/wms/report/template/day.vue index 88e37c14..59a46cc0 100644 --- a/klp-ui/src/views/wms/report/template/day.vue +++ b/klp-ui/src/views/wms/report/template/day.vue @@ -62,6 +62,31 @@ {{ summary.lossRate }} {{ summary.abRate }} + + {{ summary.passRate2 }} + + + + + {{ mSummary.outCount }} + {{ mSummary.outTotalWeight }}t + {{ mSummary.outAvgWeight }}t + + {{ mSummary.lossCount }} + {{ mSummary.lossTotalWeight }}t + {{ mSummary.lossAvgWeight }}t + + {{ mSummary.totalCount }} + {{ mSummary.totalWeight }}t + {{ mSummary.totalAvgWeight }}t + + + {{ mSummary.passRate }} + {{ mSummary.lossRate }} + + {{ mSummary.abRate }} + + {{ mSummary.passRate2 }} @@ -73,12 +98,12 @@ - - - + + + @@ -102,7 +127,7 @@ import CoilNo from "@/components/KLPService/Renderer/CoilNo.vue"; import MemoInput from "@/components/MemoInput"; import MutiSelect from "@/components/MutiSelect"; import WarehouseSelect from "@/components/KLPService/WarehouseSelect"; -import { calcSummary, calcAbSummary } from "@/views/wms/report/js/calc"; +import { calcSummary, calcAbSummary, calcMSummary } from "@/views/wms/report/js/calc"; import ColumnsSetting from "@/views/wms/report/components/setting/columns.vue"; import CoilTable from "@/views/wms/report/components/coilTable/index.vue"; @@ -156,7 +181,7 @@ export default { const { start, end } = getDayTimeRange(currentDate) return { - activeTab: 'loss', + activeTab: 'output', activeColumnConfig: 'coil-report-loss', settingVisible: false, list: [], @@ -209,6 +234,9 @@ export default { }, abSummary() { return calcAbSummary(this.list) + }, + mSummary() { + return calcMSummary(this.list, this.lossList) } }, methods: { @@ -229,7 +257,7 @@ export default { // 统一查询入口(兼容回车和按钮点击) handleQuery() { this.getList() - this.getLossList() + // this.getLossList() }, // 核心查询逻辑 getList() { @@ -264,7 +292,8 @@ export default { computedWidth: parseFloat(width), } }) - this.loading = false + this.getLossList() + // this.loading = false }) }, async getLossList() { @@ -333,7 +362,7 @@ export default { }, mounted() { this.getList() - this.getLossList() + // this.getLossList() this.loadColumns() } } diff --git a/klp-ui/src/views/wms/report/template/month.vue b/klp-ui/src/views/wms/report/template/month.vue index d2405d58..44d88428 100644 --- a/klp-ui/src/views/wms/report/template/month.vue +++ b/klp-ui/src/views/wms/report/template/month.vue @@ -62,6 +62,31 @@ {{ summary.lossRate }} {{ summary.abRate }} + + {{ summary.passRate2 }} + + + + + {{ mSummary.outCount }} + {{ mSummary.outTotalWeight }}t + {{ mSummary.outAvgWeight }}t + + {{ mSummary.lossCount }} + {{ mSummary.lossTotalWeight }}t + {{ mSummary.lossAvgWeight }}t + + {{ mSummary.totalCount }} + {{ mSummary.totalWeight }}t + {{ mSummary.totalAvgWeight }}t + + + {{ mSummary.passRate }} + {{ mSummary.lossRate }} + + {{ mSummary.abRate }} + + {{ mSummary.passRate2 }} @@ -73,12 +98,12 @@ - - - + + + @@ -102,7 +127,7 @@ import CoilNo from "@/components/KLPService/Renderer/CoilNo.vue"; import MemoInput from "@/components/MemoInput"; import MutiSelect from "@/components/MutiSelect"; import WarehouseSelect from "@/components/KLPService/WarehouseSelect"; -import { calcSummary, calcAbSummary } from "@/views/wms/report/js/calc"; +import { calcSummary, calcAbSummary, calcMSummary } from "@/views/wms/report/js/calc"; import ColumnsSetting from "@/views/wms/report/components/setting/columns.vue"; import CoilTable from "@/views/wms/report/components/coilTable/index.vue"; @@ -186,7 +211,7 @@ export default { const { start, end } = getDayTimeRange(currentDate) return { - activeTab: 'loss', + activeTab: 'output', activeColumnConfig: 'coil-report-loss', settingVisible: false, list: [], @@ -239,6 +264,9 @@ export default { }, abSummary() { return calcAbSummary(this.list) + }, + mSummary() { + return calcMSummary(this.list, this.lossList) } }, methods: { @@ -259,7 +287,7 @@ export default { // 统一查询入口(兼容回车和按钮点击) handleQuery() { this.getList() - this.getLossList() + // this.getLossList() }, // 核心查询逻辑 getList() { @@ -294,7 +322,9 @@ export default { computedWidth: parseFloat(width), } }) - this.loading = false + // this.loading = false + this.getLossList() + // this.loading = false }) }, async getLossList() { @@ -363,7 +393,7 @@ export default { }, mounted() { this.getList() - this.getLossList() + // this.getLossList() this.loadColumns() } } diff --git a/klp-ui/src/views/wms/report/template/shuang.vue b/klp-ui/src/views/wms/report/template/shuang.vue new file mode 100644 index 00000000..4bf638a0 --- /dev/null +++ b/klp-ui/src/views/wms/report/template/shuang.vue @@ -0,0 +1,168 @@ + + + \ No newline at end of file diff --git a/klp-ui/src/views/wms/report/zha/comprehensive.vue b/klp-ui/src/views/wms/report/zha/comprehensive.vue new file mode 100644 index 00000000..703bcd50 --- /dev/null +++ b/klp-ui/src/views/wms/report/zha/comprehensive.vue @@ -0,0 +1,40 @@ + + + \ No newline at end of file diff --git a/klp-ui/src/views/wms/report/zinc/comprehensive.vue b/klp-ui/src/views/wms/report/zinc/comprehensive.vue new file mode 100644 index 00000000..5be7bad7 --- /dev/null +++ b/klp-ui/src/views/wms/report/zinc/comprehensive.vue @@ -0,0 +1,38 @@ + + + \ No newline at end of file diff --git a/klp-wms/src/main/java/com/klp/domain/bo/WmsMaterialCoilBo.java b/klp-wms/src/main/java/com/klp/domain/bo/WmsMaterialCoilBo.java index fba2faa8..afae1c0a 100644 --- a/klp-wms/src/main/java/com/klp/domain/bo/WmsMaterialCoilBo.java +++ b/klp-wms/src/main/java/com/klp/domain/bo/WmsMaterialCoilBo.java @@ -319,5 +319,11 @@ public class WmsMaterialCoilBo extends BaseEntity { * 钢卷异常信息列表(用于更新钢卷时同时插入异常信息) */ private List abnormals; + + /** + * 按异常数量排序(异常钢卷在前按创建时间,没异常的钢卷在后按创建时间) + */ + @TableField(exist = false) + private Boolean orderByAbnormal; } diff --git a/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java b/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java index 5164a25f..88e258a0 100644 --- a/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java +++ b/klp-wms/src/main/java/com/klp/service/impl/WmsMaterialCoilServiceImpl.java @@ -689,6 +689,10 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { qw.orderByAsc("aw_sort_key"); qw.orderByAsc("aw_layer_key"); qw.orderByAsc("aw_id_key"); + } else if (Boolean.TRUE.equals(bo.getOrderByAbnormal())) { + // 按异常排序:异常的钢卷在前按创建时间倒序,没异常的钢卷在后按创建时间倒序 + qw.orderByAsc("CASE WHEN COALESCE(ca.abnormal_count, 0) > 0 THEN 0 ELSE 1 END"); + qw.orderByDesc("mc.create_time"); } else { //根据创建时间倒叙 qw.orderByDesc("mc.create_time"); @@ -2539,6 +2543,10 @@ public class WmsMaterialCoilServiceImpl implements IWmsMaterialCoilService { WmsMaterialCoilVo wmsMaterialCoilVo = queryById(coilId); Long oldActualWarehouseId = wmsMaterialCoilVo != null ? wmsMaterialCoilVo.getActualWarehouseId() : null; + // 如果质量状态为O的提示不能发货 + if (wmsMaterialCoilVo != null && Objects.equals(wmsMaterialCoilVo.getQualityStatus(), "O")) { + throw new RuntimeException("当前钢卷为质检未通过,请勿发货!"); + } // 如果当前钢卷为历史数据应该抛异常 if (wmsMaterialCoilVo != null && wmsMaterialCoilVo.getDataType() == 0) { throw new RuntimeException("当前数据为历史数据,请勿发货!");