diff --git a/src/api/model/pum.js b/src/api/model/pum.js index 7ae2d41c..044919ca 100644 --- a/src/api/model/pum.js +++ b/src/api/model/pum.js @@ -1,6 +1,108 @@ import config from "@/config" import http from "@/utils/request" export default { + // 采购合同 + contract: { + list: { + name: "采购合同列表", + req: async function(data){ + return await http.get( + `${config.API_URL}/pum/pu_contract/`, + data + ); + } + }, + create: { + name: "创建采购合同", + req: async function(data){ + return await http.post( + `${config.API_URL}/pum/pu_contract/`, + data); + } + }, + cquery: { + name: "复杂查询", + req: async function(data){ + return await http.post( + `${config.API_URL}/pum/pu_contract/cquery/`, + data); + } + }, + item: { + name: "获取采购合同详情", + req: async function(id){ + return await http.get( + `${config.API_URL}/pum/pu_contract/${id}/` + ); + } + }, + update: { + name: "更新采购合同", + req: async function(id, data){ + return await http.put( + `${config.API_URL}/pum/pu_contract/${id}/`, + data); + } + }, + delete: { + name: "删除采购合同", + req: async function(id){ + return await http.delete( + `${config.API_URL}/pum/pu_contract/${id}/`); + } + } + }, + // 采购合同付款流水 + contractRecord: { + list: { + name: "采购合同付款流水列表", + req: async function(data){ + return await http.get( + `${config.API_URL}/pum/pu_contract_record/`, + data + ); + } + }, + create: { + name: "创建采购合同付款流水", + req: async function(data){ + return await http.post( + `${config.API_URL}/pum/pu_contract_record/`, + data); + } + }, + cquery: { + name: "复杂查询", + req: async function(data){ + return await http.post( + `${config.API_URL}/pum/pu_contract_record/cquery/`, + data); + } + }, + item: { + name: "获取采购合同付款流水详情", + req: async function(id){ + return await http.get( + `${config.API_URL}/pum/pu_contract_record/${id}/` + ); + } + }, + update: { + name: "更新采购合同付款流水", + req: async function(id, data){ + return await http.put( + `${config.API_URL}/pum/pu_contract_record/${id}/`, + data); + } + }, + delete: { + name: "删除采购合同付款流水", + req: async function(id){ + return await http.delete( + `${config.API_URL}/pum/pu_contract_record/${id}/`); + } + } + }, // 采购订单 order: { list: { @@ -348,4 +450,4 @@ export default { } }, } -} \ No newline at end of file +} diff --git a/src/api/model/sam.js b/src/api/model/sam.js index edf443f5..c158ea14 100644 --- a/src/api/model/sam.js +++ b/src/api/model/sam.js @@ -52,6 +52,56 @@ export default { } } }, + contractRecord: { + list: { + name: "合同流水列表", + req: async function(data){ + return await http.get( + `${config.API_URL}/sam/contract_record/`, + data + ); + } + }, + create: { + name: "创建合同流水", + req: async function(data){ + return await http.post( + `${config.API_URL}/sam/contract_record/`, + data); + } + }, + cquery: { + name: "复杂查询", + req: async function(data){ + return await http.post( + `${config.API_URL}/sam/contract_record/cquery/`, + data); + } + }, + item: { + name: "获取合同流水详情", + req: async function(id){ + return await http.get( + `${config.API_URL}/sam/contract_record/${id}/` + ); + } + }, + update: { + name: "更新合同流水", + req: async function(id, data){ + return await http.put( + `${config.API_URL}/sam/contract_record/${id}/`, + data); + } + }, + delete: { + name: "删除合同流水", + req: async function(id){ + return await http.delete( + `${config.API_URL}/sam/contract_record/${id}/`); + } + } + }, // 客户信息 customer: { list: { @@ -187,4 +237,4 @@ export default { } }, } -} \ No newline at end of file +} diff --git a/src/config/route.js b/src/config/route.js index f04bbd68..6ee83b9d 100644 --- a/src/config/route.js +++ b/src/config/route.js @@ -2191,6 +2191,24 @@ const routes = [ }, component: "pum/planitem", }, + { + name: "puContract", + path: "/pum/contract", + meta: { + title: "采购合同", + perms: ["pu_contract"], + }, + component: "pum/contract", + }, + { + name: "puContractRecord", + path: "/pum/contract_record", + meta: { + title: "付款流水查询", + perms: ["pu_contract"], + }, + component: "pum/contract_record", + }, { name: "order", path: "/pum/order", @@ -2245,6 +2263,15 @@ const routes = [ }, component: "sam/contract", }, + { + name: "contractRecord", + path: "/sam/contract_record", + meta: { + title: "到款流水查询", + perms: ["contract"], + }, + component: "sam/contract_record", + }, { name: "samOrder", path: "/sam/samOrder", diff --git a/src/views/bigScreen/bxerp/jiejingdept.vue b/src/views/bigScreen/bxerp/jiejingdept.vue index a0aea3f0..4e2d227b 100644 --- a/src/views/bigScreen/bxerp/jiejingdept.vue +++ b/src/views/bigScreen/bxerp/jiejingdept.vue @@ -14,10 +14,27 @@ -
+
-
产品占比
- +
+
+
+ + 📦 + 产品统计 +
+
+
+
+
+ {{ group.type }} +
+
+ {{ item }} +
+
+
+
@@ -107,22 +124,21 @@
👥 - 人员日产量 TOP5 + 人员月产量
单位: 件
-
{{ item.操作人 ? item.操作人.charAt(0) : '?' }}
-
{{ item.操作人 }}
+
{{ item.name ? item.name.charAt(0) : '?' }}
+
{{ item.name }}
- {{ item.生产数 }} + {{ item.count }}
@@ -396,9 +412,9 @@ export default { {name:'洗棒',value:0}, {name:'捆棒',value:0}, {name:'拉单丝',value:0}, - {name:'捆一次棒',value:0}, + {name:'排一次棒',value:0}, {name:'一次复丝',value:0}, - {name:'捆二次棒',value:0}, + {name:'排二次棒',value:0}, {name:'二次复丝',value:0}, ], showValue: true @@ -423,6 +439,11 @@ export default { lastUpdateInterval: null, scrollTimer: null, performanceList: [], + materialsList: [ + {type: '倒像器', color: '#53c6f3', list: [],img:'public/img/bx/dxq2.png'}, + {type: '直板', color: '#c8ff50', list: [],img:'public/img/bx/zb2.png'}, + {type: '光锥', color: '#ff9d3e', list: [],img:'public/img/bx/gz2.png'} + ], perfScrollTimer: null, currentTime: "", currentDay: "", @@ -430,7 +451,7 @@ export default { end_time:'', start_time:'', deptName:"拉丝排板班组", - mgroups:['洗棒','捆棒','拉单丝','捆一次棒','一次复丝','捆二次棒','二次复丝'], + mgroups:['洗棒','捆棒','拉单丝','排一次棒','一次复丝','排二次棒','二次复丝'], }; }, computed: { @@ -445,34 +466,32 @@ export default { if (this.equipmentList.length === 0) return []; return [...this.equipmentList, ...this.equipmentList]; }, - // 全员按生产数降序排列 + // 全员按 count 降序排列 sortedPerfList() { return [...this.performanceList] - .sort((a, b) => Number(b.生产数) - Number(a.生产数)); + .sort((a, b) => b.count - a.count); }, // 渲染两份,用于无缝滚动 scrollPerfItems() { if (!this.sortedPerfList.length) return []; return [...this.sortedPerfList, ...this.sortedPerfList]; }, - // 平均效率 = 合格数之和 / 生产数之和 - avgEfficiency() { - if (!this.performanceList.length) return 0; - const totalProd = this.performanceList.reduce((s, i) => s + Number(i.生产数 || 0), 0); - const totalOk = this.performanceList.reduce((s, i) => s + Number(i.合格数 || 0), 0); - if (!totalProd) return 0; - return Math.round(totalOk / totalProd * 100); - }, - // 标兵 = 生产数最多的人 + // 标兵 = 产量最多的人 topPerson() { if (!this.performanceList.length) return '-'; return [...this.performanceList] - .sort((a, b) => Number(b.生产数) - Number(a.生产数))[0]?.操作人 || '-'; + .sort((a, b) => b.count - a.count)[0]?.name || '-'; + }, + materialsGroups() { + if (this.equipmentList.length === 0) return []; + console.log(this.equipmentList); + return [...this.equipmentList]; + }, }, mounted() { let that = this; - //洗棒、捆棒、拉丝 :洗棒、捆棒、拉单丝、捆一次棒、一次复丝、捆二次棒、二次复丝 + //洗棒、捆棒、拉丝 :洗棒、捆棒、拉单丝、排一次棒、一次复丝、排二次棒、二次复丝 this.showTime(); this.dayInterval = setInterval(() => { this.showTime(); @@ -481,10 +500,12 @@ export default { that.getEquipment(); that.getMgroups(); //每个人日生产量:个人绩效 - that.getEveryoneCount(); - // that.getEveryoneCount(that.deptName2); - // that.getEveryoneCount(that.deptName3); + // that.getEveryoneCount(); that.materialAll(); + let date = new Date(); + let year = date.getFullYear(); + let month = date.getMonth() + 1; + console.log(new Date(year, month, 0).getDate()) }, methods: { getMondayOfCurrentWeek() { @@ -526,10 +547,17 @@ export default { let that = this; let params = {page: 0,query:" { id, name }"}; that.$API.mtm.mgroup.list.req(params).then((res) => { + that.performanceList = []; + that.materialsList[0].list = []; + that.materialsList[1].list = []; + that.materialsList[2].list = []; res.forEach((item)=>{ let index = that.mgroups.indexOf(item.name); if(index>-1){ + //车间库存 that.getmgroupMaterial(item.id,item.name,index); + //员工生产统计 + that.getEveryoneCount(item.id,item.name) } }) }) @@ -637,16 +665,43 @@ export default { }); }, //每个人日产量 - getEveryoneCount(){ + getEveryoneCount(id,name){ let that = this; - that.performanceList = []; - let date = that.$TOOL.dateFormat(new Date(), "yyyy-MM-dd"); + let date = new Date(); + let year = date.getFullYear(); + let month = date.getMonth() + 1; + let days = new Date(year, month,0).getDate(); + let start_date = year + "-" + month + "-01"; + let end_date = year + "-" + month + "-" + days; let params = { - query: {start_date:date,end_date:date,dept_name:that.deptName}, + query: {start_date:start_date,end_date:end_date,mgroup_name:name}, }; - this.$API.bi.dataset.exec.req("performance", params).then((res) => { + let exceStr = ""; + if(name=='拉单丝'){ + exceStr = "product_defect_lds"; + }else if(name=='排一次棒'||name=='一次复丝'||name=='排二次棒'||name=='二次复丝'){ + exceStr = "product_defect_jjcj"; + } + this.$API.bi.dataset.exec.req(exceStr, params).then((res) => { if(res.data2.ds0.length > 0){ - that.performanceList = res.data2.ds0; + res.data2.ds0.forEach(item => { + const itemName = item.员工; + const count = Number(item.总切片数) || 0; + const existing = that.performanceList.find(p => p.name === itemName); + if (existing) { + existing.count += count; + } else { + that.performanceList.push({ name: itemName, count }); + } + const matName = item.物料名; + let index = matName.indexOf('倒像器') > -1 ? 0: matName.indexOf('直板') > -1 ?1 : 2; + const matExisting = that.materialsList[index].list.find(m => m === matName); + if (matExisting) { + } else { + that.materialsList[index].list.push(matName); + } + }); + console.log('that.materialsList',that.materialsList); } that.$nextTick(() => { that.startPerfScroll(); }); }); @@ -760,9 +815,112 @@ export default { left: 5%; border-radius: 3vh; } -.leftChartBlock2{ - width:100%; - height: 35vh; +/* ===== 产品统计面板 ===== */ +.mat-panel-wrap { position: relative; } + +.mat-inner { + position: absolute; + inset: 2.5%; + display: flex; + flex-direction: column; + overflow: hidden; +} + +.mat-header { + flex-shrink: 0; + display: flex; + align-items: center; + height: 4vh; + padding: 0 1.2vh; + border-bottom: 1px solid rgba(83, 198, 243, 0.25); +} +.mat-title { + display: flex; + align-items: center; + gap: 0.4vh; + font-size: 1.5vh; + font-weight: 600; + color: #e0f4ff; +} +.mat-title-bar { + display: inline-block; + width: 3px; + height: 1.6vh; + background: #00b4ff; + border-radius: 2px; + margin-right: 2px; +} +.mat-title-icon { font-style: normal; font-size: 1.4vh; } + +.mat-body { + flex: 1; + overflow-y: auto; + padding: 0.5vh 0.8vh; + display: flex; + flex-direction: column; + gap: 1vh; +} +.mat-body::-webkit-scrollbar { width: 2px; } +.mat-body::-webkit-scrollbar-thumb { background: rgba(83, 198, 243, 0.3); border-radius: 2px; } + +.mat-group { display: flex; flex-direction: column; gap: 0.35vh; } + +.mat-group-label { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0.25vh 0.6vh; + margin-bottom: 0.15vh; + border-left: 2.5px solid; + background: rgba(255, 255, 255, 0.04); + border-radius: 0 0.4vh 0.4vh 0; + font-size: 1.25vh; + font-weight: 600; + color: rgba(220, 240, 255, 0.9); +} +.mat-group-total { + font-size: 1.3vh; + font-weight: 700; + font-family: "myfont", "Microsoft Yahei"; +} + +.mat-row { + width: 100%; + text-align: left; + font-size: 1.1vh; + color: rgba(180, 215, 240, 0.75); + padding: 0.1vh 1vw; + +} +.mat-name { + width: 9vh; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + flex-shrink: 0; +} +.mat-bar-wrap { + flex: 1; + height: 0.7vh; + background: rgba(255, 255, 255, 0.08); + border-radius: 1vh; + overflow: hidden; +} +.mat-bar { + display: block; + height: 100%; + border-radius: 1vh; + opacity: 0.75; + transition: width 0.6s ease; +} +.mat-count { + flex-shrink: 0; + width: 4vh; + text-align: right; + font-weight: 700; + font-family: "myfont", "Microsoft Yahei"; + font-size: 1.3vh; + color: #c8ff50; } .middleTableBlock1{ width:94%; @@ -1048,4 +1206,5 @@ export default { color: #ff9d3e; font-size: 1.4vh; } + diff --git a/src/views/pum/components/PuContractRecordDrawer.vue b/src/views/pum/components/PuContractRecordDrawer.vue new file mode 100644 index 00000000..e065c1df --- /dev/null +++ b/src/views/pum/components/PuContractRecordDrawer.vue @@ -0,0 +1,275 @@ + + + + + diff --git a/src/views/pum/components/PuContractRecordForm.vue b/src/views/pum/components/PuContractRecordForm.vue new file mode 100644 index 00000000..60fa70d6 --- /dev/null +++ b/src/views/pum/components/PuContractRecordForm.vue @@ -0,0 +1,191 @@ + + + diff --git a/src/views/pum/contract.vue b/src/views/pum/contract.vue new file mode 100644 index 00000000..f73eba51 --- /dev/null +++ b/src/views/pum/contract.vue @@ -0,0 +1,170 @@ + + + + diff --git a/src/views/pum/contract_form.vue b/src/views/pum/contract_form.vue new file mode 100644 index 00000000..0f9c12ce --- /dev/null +++ b/src/views/pum/contract_form.vue @@ -0,0 +1,179 @@ + + + diff --git a/src/views/pum/contract_record.vue b/src/views/pum/contract_record.vue new file mode 100644 index 00000000..2f16d806 --- /dev/null +++ b/src/views/pum/contract_record.vue @@ -0,0 +1,110 @@ + + + diff --git a/src/views/pum/order_form.vue b/src/views/pum/order_form.vue index 56c12ed2..974b0032 100644 --- a/src/views/pum/order_form.vue +++ b/src/views/pum/order_form.vue @@ -40,6 +40,25 @@ + + + + + + + { + this.contractOptions = res; + }); + }, + handleContractChange(value) { + const contract = this.contractOptions.find((item) => item.id === value); + if (contract) { + this.form.supplier = contract.supplier; + } + }, //提交 submit() { this.$refs.dialogForm.validate(async (valid) => { diff --git a/src/views/sam/components/ContractRecordDrawer.vue b/src/views/sam/components/ContractRecordDrawer.vue new file mode 100644 index 00000000..e2cb71a9 --- /dev/null +++ b/src/views/sam/components/ContractRecordDrawer.vue @@ -0,0 +1,275 @@ + + + + + diff --git a/src/views/sam/components/ContractRecordForm.vue b/src/views/sam/components/ContractRecordForm.vue new file mode 100644 index 00000000..a7316da0 --- /dev/null +++ b/src/views/sam/components/ContractRecordForm.vue @@ -0,0 +1,191 @@ + + + diff --git a/src/views/sam/contract.vue b/src/views/sam/contract.vue index 96c26606..85f0d44d 100644 --- a/src/views/sam/contract.vue +++ b/src/views/sam/contract.vue @@ -12,23 +12,58 @@ - - + + + + + + + + + + + + + + - + + - + \ No newline at end of file + + diff --git a/src/views/sam/contract_form.vue b/src/views/sam/contract_form.vue index 31511550..e1affd11 100644 --- a/src/views/sam/contract_form.vue +++ b/src/views/sam/contract_form.vue @@ -43,6 +43,35 @@ + + + + + + + + + + + + + + + + + + + +
+
+ + + + + +
+
+ + + + + + + + + + + + + + + + + + + + +
+ + + + diff --git a/src/views/statistics/batch_statistics.vue b/src/views/statistics/batch_statistics.vue index 9f2326bb..07b7904a 100644 --- a/src/views/statistics/batch_statistics.vue +++ b/src/views/statistics/batch_statistics.vue @@ -3,15 +3,6 @@ - - @@ -137,6 +127,7 @@