From e9ddad4ff2b6b855f46c54b203aeb469c1f9e739 Mon Sep 17 00:00:00 2001 From: Administrator Date: Fri, 19 Nov 2021 16:35:33 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ReportServices/ReportMakeService.cs | 32 ++++++++++++++++++ .../SettleAccount.Application.xml | 7 ++++ .../SettleFisDiffDetailDapperRepository.cs | 26 +++++++------- .../Report/SettleFisDiffExportService.cs | 31 ++++++++++++++--- ....Snowflakes.csproj.AssemblyReference.cache | Bin 11 -> 18773 bytes ....Sfs.Shared.csproj.AssemblyReference.cache | Bin 27174 -> 203914 bytes .../Win.Utils.csproj.AssemblyReference.cache | Bin 7887 -> 177051 bytes 7 files changed, 79 insertions(+), 17 deletions(-) diff --git a/src/Modules/SettleAccount/src/SettleAccount.Application/Reports/ReportServices/ReportMakeService.cs b/src/Modules/SettleAccount/src/SettleAccount.Application/Reports/ReportServices/ReportMakeService.cs index 01e2e7b5..1559a11a 100644 --- a/src/Modules/SettleAccount/src/SettleAccount.Application/Reports/ReportServices/ReportMakeService.cs +++ b/src/Modules/SettleAccount/src/SettleAccount.Application/Reports/ReportServices/ReportMakeService.cs @@ -231,6 +231,38 @@ namespace Win.Sfs.SettleAccount.Reports.ReportServices return _taskid; } + /// + /// 导入功能 + /// + /// 上传的文件(前端已经限制只能上传一个附件) + /// + [HttpGet] + [Route("SettleFisDiffExport-Make")] + [DisableRequestSizeLimit] + + public async Task SettleFisDiffExportMake( string version, string materialCode, string begin, string end) + { + List customConditionList = new List(); + customConditionList.Add(new CustomCondition() { Name = "Version", Value = version }); + customConditionList.Add(new CustomCondition() { Name = "MaterialCode", Value = materialCode}); + customConditionList.Add(new CustomCondition() { Name = "BeginTime", Value = begin }); + customConditionList.Add(new CustomCondition() { Name = "EndTime", Value = end }); + var _taskid = await _service.ExportEnqueueAsync("大众准时化结算数量差异比对表", ExportExtentsion.Excel, CurrentUser, typeof(SettleFisDiffExportService), customConditionList, (rs) => + { + }); + return _taskid; + } + + + + + + + + + + + /// /// 结算总成和ERP总成价格对比 /// diff --git a/src/Modules/SettleAccount/src/SettleAccount.Application/SettleAccount.Application.xml b/src/Modules/SettleAccount/src/SettleAccount.Application/SettleAccount.Application.xml index 20ed6029..d19c03bf 100644 --- a/src/Modules/SettleAccount/src/SettleAccount.Application/SettleAccount.Application.xml +++ b/src/Modules/SettleAccount/src/SettleAccount.Application/SettleAccount.Application.xml @@ -2294,6 +2294,13 @@ 上传的文件(前端已经限制只能上传一个附件) + + + 导入功能 + + 上传的文件(前端已经限制只能上传一个附件) + + 结算总成和ERP总成价格对比 diff --git a/src/Modules/SettleAccount/src/SettleAccount.EntityFrameworkCore/Repository/SettleAccountJob/Report/SettleFisDiffDetailDapperRepository.cs b/src/Modules/SettleAccount/src/SettleAccount.EntityFrameworkCore/Repository/SettleAccountJob/Report/SettleFisDiffDetailDapperRepository.cs index 9507d467..1c611486 100644 --- a/src/Modules/SettleAccount/src/SettleAccount.EntityFrameworkCore/Repository/SettleAccountJob/Report/SettleFisDiffDetailDapperRepository.cs +++ b/src/Modules/SettleAccount/src/SettleAccount.EntityFrameworkCore/Repository/SettleAccountJob/Report/SettleFisDiffDetailDapperRepository.cs @@ -1,5 +1,6 @@ using Dapper; using Magicodes.ExporterAndImporter.Core; +using Magicodes.ExporterAndImporter.Excel; using System; using System.Collections.Generic; using System.Data.Common; @@ -12,6 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace Win.Sfs.SettleAccount.Repository.SettleAccountJob.Report { + [ExcelExporter(Name = "未结明细", AutoFitAllColumn = true, MaxRowNumberOnASheet = 500000)] public class SettleFisDiffDetail { [ExporterHeader(DisplayName = "年")] @@ -29,17 +31,17 @@ namespace Win.Sfs.SettleAccount.Repository.SettleAccountJob.Report [ExporterHeader(DisplayName = "零件号" )] public string MaterialCode { set; get; } [ExporterHeader(DisplayName = "结算数量" )] - public string SettleQty { set; get; } + public decimal SettleQty { set; get; } [ExporterHeader(DisplayName = "M100状态" )] public string WMSBillNum { set; get; } [ExporterHeader(DisplayName = "M100数量" )] - public string Qty { set; get; } + public decimal Qty { set; get; } [ExporterHeader(DisplayName = "差异")] - public string DiffQty { set; get; } + public decimal DiffQty { set; get; } [ExporterHeader(DisplayName = "开票单价" )] - public string Price{ set; get; } + public decimal Price{ set; get; } [ExporterHeader(DisplayName = "差异金额")] - public string DiffPrice{ set; get; } + public decimal DiffPrice{ set; get; } [ExporterHeader(DisplayName = "SAP编码")] public string SapCode { set; get; } @@ -53,22 +55,22 @@ namespace Win.Sfs.SettleAccount.Repository.SettleAccountJob.Report [ExporterHeader(DisplayName = "物料组车型")] public string MaterialCodeGroup { set; get; } [ExporterHeader(DisplayName = "SAP编码")] - public string KENNCode { set; get; } + public string SapCode { set; get; } [ExporterHeader(DisplayName = "零件号")] public string MaterialCode { set; get; } [ExporterHeader(DisplayName = "结算数量")] - public string SettleQty { set; get; } + public decimal SettleQty { set; get; } [ExporterHeader(DisplayName = "M100状态")] public string WMSBillNum { set; get; } [ExporterHeader(DisplayName = "M100数量")] - public string Qty { set; get; } + public decimal Qty { set; get; } [ExporterHeader(DisplayName = "差异数量")] - public string DiffQty { set; get; } + public decimal DiffQty { set; get; } [ExporterHeader(DisplayName = "开票单价")] - public string Price { set; get; } + public decimal Price { set; get; } [ExporterHeader(DisplayName = "差异金额")] - public string DiffPrice { set; get; } + public decimal DiffPrice { set; get; } } public class SettleFisDiffDetailDapperRepository : DapperRepository, ITransientDependency @@ -101,7 +103,7 @@ namespace Win.Sfs.SettleAccount.Repository.SettleAccountJob.Report " Price,\n" + " a.SettleQty - isnull( b.Qty, 0 ) DiffQty,(\n" + " a.SettleQty - isnull( b.Qty, 0 ))* Price DiffPrice,\n" + -" d.CustomerPartCode SapCode \n" + +" d.MaterialCode SapCode \n" + "FROM\n" + " ( SELECT YEAR, KENNCode, ChassisNumber, Model, CP5A, CP7, MaterialCode, Qty SettleQty FROM Set_Settle WHERE version = '{0}' ) a\n" + " LEFT JOIN (\n" + diff --git a/src/Modules/SettleAccount/src/SettleAccount.Job/Services/Report/SettleFisDiffExportService.cs b/src/Modules/SettleAccount/src/SettleAccount.Job/Services/Report/SettleFisDiffExportService.cs index fae4d798..c2fd9c20 100644 --- a/src/Modules/SettleAccount/src/SettleAccount.Job/Services/Report/SettleFisDiffExportService.cs +++ b/src/Modules/SettleAccount/src/SettleAccount.Job/Services/Report/SettleFisDiffExportService.cs @@ -27,14 +27,35 @@ namespace SettleAccount.Job.Services.Report public string ExportFile(Guid id, List exportName, List p_list) { - //var year = p_list.Where(p => p.Name == "Year").FirstOrDefault().Value; - //var state = p_list.Where(p => p.Name == "State").FirstOrDefault().Value; var version = p_list.Where(p => p.Name == "Version").FirstOrDefault().Value; - var customerCode = p_list.Where(p => p.Name == "CustomerCode").FirstOrDefault().Value; + var materialCode = p_list.Where(p => p.Name == "MaterialCode").FirstOrDefault().Value; var begin = p_list.Where(p => p.Name == "BeginTime").FirstOrDefault().Value; var end = p_list.Where(p => p.Name == "EndTime").FirstOrDefault().Value; - var _list= _dapper.GetReportList(version,string.Empty,begin,end); - _outputService.Export(id,string.Format("3.大众准时化结算数量差异比对表_{0}.xlsx", Guid.NewGuid().ToString()), _list); + var _list= _dapper.GetReportList(version, materialCode, begin,end); + + _list.GroupBy(p => new { p.MaterialCode,p.SapCode }).Select(p =>new SettleFisDiffSum + { + + MaterialCode= p.Key.MaterialCode, + SapCode= p.Key.SapCode, + DiffPrice=p.Sum(p=>p.DiffPrice), + DiffQty=p.Sum(p=>p.DiffQty), + Qty=p.Sum(p=>p.Qty), + SettleQty=p.Sum(p=>p.SettleQty), + Price=p.Sum(p=>p.Price) + + + }); + + + + + + + + + + _outputService.Export(id,string.Format("大众准时化结算数量差异比对表_{0}.xlsx", Guid.NewGuid().ToString()), _list); return id.ToString(); } diff --git a/src/Shared/Win.Abp.Snowflakes/obj/Debug/netcoreapp5/Win.Abp.Snowflakes.csproj.AssemblyReference.cache b/src/Shared/Win.Abp.Snowflakes/obj/Debug/netcoreapp5/Win.Abp.Snowflakes.csproj.AssemblyReference.cache index f5e894aea93a73e58fa9d4feab241bc197ee1a40..c0945f0514ebc5eac7e4ea9acc45a42d3d0ac87a 100644 GIT binary patch literal 18773 zcmds<4R93I9l*1i6hEdhG7->GOMqGtx_6g^Bm`2-m()N^npld%*|>MNIX1c5z3lCU zT!x4++89cy5h0@#2xeM7LWm5tQBr8-OLWHCGV);+EDX?5C__t;%oI9(`*HVnb8oqK zx4SbvZzjwgdGDY9$M65Y|Gu|xtIO)@%L(G4w6rvWFE4ifI7stBXQ{`}uuM?kDS_ji zBpdS5f-^w5n<+0HbT-j~i>DYiNK!1z36#KaY|xo&&$W{d((d#zE+PsDI>7s%}TIbiZezT?PKxR(n^B;6huKM)9d3&xGgxBoZwR`OG>(k#{_wK{T4li6+ z^Pi2Oz{LqwbxRi?-n*yt;|m?DZq9jmMgGL*tFLDC(cdq=TCwPN*YCTzqn>tjVc=^pY>fU=VFzL*dPxt;gy{@XU_(S3jpi@>> z@5$puw||#dgfwRQ#03BV5YUo{A4vQ3iRB@m5aQ_)mJR_XeA6e^hFm_zJ&z7Q%{9|( ziNo%&Q+7|0ry#G$o|iiV{2lNj?rO~^?PQ)k&oMKN=pr!j@-uFp3v!JDNw*0!D=HHt z-5lGYI@DK6OVteJEwTf`K2%ZmOt{;-77O6IJernZRG3I8yc3C)a{sj zZsnl~#6Le@d)K~K9_p)pY~!r$pJhKV{{82#9->eE^nAv=?vLHWvzy+T!}k{tepzzQ zf&KYEZ><@8Yu6uxCFirB+1dZZ!rNc`!v^8t+2x+0kIv2=>E1J@>%k43j~yMB&>VO- zTr~C6&gTd^zGaY8$vrrbQXbdL!kKwRxidW;iY~Crq0~a!XC9;^{jr##djB}mVwD~zxga{d}0V}wLK|HIiFzIEJD7=MC4rz>!Eo=<+)4}0Wse? zd4q!aR1AN~voQhRWC7r^2MnRD@<6XxqvCWG|6irshaDt~aNcYp&Th`{2TiPxVQE85 zm&5 z&`R+PEK zku4^shJl}&6heJ=UP%iFh99+3FcV_Xf`rg|#!xC~ZA#H35E2fa zMfk5V5&x#3{?d!XiD7XS5CFdcs%MXRPF{cc9_Cz3z}H&a9gwvo$N=5bZ$c3kupZ zl9GhU`H)qdYrLd|Ugafx_`d<`>TO8{(xS95wxJ|mRt0#jl>w{jV7Fbh50qd+h!<70 zQ9&_5miE?jUU^+f1vD=DGBA_CoDC&?pCpLCzC9`W6@cDQ(l^s0R`YbXZ6Z1Y(YCYNyh7ga~k)n9B353cbw2iH%h#?Jz zg97dM`ZyQZDfA|Rb-g5Dt|9;;{o$7@6r|CsDI(I^xtKVcvziiXdlD#X^-ocZ(W@!3 z;jsu|W83|Uxu5{J#cD-#mIQyOh(I?X{JxV4#^~*S)ND+U&Dripc|Z?korOV^4JisU zdb=NGphY+@Gjda*j{~g*(~h{OPR{cX!s4-sF0a`i9a2C=FHviPuNHwx?Pk-d)i@#< zgw^1b2tAQtS2JqT$u)73Oo&ELdpWV}GD*u{@}gOS zv^v`*C>v6=rlLDnlz|rE95PZ)xd7r=fo@|^Baenv_X(W4 z@<$Kpz?-Q^#Ud?`x=pIuqHjv|RBW;cw*f<~sS+LSF)SFp1lO@5(bF8vLfs9wd-XdC zr}@Y)oH&9o`F-1zHXx3Rv|z*bK&R5iu`ET4?viApXi-9}Fq9Ahp7ApR(>nSdX*b8y zR3MP2cb`RVbRMk6Z`@d`Q2rgHf8ZQUpjVm#G&E7mE;JFnPYBgbQA%BLqF@n_e$0k| zWdx3-f??K8w}}N=0CiZu06!&;E)_>twvnLVilZTVYyF?!J9Jz;1DlN+7{ePlj)XXP z9ZIkPKv|$=OkE#Qiis9TilhAii2{s?L763Sv^!E=}izKjj}dL*$6qR YKFg+2MO9fVG{1n3mjvNBUZzgLQn)nMHDYk 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

dhduWoxj`ir`u1BExNL_)8tp$ebH^g;`n2y z&b{P!!^ZcCf4*ej`rn4m%zOAN<+YQa|NGuUpM?va-F!;<>Y2Cp`uOyH15SMEK-YtJ zlot)}-QmE_mj?~oYf!cC{I1_WH~6h{0`oJd)CRD^;nJGIqT1SUWJn|uDJc|z<*CnP zia&8`a9T8>#K?^kT&(NXKRsX?sIG!`K#)*;CV@DT0yImY3KBRC2o{MPY1)|7ch{7M z!%8Yeg8o{P&oN#0-U<_;-ln4B9zd8H5v`I~FfdlRHQO!B__W&q7-Y)xG<4uppd#6v z(DZG4iF&e^i{Fml=eEmC#``IuPD@O31@Uk+ zK@L3urnhgF9QPuWANmQa_W< Date: Sat, 20 Nov 2021 17:23:54 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fish=E9=A1=B5=E9=9D=A2=E8=81=94=E8=B0=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vue/src/components/ImportTxt/index.vue | 63 +- vue/src/router/modules/fis.js | 10 + .../pg-fis/basedate/assemblyCfg/index.vue | 25 +- .../pg-fis/basedate/customerPartCfg/index.vue | 166 +- .../views/pg-fis/basedate/m100BIll/detail.vue | 347 ++++ .../views/pg-fis/basedate/m100BIll/index.vue | 118 +- .../pg-fis/basedate/m100Online/detail.vue | 354 ++++ .../pg-fis/basedate/m100Online/index.vue | 82 +- .../pg-fis/basedate/productLine/index.vue | 6 +- .../pg-fis/basedate/r100Online/detail.vue | 354 ++++ .../pg-fis/basedate/r100Online/index.vue | 106 +- .../basedate/unknownAssembly/detail.vue | 270 +++ .../pg-fis/basedate/unknownAssembly/index.vue | 1491 +++++++++++++++++ .../pg-fis/basedate/weldingAssembly/index.vue | 128 +- 14 files changed, 3329 insertions(+), 191 deletions(-) create mode 100644 vue/src/views/pg-fis/basedate/m100BIll/detail.vue create mode 100644 vue/src/views/pg-fis/basedate/m100Online/detail.vue create mode 100644 vue/src/views/pg-fis/basedate/r100Online/detail.vue create mode 100644 vue/src/views/pg-fis/basedate/unknownAssembly/detail.vue create mode 100644 vue/src/views/pg-fis/basedate/unknownAssembly/index.vue diff --git a/vue/src/components/ImportTxt/index.vue b/vue/src/components/ImportTxt/index.vue index 4eea759b..6392dce9 100644 --- a/vue/src/components/ImportTxt/index.vue +++ b/vue/src/components/ImportTxt/index.vue @@ -345,6 +345,7 @@ export default { { fis: "FIS发运数据", settleAccount: "R3数据", + AssemblyCfgERP:"总成SAP数据", }[this.crmType] || "" ); }, @@ -352,7 +353,8 @@ export default { return ( { fis: "/api/settleaccount/fis/ExcelImport", - settleAccount: "/api/settleaccount/SettleAccount/ExcelImport", + settleAccount: "/api/settleaccount/SettleAccount/ExcelImport", + AssemblyCfgERP:"/api/newjit/assembly-cfg-erp/import", }[this.crmType] || "" ); }, @@ -362,6 +364,7 @@ export default { { fis: "FIS发运数据导入模板.xlsx", settleAccount: "R3数据模板.xlsx", + AssemblyCfgERP:"BOM-批量导入模板.txt", }[this.crmType] || "" ); }, @@ -560,24 +563,48 @@ export default { .posts(webapi, fd) .then(async (res) => { console.log("导入条件:" + JSON.stringify(res)); - if (res === "Success") { - if (this.isLt2M === "1" && this.isFileType === "1") { - this.$notify({ - title: "成功", - message: "数据导入成功!", - type: "success", - duration: 2000, - }); - this.stepList[1].status = "finish"; - this.resultData.successMessage = "数据导入成功!"; - this.stepsActive = 4; + if(this.crmType !== "AssemblyCfgERP"){ + if (res === "Success") { + if (this.isLt2M === "1" && this.isFileType === "1") { + this.$notify({ + title: "成功", + message: "数据导入成功!", + type: "success", + duration: 2000, + }); + this.stepList[1].status = "finish"; + this.resultData.successMessage = "数据导入成功!"; + this.stepsActive = 4; + } + } else { + this.stepList[0].status = "wait"; + this.resultData.errTemplate = res; //指定错误模板名称,作为参数,用于错误模板下载 + this.resultData.errSize = 1; //保持大于0,用于控制错误数据下载按钮的可不可见 + this.resultData.successMessage = "数据导入失败!"; + this.stepsActive = 3; + } + } + else{ + console.log(res.status) + if (res.status === true) { + if (this.isLt2M === "1" && this.isFileType === "1") { + this.$notify({ + title: "成功", + message: "数据导入成功!", + type: "success", + duration: 2000, + }); + this.stepList[1].status = "finish"; + this.resultData.successMessage = "数据导入成功!"; + this.stepsActive = 4; + } + } else { + this.stepList[0].status = "wait"; + this.resultData.errTemplate = res; //指定错误模板名称,作为参数,用于错误模板下载 + this.resultData.errSize = 1; //保持大于0,用于控制错误数据下载按钮的可不可见 + this.resultData.successMessage = "数据导入失败!"; + this.stepsActive = 3; } - } else { - this.stepList[0].status = "wait"; - this.resultData.errTemplate = res; //指定错误模板名称,作为参数,用于错误模板下载 - this.resultData.errSize = 1; //保持大于0,用于控制错误数据下载按钮的可不可见 - this.resultData.successMessage = "数据导入失败!"; - this.stepsActive = 3; } this.$emit("status", "finish"); this.loading = false; diff --git a/vue/src/router/modules/fis.js b/vue/src/router/modules/fis.js index 4655ab23..576b0c7c 100644 --- a/vue/src/router/modules/fis.js +++ b/vue/src/router/modules/fis.js @@ -36,6 +36,16 @@ const pgfis = { icon: '发货' } }, + { + path: '/pg-unknownAssembly', + component: () => import('@/views/pg-fis/basedate/unknownAssembly'), + name: 'pg-unknownAssembly',//命名路由 + meta: { + title: '未知总成模块管理', + roles: ['SettleAccount.Reports'], + icon: '发货' + } + }, { path: '/pg-workLine', component: () => import('@/views/pg-fis/basedate/productLine'), diff --git a/vue/src/views/pg-fis/basedate/assemblyCfg/index.vue b/vue/src/views/pg-fis/basedate/assemblyCfg/index.vue index 038670b9..8f4922c6 100644 --- a/vue/src/views/pg-fis/basedate/assemblyCfg/index.vue +++ b/vue/src/views/pg-fis/basedate/assemblyCfg/index.vue @@ -174,7 +174,7 @@ align="center" > @@ -185,6 +185,7 @@ :close-on-click-modal="false" :title="formTitle" width="700px" + @close='closeDialog' > + + { }); }, + closeDialog(){ + //this.multipleSelection = [];//清空数据 + }, }, }; diff --git a/vue/src/views/pg-fis/basedate/customerPartCfg/index.vue b/vue/src/views/pg-fis/basedate/customerPartCfg/index.vue index 80ade2ac..fad25f00 100644 --- a/vue/src/views/pg-fis/basedate/customerPartCfg/index.vue +++ b/vue/src/views/pg-fis/basedate/customerPartCfg/index.vue @@ -22,7 +22,7 @@ - - + + - + - - + + @@ -274,12 +280,12 @@ export default { MaxResultCount: 15, version: "", //site: "TH", - customerCode: "", + customerCode: undefined, //userId: "00000000-0000-0000-0000-000000000000", partCode:"",//零件编码 partName:"",//零件名称 partType:"",//零件类型 - partChildType:"",//零件子类型 + partType2:"",//零件子类型 }, listExportQuery: { Filters: [ @@ -308,26 +314,34 @@ export default { isEdit: false, sortState:false, //标记刷新是否是排序调用 - partCode:'', - partName:'', - partType:'', - partChildType:'', + + + partType1Query:{ + dicTypeName:"客户零件类型1", + }, + partType2Query:{ + dicTypeName:"客户零件类型2", + }, + + partType1List:[], + partType2List:[], }; }, mounted() { this.$nextTick(() => { var offsetHei = document.documentElement.clientHeight; - console.log(offsetHei); + //console.log(offsetHei); let boxH = this.$refs.box.offsetHeight; this.tableHeight = offsetHei - boxH - 57 - 79;//57为footer高度,79为页面上部标签高度 - console.log(this.$refs.box.offsetHeight); - console.log(this.tableHeight); + //console.log(this.$refs.box.offsetHeight); + //console.log(this.tableHeight); }); }, created() { //this.getVersionInfo(); //if (this.versionList == []) { + this.getPartType(); this.getList(); //} }, @@ -353,7 +367,7 @@ export default { }); tempsTabs.push({ label: "零件子类型", - prop: "partChildType", + prop: "partType2", width: 120, }); tempsTabs.push({ @@ -452,16 +466,16 @@ export default { //return moment(date).format("YYYY-MM-DD HH:mm:ss"); return moment(date).format("YYYY-MM-DD"); } */ - if(column.property === 'customerCode') + if(column.property === "partType") { - if(row[column.property] === 'R0001') + if(row[column.property] === "1") { - var vname = '二配'; + var vname = '门板'; return vname; } - else if(row[column.property] === 'R0003') + else if(row[column.property] === '2') { - var vname = '结算'; + var vname = '柱护板'; return vname; } else @@ -472,7 +486,7 @@ export default { return row[column.property] || "--"; }, importExcelData() { - this.getVersionInfo(); + //this.getVersionInfo(); this.listLoading = false; //关闭导入窗体时调用 this.showExcelImport = false; @@ -480,34 +494,29 @@ export default { //导出功能 async handleDownload() { this.listLoading = true; - if (this.versionValue === "") { - this.$message.error("必需选择版本!"); - this.listLoading = false; - return; - } - if (this.versionValue != "") { - this.listQuery.version = this.versionValue; - } + // if (this.versionValue === "") { + // this.$message.error("必需选择版本!"); + // this.listLoading = false; + // return; + // } + // if (this.versionValue != "") { + // this.listQuery.version = this.versionValue; + // } console.log("发票导出:" + JSON.stringify(this.listQuery)); this.$axios .posts( - "/api/settleaccount/SettlementPart/Export", + "/api/newjit/part-cfg/export", this.listQuery ) .then((res) => { - let fileNameOfProject = res; + let filename = res.item; this.$axios - .BolbGets( - "/api/settleaccount/getblobfile/download/" + fileNameOfProject - ) + .BolbGets("/api/newjit/exclude-part-cfg/download/" + filename) .then((response) => { - if (fileNameOfProject.indexOf("_") != -1) { + if (filename.indexOf("_") != -1) { let downName = - fileNameOfProject.slice( - 0, - fileNameOfProject.lastIndexOf("_") - ) + - fileNameOfProject.slice(fileNameOfProject.lastIndexOf(".")); + filename.slice(0, filename.lastIndexOf("_")) + + filename.slice(filename.lastIndexOf(".")); downloadFile(response, downName); this.$notify({ title: "成功", @@ -516,7 +525,7 @@ export default { duration: 2000, }); } else { - downloadFile(response, fileNameOfProject); + downloadFile(response, filename); this.$notify({ title: "成功", message: "数据-导出成功!", @@ -541,22 +550,22 @@ export default { } console.log("列表查询条件:" + JSON.stringify(this.listQuery)); this.$axios - .posts( + .gets( "/api/newjit/part-cfg/list", this.listQuery ) .then((response) => { this.list = response.items; - this.list.forEach(item => { - if(item.customerCode === 'R0001') - { - item.customerCode = '二配'; - } - else if(item.customerCode === 'R0003') - { - item.customerCode = '结算'; - } - }); + // this.list.forEach(item => { + // if(item.customerCode === 'R0001') + // { + // item.customerCode = '二配'; + // } + // else if(item.customerCode === 'R0003') + // { + // item.customerCode = '结算'; + // } + // }); this.totalCount = response.totalCount; setTimeout(() => { //大数据量加载时 @@ -617,15 +626,15 @@ export default { this.listQuery.Filters.push(filter); } - if (this.partChildType != "") { - var column = "partChildType"; + if (this.partType2 != "") { + var column = "partType2"; let filter = { logic: 0, column: column, action: 0, - value: this.partChildType, + value: this.partType2, }; - this.listQuery.Filters = this.listQuery.Filters.filter(u => u.column !== "partChildType") + this.listQuery.Filters = this.listQuery.Filters.filter(u => u.column !== "partType2") this.listQuery.Filters.push(filter); } */ @@ -677,9 +686,12 @@ export default { }, /** 重置按钮操作 */ resetQuery(refName) { - this.OnlineTimeVale = []; - this.ReceiveTimeVale = []; + this.listQuery.partCode = ""; + this.listQuery.partName = ""; + this.listQuery.partType = ""; + this.listQuery.partType2 = ""; this.$refs[refName].resetFields(); + this.getPartType() this.handleFilter(); }, sortChange(data) { @@ -723,6 +735,32 @@ export default { this.$refs.multipleTable.clearSelection(); this.$refs.multipleTable.toggleRowSelection(row); }, + //获取零件类型 + getPartType() + { + this.$axios + .gets( + "/api/newjit/dic/list",this.partType1Query + ) + .then((response) => { + console.log(response); + this.partType1List = response.item; + //console.log() + }) + .catch(() => { + }); + this.$axios + .gets( + "/api/newjit/dic/list",this.partType2Query + ) + .then((response) => { + console.log(response); + this.partType2List = response.item; + //console.log() + }) + .catch(() => { + }); + }, }, }; diff --git a/vue/src/views/pg-fis/basedate/m100BIll/detail.vue b/vue/src/views/pg-fis/basedate/m100BIll/detail.vue new file mode 100644 index 00000000..5ba51a93 --- /dev/null +++ b/vue/src/views/pg-fis/basedate/m100BIll/detail.vue @@ -0,0 +1,347 @@ + + + + + + + + diff --git a/vue/src/views/pg-fis/basedate/m100BIll/index.vue b/vue/src/views/pg-fis/basedate/m100BIll/index.vue index 6121f3e8..789de8c9 100644 --- a/vue/src/views/pg-fis/basedate/m100BIll/index.vue +++ b/vue/src/views/pg-fis/basedate/m100BIll/index.vue @@ -320,9 +320,9 @@ - + - + - + - + - 添加ERP总成 + @@ -454,9 +454,9 @@ - + @@ -464,17 +464,17 @@ - + - 添加ERP结算件 + @@ -559,6 +559,7 @@ import CRMTableHead from "../../components/CRMTableHead"; import importExcel from "@/components/ImportExcel-vw"; import Lockr from "lockr"; import moment from "moment"; +import Detail from "./detail.vue"; import { downloadFile } from "@/utils/crmindex.js"; //组件计量单位 @@ -574,7 +575,7 @@ const projectTypeKeyValue = bomUnit.reduce((acc, cur) => { export default { name: "m100Bill", - components: { Pagination, CRMTableHead, importExcel }, + components: { Pagination, CRMTableHead, importExcel, Detail }, directives: { permission }, filters: { IsCustomerSignFilter(status) { @@ -652,6 +653,11 @@ export default { //UserId: "00000000-0000-0000-0000-000000000000", }, form:{ + knr:"", + vehicleModelCode:"", + vin:"", + hostSN:"", + onlineTimeVale:"", leftdetails:[], rightdetails:[], }, @@ -758,11 +764,12 @@ export default { this.$refs.form.validate((valid) => { if (valid) { console.log("保存参数:" + JSON.stringify(this.form)); + console.log(this.form); this.formLoading = true; if (this.isEdit) { //修改 this.$axios - .puts("/api/newjit/assembly-cfg-erp/" + this.form.id, this.form) + .puts("/api/newjit/new-m100" + this.form.id, this.form) .then((response) => { this.formLoading = false; this.$notify({ @@ -875,9 +882,9 @@ export default { fetchData(id) { //循环动态 this.$axios - .gets("/api/newjit/assembly-cfg-erp/" + id) + .gets("/api/newjit/new-m100/" + id) .then((response) => { - this.form = response.item; + this.form = response.item.m100Bill; //this.details = response.item.details; //console.log(this.details); }); @@ -889,7 +896,7 @@ export default { this.listExportQuery.erpAssemblyName = this.listQuery.ErpAssemblyName; console.log(JSON.stringify(this.listExportQuery)); this.$axios - .posts("/api/newjit/assembly-cfg-erp/export", this.listExportQuery) + .posts("/api/newjit/new-m100/export", this.listExportQuery) .then((res) => { let filename = res.item; this.$axios @@ -932,10 +939,10 @@ export default { this.listQuery.KNREnd = ""; this.listQuery.VINBegin = ""; this.listQuery.VINEnd = ""; - this.listQuery.OnlineTimeValue = ""; + this.listQuery.OnlineTimeValue = []; this.listQuery.OnlineTimeBegin = ""; this.listQuery.OnlineTimeEnd = ""; - this.listQuery.ReceiveTimeValue = ""; + this.listQuery.ReceiveTimeValue = []; this.listQuery.ReceiveTimeBegin = ""; this.listQuery.ReceiveTimeEnd = ""; this.handleQuery(); @@ -968,24 +975,42 @@ export default { } }, - handleAddDetails() { - if (this.form.details === undefined) { - this.form.details = []; + handleAddLeftDetails() { + this.$forceUpdate(); + if (this.form.leftdetails === undefined) { + this.form.leftdetails = []; //console.log(679); } let obj = {}; - obj.partCode = ""; - obj.partName = ""; - obj.partNum = ""; - obj.isKey = false; - obj.description = ""; + obj.erpAssemblyCode = ""; + obj.erpAssemblyName = ""; + obj.vehicleModel = this.form.vehicleModel; - console.log(this.form.details); - this.form.details.push(obj); + console.log(this.form.leftdetails); + this.form.leftdetails.push(obj); //console.log(688); }, - handleDeleteDetails(index){ - this.form.details.splice(index, 1); + handleAddRightDetails() { + this.$forceUpdate(); + if (this.form.rightdetails === undefined) { + this.form.rightdetails = []; + //console.log(679); + } + let obj = {}; + obj.customerPartCode = ""; + obj.customerpartName = ""; + obj.partQty= ""; + + console.log(this.form.rightdetails); + this.form.rightdetails.push(obj); + //console.log(688); + }, + handleLeftDeleteDetails(index){ + this.form.leftdetails.splice(index, 1); + //console.log(693); + }, + handleRightDeleteDetails(index){ + this.form.rightdetails.splice(index, 1); //console.log(693); }, @@ -1009,8 +1034,22 @@ export default { getList() { this.listLoading = true; this.listQuery.SkipCount = (this.page - 1) * 10; + console.log(1030) + if(this.listQuery.OnlineTimeValue!== undefined) + { + console.log(1033) + console.log(this.listQuery.OnlineTimeValue) + this.listQuery.OnlineTimeBegin = this.listQuery.OnlineTimeValue[0]; + this.listQuery.OnlineTimeEnd = this.listQuery.OnlineTimeValue[1]; + } + console.log(this.listQuery.OnlineTimeValue) + if(this.listQuery.ReceiveTimeValue!== undefined) + { + this.listQuery.ReceiveTimeBegin = this.listQuery.ReceiveTimeValue[0]; + this.listQuery.ReceiveTimeEnd = this.listQuery.ReceiveTimeValue[1]; + } this.$axios - .gets("/api/newjit/bill-r100/list", this.listQuery) + .gets("/api/newjit/new-m100/list", this.listQuery) .then((response) => { this.list = response.items; this.totalCount = response.totalCount; @@ -1121,6 +1160,7 @@ export default { //console.log(this.listQuery.productType) //console.log(this.PLChildList) }, + //获取车型 getvehicleModel() { this.$axios @@ -1141,7 +1181,7 @@ export default { let obj = {}; obj.erpAssemblyCode = this.form.erpAssemblyCode; obj.erpAssemblyName = this.form.erpAssemblyName; - obj.vehicleModel = this.form.vehicleModel; + obj.vehicleModel = this.form.vehicleModelCode; if (this.form.leftdetails === undefined) { this.form.leftdetails = []; diff --git a/vue/src/views/pg-fis/basedate/m100Online/detail.vue b/vue/src/views/pg-fis/basedate/m100Online/detail.vue new file mode 100644 index 00000000..25108fdd --- /dev/null +++ b/vue/src/views/pg-fis/basedate/m100Online/detail.vue @@ -0,0 +1,354 @@ + + + + + + + + diff --git a/vue/src/views/pg-fis/basedate/m100Online/index.vue b/vue/src/views/pg-fis/basedate/m100Online/index.vue index 2246fc30..26d182b4 100644 --- a/vue/src/views/pg-fis/basedate/m100Online/index.vue +++ b/vue/src/views/pg-fis/basedate/m100Online/index.vue @@ -39,7 +39,7 @@ v-for="item in PLChildList" :key="item.id" :label="item.productLineName" - :value="item.id"/> + :value="item.productLineCode"/> @@ -141,7 +141,7 @@ --> - - + + {{ item.name }} @@ -294,6 +294,12 @@ :visible.sync="drawer" :before-close="handleDrawerClose" > +

+ +
@@ -306,6 +312,7 @@ import CRMTableHead from "../../components/CRMTableHead"; import importExcel from "@/components/ImportExcel-vw"; import Lockr from "lockr"; import moment from "moment"; +import Detail from "./detail.vue"; import { downloadFile } from "@/utils/crmindex.js"; //组件计量单位 @@ -323,7 +330,7 @@ const projectTypeKeyValue = bomUnit.reduce((acc, cur) => { export default { name: "M100Online", - components: { Pagination, CRMTableHead, importExcel }, + components: { Pagination, CRMTableHead, importExcel, Detail }, directives: { permission }, filters: { IsCustomerSignFilter(status) { @@ -381,7 +388,7 @@ export default { MaxResultCount: 15, productType: 1, ProductLine: undefined, - version:undefined, + Version:undefined, serialNumBegin:undefined, serialNumEnd:undefined, HostSNBegin:undefined, @@ -390,12 +397,13 @@ export default { KNREnd:undefined, VINBegin:undefined, VINEnd:undefined, - OnlineTimeValue:undefined, + OnlineTimeValue:[], OnlineTimeBegin:undefined, OnlineTimeEnd:undefined, - ReceiveTimeValue:undefined, + ReceiveTimeValue:[], ReceiveTimeBegin:undefined, ReceiveTimeEnd:undefined, + billStatus:undefined, state:[], }, @@ -439,6 +447,12 @@ export default { }); }, created() { + this.billState.forEach((element,index) => { + if(index === 0) + { + this.listQuery.state.push(element.id); + } + }); this.getList(); this.getProductLine(); }, @@ -488,6 +502,11 @@ export default { prop: "r100ReceiveTime", width: 180, }); + tempsTabs.push({ + label: "产线", + prop: "productLine", + width: 120, + }); tempsTabs.push({ label: "备注", prop: "remark", @@ -500,7 +519,9 @@ export default { //抽屉 handleDrawerOpen(param) { this.drawer = true; - var parentId = param.id; //主键id + console.log(510) + console.log(param) + var parentId = param.assemblyID; //主键id this.customerInfos = [ { ParentId: parentId, @@ -525,9 +546,9 @@ export default { this.listLoading = true; this.listExportQuery.erpAssemblyCode = this.listQuery.ErpAssemblyCode; this.listExportQuery.erpAssemblyName = this.listQuery.ErpAssemblyName; - console.log(JSON.stringify(this.listExportQuery)); + console.log(JSON.stringify(this.listQuery)); this.$axios - .posts("/api/newjit/assembly-cfg-erp/export", this.listExportQuery) + .posts("/api/newjit/assembly-cfg-erp/export", this.listQuery) .then((res) => { let filename = res.item; this.$axios @@ -563,19 +584,23 @@ export default { //this.$refs[refName].resetFields(); this.listQuery.billType = ""; this.listQuery.productLine = ""; - this.listQuery.version = ""; + this.listQuery.Version = ""; + this.listQuery.serialNumBegin = ""; + this.listQuery.serialNumEnd = ""; this.listQuery.HostSNBegin = ""; this.listQuery.HostSNEnd = ""; this.listQuery.KNRBegin = ""; this.listQuery.KNREnd = ""; this.listQuery.VINBegin = ""; this.listQuery.VINEnd = ""; - this.listQuery.OnlineTimeValue = ""; + this.listQuery.OnlineTimeValue = []; this.listQuery.OnlineTimeBegin = ""; this.listQuery.OnlineTimeEnd = ""; - this.listQuery.ReceiveTimeValue = ""; + this.listQuery.ReceiveTimeValue = []; this.listQuery.ReceiveTimeBegin = ""; this.listQuery.ReceiveTimeEnd = ""; + this.listQuery.state = []; + this.listQuery.billStatus = ""; this.handleQuery(); this.getProductLine(); }, @@ -647,6 +672,20 @@ export default { getList() { this.listLoading = true; this.listQuery.SkipCount = (this.page - 1) * 10; + if(this.listQuery.OnlineTimeValue!== undefined) + { + this.listQuery.OnlineTimeBegin = this.listQuery.OnlineTimeValue[0]; + this.listQuery.OnlineTimeEnd = this.listQuery.OnlineTimeValue[1]; + } + if(this.listQuery.ReceiveTimeValue!== undefined) + { + this.listQuery.ReceiveTimeBegin = this.listQuery.ReceiveTimeValue[0]; + this.listQuery.ReceiveTimeEnd = this.listQuery.ReceiveTimeValue[1]; + } + if(this.listQuery.state!== undefined) + { + this.listQuery.billStatus = this.listQuery.state[0]; + } this.$axios .gets("/api/newjit/bill-m100/list", this.listQuery) .then((response) => { @@ -759,6 +798,19 @@ export default { this.PLChildList = this.PLList.filter(u => u.productType === parseInt(this.listQuery.productType)); //console.log(this.PLList) }, + /*单据状态变更 */ + checkedListChange(index) + { + if(this.listQuery.state.length <= 1) + { + this.listQuery.state.push(this.billState[index].id); + } + else + { + this.listQuery.state = []; + this.listQuery.state.push(this.billState[index].id); + } + }, }, }; diff --git a/vue/src/views/pg-fis/basedate/productLine/index.vue b/vue/src/views/pg-fis/basedate/productLine/index.vue index 3d824d00..b30113d7 100644 --- a/vue/src/views/pg-fis/basedate/productLine/index.vue +++ b/vue/src/views/pg-fis/basedate/productLine/index.vue @@ -394,9 +394,9 @@ export default { version: "", customerCode: "", //userId: "00000000-0000-0000-0000-000000000000", - userName:"",//用户名称 - name:"",//真实姓名 - productLineCode:"",//生产线 + userName:undefined,//用户名称 + name:undefined,//真实姓名 + productLineCode:undefined,//生产线 }, listExportQuery: { Filters: [ diff --git a/vue/src/views/pg-fis/basedate/r100Online/detail.vue b/vue/src/views/pg-fis/basedate/r100Online/detail.vue new file mode 100644 index 00000000..25108fdd --- /dev/null +++ b/vue/src/views/pg-fis/basedate/r100Online/detail.vue @@ -0,0 +1,354 @@ + + + + + + + + diff --git a/vue/src/views/pg-fis/basedate/r100Online/index.vue b/vue/src/views/pg-fis/basedate/r100Online/index.vue index 0fe9f3c3..f107c337 100644 --- a/vue/src/views/pg-fis/basedate/r100Online/index.vue +++ b/vue/src/views/pg-fis/basedate/r100Online/index.vue @@ -39,7 +39,7 @@ v-for="item in PLChildList" :key="item.id" :label="item.productLineName" - :value="item.id"/> + :value="item.productLineCode"/> @@ -98,7 +98,7 @@ - + --> - + {{ item.name }} @@ -210,9 +210,9 @@ @row-click="handleRowClick" > - + +
+ +
@@ -272,6 +278,7 @@ import CRMTableHead from "../../components/CRMTableHead"; import importExcel from "@/components/ImportExcel-vw"; import Lockr from "lockr"; import moment from "moment"; +import Detail from "./detail.vue"; import { downloadFile } from "@/utils/crmindex.js"; //组件计量单位 @@ -289,7 +296,7 @@ const projectTypeKeyValue = bomUnit.reduce((acc, cur) => { export default { name: "M100Online", - components: { Pagination, CRMTableHead, importExcel }, + components: { Pagination, CRMTableHead, importExcel , Detail}, directives: { permission }, filters: { IsCustomerSignFilter(status) { @@ -347,19 +354,20 @@ export default { MaxResultCount: 15, productType: 1, ProductLine: undefined, - version:undefined, + Version:undefined, HostSNBegin:undefined, HostSNBegin:undefined, KNRBegin:undefined, KNREnd:undefined, - VINBegin:undefined, + //VINBegin:undefined, VINEnd:undefined, - OnlineTimeValue:undefined, + OnlineTimeValue:[], OnlineTimeBegin:undefined, OnlineTimeEnd:undefined, - ReceiveTimeValue:undefined, + ReceiveTimeValue:[], ReceiveTimeBegin:undefined, ReceiveTimeEnd:undefined, + billStatus:undefined, state:[], }, @@ -402,6 +410,12 @@ export default { }); }, created() { + this.billState.forEach((element,index) => { + if(index === 0) + { + this.listQuery.state.push(element.id); + } + }); this.getList(); this.getProductLine(); }, @@ -415,11 +429,11 @@ export default { // prop: "vin", // width: 130, // }); - tempsTabs.push({ - label: "KNR", - prop: "knr", - width: 150, - }); + // tempsTabs.push({ + // label: "KNR", + // prop: "knr", + // width: 150, + // }); tempsTabs.push({ label: "单据状态", prop: "billState", @@ -455,6 +469,11 @@ export default { prop: "erpAssemblyName", width: 180, }); + tempsTabs.push({ + label: "产线", + prop: "productLine", + width: 120, + }); tempsTabs.push({ label: "备注", prop: "remark", @@ -467,7 +486,7 @@ export default { //抽屉 handleDrawerOpen(param) { this.drawer = true; - var parentId = param.id; //主键id + var parentId = param.assemblyID; //主键id this.customerInfos = [ { ParentId: parentId, @@ -482,9 +501,9 @@ export default { this.listLoading = true; this.listExportQuery.erpAssemblyCode = this.listQuery.ErpAssemblyCode; this.listExportQuery.erpAssemblyName = this.listQuery.ErpAssemblyName; - console.log(JSON.stringify(this.listExportQuery)); + console.log(JSON.stringify(this.listQuery)); this.$axios - .posts("/api/newjit/assembly-cfg-erp/export", this.listExportQuery) + .posts("/api/newjit/bill-r100/export", this.listQuery) .then((res) => { let filename = res.item; this.$axios @@ -520,19 +539,21 @@ export default { //this.$refs[refName].resetFields(); this.listQuery.billType = ""; this.listQuery.productLine = ""; - this.listQuery.version = ""; + this.listQuery.Version = ""; this.listQuery.HostSNBegin = ""; this.listQuery.HostSNEnd = ""; this.listQuery.KNRBegin = ""; this.listQuery.KNREnd = ""; - this.listQuery.VINBegin = ""; + //this.listQuery.VINBegin = ""; this.listQuery.VINEnd = ""; - this.listQuery.OnlineTimeValue = ""; + this.listQuery.OnlineTimeValue = []; this.listQuery.OnlineTimeBegin = ""; this.listQuery.OnlineTimeEnd = ""; - this.listQuery.ReceiveTimeValue = ""; + this.listQuery.ReceiveTimeValue = []; this.listQuery.ReceiveTimeBegin = ""; this.listQuery.ReceiveTimeEnd = ""; + this.listQuery.state = []; + this.listQuery.billStatus = ""; this.handleQuery(); this.getProductLine(); }, @@ -604,8 +625,22 @@ export default { getList() { this.listLoading = true; this.listQuery.SkipCount = (this.page - 1) * 10; + if(this.listQuery.OnlineTimeValue!== undefined) + { + this.listQuery.OnlineTimeBegin = this.listQuery.OnlineTimeValue[0]; + this.listQuery.OnlineTimeEnd = this.listQuery.OnlineTimeValue[1]; + } + if(this.listQuery.ReceiveTimeValue!== undefined) + { + this.listQuery.ReceiveTimeBegin = this.listQuery.ReceiveTimeValue[0]; + this.listQuery.ReceiveTimeEnd = this.listQuery.ReceiveTimeValue[1]; + } + if(this.listQuery.state!== undefined) + { + this.listQuery.billStatus = this.listQuery.state[0]; + } this.$axios - .gets("/api/newjit/bill-m100/list", this.listQuery) + .gets("/api/newjit/bill-r100/list", this.listQuery) .then((response) => { this.list = response.items; this.totalCount = response.totalCount; @@ -714,6 +749,19 @@ export default { this.PLChildList = this.PLList.filter(u => u.productType === parseInt(this.listQuery.productType)); //console.log(this.PLList) }, + /*单据状态变更 */ + checkedListChange(index) + { + if(this.listQuery.state.length <= 1) + { + this.listQuery.state.push(this.billState[index].id); + } + else + { + this.listQuery.state = []; + this.listQuery.state.push(this.billState[index].id); + } + }, }, }; diff --git a/vue/src/views/pg-fis/basedate/unknownAssembly/detail.vue b/vue/src/views/pg-fis/basedate/unknownAssembly/detail.vue new file mode 100644 index 00000000..e5bc3487 --- /dev/null +++ b/vue/src/views/pg-fis/basedate/unknownAssembly/detail.vue @@ -0,0 +1,270 @@ + + + + + + + + + + diff --git a/vue/src/views/pg-fis/basedate/weldingAssembly/index.vue b/vue/src/views/pg-fis/basedate/weldingAssembly/index.vue index 5e91f023..4638babd 100644 --- a/vue/src/views/pg-fis/basedate/weldingAssembly/index.vue +++ b/vue/src/views/pg-fis/basedate/weldingAssembly/index.vue @@ -19,9 +19,11 @@ style="margin-right: 15px" @change="ptypeselectChange" > - - - +
@@ -34,10 +36,10 @@ @change="valueselectChange" > + :value="item.id"/> @@ -139,7 +141,7 @@ --> - - + + {{ item.name }} @@ -192,7 +194,16 @@ size="mini" style="margin-left: 15px" @click="handleDownload()" - >导出焊装总成对比 + >导出焊装总成对比(Excel) + + 导出焊装总成对比(CSV) @@ -328,7 +339,7 @@ export default { { required: true, message: "必须输入!", trigger: "blur" }, ], }, - billState:[ + compareState:[ {id:0,name:"有焊装无总装"}, {id:1,name:"有焊装有总装"} ], @@ -373,7 +384,9 @@ export default { ReceiveTimeValue:undefined, ReceiveTimeBegin:undefined, ReceiveTimeEnd:undefined, - state:[], + HasR100NotHasM100:undefined,//有焊装无总装 + HasR100HasM100:undefined,//有焊装有总装 + cstate:[], }, listExportQuery: { @@ -400,6 +413,9 @@ export default { tableHeight: document.documentElement.clientHeight - 335, detailTableHeight:250, details:[], //修改子表数据源 + billStatus:[], + PLChildList:[],//筛选后产线下拉 + productTypeList:[{id:1,name:'门板'},{id:2,name:'柱护板'}] }; }, mounted() { @@ -413,6 +429,10 @@ export default { }); }, created() { + this.compareState.forEach((element,index) => { + this.listQuery.cstate.push(element.id); + }); + this.getProductLine(); this.getList(); }, computed: { @@ -514,7 +534,45 @@ export default { this.listExportQuery.erpAssemblyName = this.listQuery.ErpAssemblyName; console.log(JSON.stringify(this.listExportQuery)); this.$axios - .posts("/api/newjit/assembly-cfg-erp/export", this.listExportQuery) + .posts("/api/newjit/r100-m100-compare/export", this.listExportQuery) + .then((res) => { + let filename = res.item; + this.$axios + .BolbGets("/api/newjit/exclude-part-cfg/download/" + filename) + .then((response) => { + if (filename.indexOf("_") != -1) { + let downName = + filename.slice(0, filename.lastIndexOf("_")) + + filename.slice(filename.lastIndexOf(".")); + downloadFile(response, downName); + this.$notify({ + title: "成功", + message: "数据-导出成功!", + type: "success", + duration: 2000, + }); + } else { + downloadFile(response, filename); + this.$notify({ + title: "成功", + message: "数据-导出成功!", + type: "success", + duration: 2000, + }); + } + this.listLoading = false; + }); + }); + this.listLoading = false; + }, + /** 导出功能 */ + handleDownloadCSV() { + this.listLoading = true; + this.listExportQuery.erpAssemblyCode = this.listQuery.ErpAssemblyCode; + this.listExportQuery.erpAssemblyName = this.listQuery.ErpAssemblyName; + console.log(JSON.stringify(this.listQuery)); + this.$axios + .posts("/api/newjit/r100-m100-compare/export-CSV", this.listQuery) .then((res) => { let filename = res.item; this.$axios @@ -550,7 +608,9 @@ export default { //this.$refs[refName].resetFields(); this.listQuery.billType = ""; this.listQuery.productLine = ""; - this.listQuery.version = ""; + this.listQuery.Version = ""; + this.listQuery.serialNumBegin = ""; + this.listQuery.serialNumEnd = ""; this.listQuery.HostSNBegin = ""; this.listQuery.HostSNEnd = ""; this.listQuery.KNRBegin = ""; @@ -563,6 +623,7 @@ export default { this.listQuery.ReceiveTimeValue = ""; this.listQuery.ReceiveTimeBegin = ""; this.listQuery.ReceiveTimeEnd = ""; + this.listQuery.cstate = []; this.handleQuery(); this.getProductLine(); }, @@ -634,8 +695,38 @@ export default { getList() { this.listLoading = true; this.listQuery.SkipCount = (this.page - 1) * 10; + if(this.listQuery.OnlineTimeValue!== undefined) + { + this.listQuery.OnlineTimeBegin = this.listQuery.OnlineTimeValue[0]; + this.listQuery.OnlineTimeEnd = this.listQuery.OnlineTimeValue[1]; + } + if(this.listQuery.ReceiveTimeValue!== undefined) + { + this.listQuery.ReceiveTimeBegin = this.listQuery.ReceiveTimeValue[0]; + this.listQuery.ReceiveTimeEnd = this.listQuery.ReceiveTimeValue[1]; + } + + this.listQuery.HasR100NotHasM100 = false; + this.listQuery.HasR100HasM100 = false; + + if(this.listQuery.cstate!== undefined && this.listQuery.cstate.length > 0) + { + console.log(this.listQuery.cstate) + this.listQuery.cstate.forEach(element => { + console.log(element) + if(element === 0) + { + this.listQuery.HasR100NotHasM100 = true; + } + if(element === 1) + { + this.listQuery.HasR100HasM100 = true; + } + }); + + } this.$axios - .gets("/api/newjit/assembly-cfg-erp/list", this.listQuery) + .gets("/api/newjit/r100-m100-compare/list", this.listQuery) .then((response) => { this.list = response.items; this.totalCount = response.totalCount; @@ -729,7 +820,7 @@ export default { .then((response) => { //console.log(response); this.PLList = response.item; - //console.log(this.PLList); + this.PLChildList = this.PLList.filter(u => u.productType === parseInt(this.listQuery.productType)); }) .catch(() => { }); @@ -738,7 +829,8 @@ export default { ptypeselectChange() { //console.log(this.listQuery.productType); - this.PLList = this.PLList.filter(u => u.productType === this.listQuery.productType); + this.listQuery.productLine = ""; + this.PLChildList = this.PLList.filter(u => u.productType === parseInt(this.listQuery.productType)); //console.log(this.PLList); }, },