<template> <div style="height:100%;position: relative;"> <div v-if="iaction!='read'" class="elc_tools-wrap"> <el-button @click="genMessage" size="small" type="primary" style="margin-right: 10px;">保存</el-button> <el-button @click="validateMessage" size="small" type="primary" style="margin-right: 10px;">校验</el-button> <el-button @click="msgPreview" size="small" type="primary" style="margin-right: 10px;">预览</el-button> <el-button @click="handleBack" size="small" type="primary">退出</el-button> </div> <div style="height: calc(100% - 60px);overflow:auto;" class="elc-content-box"> <el-form v-show="ishow" ref="form" :model="model" class="elc_page" size="mini" label-position='right' label-width='auto' style="background-color: #fff;"> <el-tabs tab-position="top" type="card" v-model="activeName"> <el-tab-pane label='业务信息' name="basic"> <div style="padding: 20px 0px 10px 20px;background-color: #fff;border-bottom: 1px dashed var(--collapse-border-color);"> 报文类型: <c-select style="width:30%; text-align:center;padding-right:5%" v-model="regmsgtype" placeholder="请选择" uil="EN" dbCode="ELCTYP" label="" @change="handleChangeReg"> </c-select> 参与机构号: <c-select v-model="extact" style="width:30%;padding-left:10px"> <el-option v-for="item in bchlst" :key="item" :value="item"> </el-option> </c-select> </div> <h3 v-if="title" class="elc_page_title" @click="changeElctyp">{{title}} <el-icon :class="ishow ? 'arrow-up':'arrow-down'"></el-icon> </h3> <div style="padding: 20px;height: calc(100% - 112px);overflow: auto;"> <el-row v-for="(item,index) in model.expTree" :key="item.path" style="width:100%;"> <el-col :span="16"> <div class="cus-form-wrap" v-if="item.isLeaf"> <div class="cus-form-label"> <p class='elc_title' :class="'elc_title_'+item.lvl">{{item.label}}</p> </div> <div class="cus-form-content"> <component v-bind:is="MesgRender(imty,item,iaction).is" :index="index" v-bind="MesgRender(imty,item,iaction)" :node="item"></component> </div> </div> </el-col> </el-row> </div> </el-tab-pane> <el-tab-pane label="信用证单证影像" name="img" v-if="regmsgtypeImg"> <c-content> <m-img :model="model" ref="img" :regmsgtype="regmsgtype"></m-img> </c-content> </el-tab-pane> <el-tab-pane label="发票影像" name="inv" v-if="regmsgtypeInv"> <c-content> <m-inv :model="model" ref="inv"></m-inv> </c-content> </el-tab-pane> </el-tabs> </el-form> </div> <el-dialog title="预览" :visible.sync="visiable" left width="70%" v-if="visiable" @close="handleClose"> <div style="height:100%;"> <elc-view :formatData="formatData" :textContent="textContext"></elc-view> </div> </el-dialog> </div> </template> <script> import send from "./Service/post"; import { ElcsFactory } from "./MesgJson/index.js"; // import Mesgcode from './MesgJson/MsgCodes.js' import { ExpandTree, fillUidValue, dealArrPath } from "./MesgValidator"; import MesgRender from "./MesgRender"; import { fixTreeValue } from "./FixTreeValue"; import elcs_coms from "./comps"; import Api from "~/service/Api"; // import { async } from "q"; import Pub from '~/components/business/commonModel/index.js'; import CodeTable from "~/config/CodeTable"; import ElcView from "~/components/business/ELCView"; import Img from "./img.vue" import Inv from "./inv.vue" import Elcadd from "./model.js" // import { // elcsCheck // } from "~/service/public/message" export default { name: 'Elcadd', props: ["mty", "action", "disabled"], components: { ElcView, "m-img":Img, "m-inv":Inv, //控件注册 ...elcs_coms }, provide() { return { root: this }; }, name:'Elcadd', data() { return { trnName:"elcadd", codes: { ...CodeTable }, formatData:{}, textContext:"", visiable: false, ishow: "false", activeName: "basic", model: new Elcadd().data, //联号列表 bchlst: [], message: "", //原报文 title: "", //标题 imty: "", iaction: "", extact: "", regmsgtype: "" }; }, computed:{ regmsgtypeImg(){ switch(this.regmsgtype){ case 'A01': case 'A03': case 'B01': case 'B02': return true break default: return false } }, regmsgtypeInv(){ switch(this.regmsgtype){ case 'B01': case 'B02': return true break default: return false } } }, methods: { MesgRender, fillMesgObject(msgObject) { let nmsgObject = dealArrPath(msgObject); for (let path in nmsgObject) { let fixPath = ""; if (path.indexOf(".") > -1) { fixPath = path.substr(path.indexOf(".") + 1, path.length); } else { continue; } //兼容金额处理,将金额值解析出来 let value = nmsgObject[path]; if (path.indexOf("amount") > -1){ fixPath = fixPath.substr(0,fixPath.indexOf(".amount")); } fillUidValue.call({ mty: this.imty }, fixPath, value); } }, changeElctyp() { console.log("111" + this.ishow); this.ishow = !this.ishow; }, handleClose() { this.visiable = false; }, validateMessage() { this.$refs["form"].validate(async valid => { if (valid) { if(this.regmsgtypeInv){ if(this.model.invgrdm.invlst.length == 0){ this.$notify({ title: "失败", message: "请跳转发票影像页面录入发票信息", type: "warning" }); return } this.$refs.inv.invTable() let flg = this.model.invgrdm.invlst.some(item =>{ return !item.invnum || !item.invcod }) if(flg){ return } } if(this.regmsgtypeImg){ if(this.model.imggrdm.imguseList.length >0){ this.$refs.img.imgTable() let flg = this.model.imggrdm.imguseList.some(item =>{ return item.imagid == '' || item.imgtyp == '' || item.imgdsp == '' || item.valflg == '' }) if(flg){ return } } } this.$notify({ title: "成功", message: "校验成功", type: "success" }); } else { this.$notify({ title: "失败", message: "校验失败", type: "error" }); } }); }, handleChangeReg() { if (!this.regmsgtype) { return; } this.buildMesgStructure(); }, buildMesgStructure() { window.SYS_DATE = new Date(); // this.imty = this.mty|| (this.$route ? this.$route.params.mty :undefined) this.iaction = this.action || (this.$route ? this.$route.query.action : undefined); // if(this.imty) // this.imty = this.imty.replace(/_/g,'.') let localCodes = localStorage.getItem("localCodes"); let curCodes = []; if (localCodes) { curCodes = JSON.parse(localCodes)["ELCTYP_EN_COD"]; } let curElctypList = curCodes.filter(item => { return item.value === this.regmsgtype; }); let curElctyp = ""; if (curElctypList && curElctypList.length > 0) { let curLabel = curElctypList[0].label; curElctyp = curLabel[0].toUpperCase() + curLabel.substr(1); } this.title = curElctyp; this.imty = curElctyp.split(".").join("_"); // const tree = ElcsFactory(this.imty) let tree = require("./MesgJson/" + this.imty + ".js").default; console.log("tree", tree); let { expTree, directMap, msgTree } = ExpandTree(tree); console.log('expTree', expTree) this.model.expTree = expTree; window[this.imty] = { expTree, directMap, msgTree, form: this.$refs["form"] }; window.SELF_ELC_CODE = "303100000006"; //应从服务端读取当前经办柜员机构信息 window.PTY_CODE = this.extact; window.PTY_NAME = "TESTNAME"; fixTreeValue(curElctyp.toLowerCase(), directMap, this.disabled); // this.fillInitData(); //加载初始化数据 // if(this.iaction == 'new') //如果是新建,MesgID应该自动新建 // { // let msgidItem = directMap["GrpHdr.MsgId"] // msgidItem.value = "MESG_ID" // } }, fillPathToObject(path, value, msgobj) { let idx = path.indexOf("."); if (idx == -1) { msgobj[path] = value; return; } let key = path.substring(0, idx); if (!msgobj[key]) msgobj[key] = {}; this.fillPathToObject(path.substring(idx + 1), value, msgobj[key]); }, simpleStringify(object) { var simpleObject = {}; for (var prop in object) { if (!object.hasOwnProperty(prop)) { continue; } if (typeof object[prop] == "object") { continue; } if (typeof object[prop] == "function") { continue; } simpleObject[prop] = object[prop]; } return JSON.stringify(simpleObject); }, msgPreview: function() { this.$refs["form"].validate(valid => { if (valid) { //如果切换预览页面 let msgobj = {}; for (let item of this.model.expTree) { let value = item.value; if (value === null || value === undefined || value === "") { continue; } if (item.type == "ActiveCurrencyAndAmount") value = { Ccy: "CNY", amount: value }; this.fillPathToObject(item.path, value, msgobj); // msgobj[item.path] = item.value } //开立,修改影像 if(this.regmsgtype=='A01' || this.regmsgtype=='A03'){ let imgInfos = this.model.imggrdm.imguseList.map((imgItem) => { return { ID: imgItem.imagid, Type: imgItem.imgtyp, Desc: imgItem.imgdsp, VldFlg: imgItem.valflg, } }); this.fillPathToObject("LCInfo.ContInfo.ContImgInfo.ImgInfo", imgInfos, msgobj); } //寄单,寄单修改影像发票 if(this.regmsgtype=='B01' || this.regmsgtype=='B02'){ //影像 let imgInfos = this.model.imggrdm.imguseList.map((imgItem) => { return { ID: imgItem.imagid, Type: imgItem.imgtyp, Desc: imgItem.imgdsp, VldFlg: imgItem.valflg, } }); this.fillPathToObject("PresnInfo.DocsInfo.AttachOfDoc.ImgInfo", imgInfos, msgobj); //发票 let invInfos = this.model.invgrdm.invlst.map((invItem) => { return { ID: invItem.imagid, InvTp: invItem.invtyp, InvNb: invItem.invnum, InvCd: invItem.invcod, UntaxAmt: { Ccy: "CNY", amount: invItem.untamt }, InvDt: invItem.invdat, VldFlg: invItem.valflg, } }); this.fillPathToObject("PresnInfo.DocsInfo.InvOfPresn.InvImgInfo", invInfos, msgobj); } let header = {}; let directMap = window[this.imty].directMap; let rcvItem; if(this.regmsgtype=='304'){ rcvItem = directMap["GrpHdr02.InstdPty02.InstdDrctPty02"]; } else{ rcvItem = directMap["GrpHdr.InstdAgt.MmbId"] || directMap["GrpHdr.InstdPty.InstdDrctPty"]; } header.OrigSender = SELF_ELC_CODE; header.OrigReceiver = rcvItem.value; let msgidItem = directMap["GrpHdr.MsgId"]; if (msgidItem) header.MesgID = msgidItem.value; let data = { msgTree: msgobj, msgHeader: header, msgType: this.regmsgtype, id: this.$route.query.id }; console.log(data); Api.post(`/Domlc/msgeditor/msgPreview`, data).then(res => { this.formatData = res.data.textResultVo.formatData; this.textContext = res.data.textResultVo.data; this.visiable = true; }); } else { this.$notify({ title: "失败", message: "校验失败", type: "error" }); return; } }); }, handleBack () { this.$store.commit('delTagsArry', this.$route.path); this.$router.back() }, genMessage: function() { this.$refs["form"].validate(valid => { if (valid) { if(this.regmsgtypeInv){ if(this.model.invgrdm.invlst.length == 0){ this.$notify({ title: "失败", message: "请跳转发票影像页面录入发票信息", type: "warning" }); return } this.$refs.inv.invTable() let flg = this.model.invgrdm.invlst.some(item =>{ return !item.invnum || !item.invcod }) if(flg){ return } } if(this.regmsgtypeImg){ if(this.model.imggrdm.imguseList.length >0){ this.$refs.img.imgTable() let flg = this.model.imggrdm.imguseList.some(item =>{ return item.imagid == '' || item.imgtyp == '' || item.imgdsp == '' || item.valflg == '' }) if(flg){ return } } } let msgobj = {}; for (let item of this.model.expTree) { let value = item.value; if (value === null || value === undefined || value === "") { continue; } if (item.type == "ActiveCurrencyAndAmount") value = { Ccy: "CNY", amount: value }; this.fillPathToObject(item.path, value, msgobj); // msgobj[item.path] = item.value // console.log(item.value) } //开立,修改影像 if(this.regmsgtype=='A01' || this.regmsgtype=='A03'){ let imgInfos = this.model.imggrdm.imguseList.map((imgItem) => { return { ID: imgItem.imagid, Type: imgItem.imgtyp, Desc: imgItem.imgdsp, VldFlg: imgItem.valflg, } }); this.fillPathToObject("LCInfo.ContInfo.ContImgInfo.ImgInfo", imgInfos, msgobj); } //寄单,寄单修改影像发票 if(this.regmsgtype=='B01' || this.regmsgtype=='B02'){ //影像 let imgInfos = this.model.imggrdm.imguseList.map((imgItem) => { return { ID: imgItem.imagid, Type: imgItem.imgtyp, Desc: imgItem.imgdsp, VldFlg: imgItem.valflg, } }); this.fillPathToObject("PresnInfo.DocsInfo.AttachOfDoc.ImgInfo", imgInfos, msgobj); //发票 let invInfos = this.model.invgrdm.invlst.map((invItem) => { return { ID: invItem.imagid, InvTp: invItem.invtyp, InvNb: invItem.invnum, InvCd: invItem.invcod, UntaxAmt: { Ccy: "CNY", amount: invItem.untamt }, InvDt: invItem.invdat, VldFlg: invItem.valflg, } }); this.fillPathToObject("PresnInfo.DocsInfo.InvOfPresn.InvImgInfo", invInfos, msgobj); } let header = {}; let directMap = window[this.imty].directMap; let rcvItem; if(this.regmsgtype=='304'){ rcvItem = directMap["GrpHdr02.InstdPty02.InstdDrctPty02"]; } else{ rcvItem = directMap["GrpHdr.InstdAgt.MmbId"] || directMap["GrpHdr.InstdPty.InstdDrctPty"]; } header.OrigSender = SELF_ELC_CODE; header.OrigReceiver = rcvItem.value; let msgidItem; if(this.regmsgtype=='304'){ msgidItem =directMap["GrpHdr02.MsgId"]; } else{ msgidItem =directMap["GrpHdr.MsgId"]; } if (msgidItem) header.MesgID = msgidItem.value; let sss = this.model.expTree; console.log(sss); console.log(this.simpleStringify(sss)); let data = { msgTree: msgobj, msgHeader: header, msgType: this.regmsgtype, id: this.$route.query.id, //保存的时候给查询编号增加已使用的状态 imfref: (this.regmsgtypeImg || this.regmsgtypeInv) ? this.model.fftref : '' }; console.log('dasdadas',this.regmsgtypeImg,this.regmsgtypeInv,this.model.fftref) Api.post(`/Domlc/msgeditor/msgsave`, data).then(res => { if (res.respCode == SUCCESS) { if(res.data.retcod=="0"){ this.$notify({ title: "成功", message: "保存成功", type: "success" }); this.$store.commit("delTagsArry", this.$route.path); this.$router.back(); } else if(res.data.retcod=="-1") { this.$message.error(res.data.errmsg); } } else { this.$message.error("文件存储失败!"); } }); } else { this.$notify({ title: "失败", message: "校验失败", type: "error" }); // return; } }); }, getImgData (jsonData, type) { let resList = [] if (jsonData) { let jsonKeys = Object.keys(jsonData) let path = type == 'A' ? 'LCInfo.ContInfo.ContImgInfo.ImgInfo' : 'PresnInfo.DocsInfo.AttachOfDoc.ImgInfo' let num = 0 let targetPath = '' jsonKeys.forEach((item, index) => { if (item.indexOf(`${path}_${num}.ID`) > -1) { let pathItem = item.substr(0, item.indexOf(path)) || '' resList.push({ imagid: jsonData[`${pathItem}${path}_${num}.ID`], imgtyp: jsonData[`${pathItem}${path}_${num}.Type`], imgdsp: jsonData[`${pathItem}${path}_${num}.Desc`], valflg: jsonData[`${pathItem}${path}_${num}.VldFlg`], }) num++ } }) } return resList }, getInvImgData (jsonData) { let resList = [] if (jsonData) { let jsonKeys = Object.keys(jsonData) let path = 'PresnInfo.DocsInfo.InvOfPresn.InvImgInfo' let num = 0 let targetPath = '' jsonKeys.forEach((item, index) => { if (item.indexOf(`${path}_${num}.ID`) > -1) { let pathItem = item.substr(0, item.indexOf(path)) || '' resList.push({ imagid: jsonData[`${pathItem}${path}_${num}.ID`], invtyp: jsonData[`${pathItem}${path}_${num}.InvTp`], invnum: jsonData[`${pathItem}${path}_${num}.InvNb`], invcod: jsonData[`${pathItem}${path}_${num}.InvCd`], untamt: jsonData[`${pathItem}${path}_${num}.UntaxAmt.amount`], invdat: jsonData[`${pathItem}${path}_${num}.InvDt`], valflg: jsonData[`${pathItem}${path}_${num}.VldFlg`], }) num++ } }) } return resList }, async getMsgIdList () { let sessionStrg = sessionStorage.getItem('msgIdList') if (sessionStrg && JSON.parse(sessionStrg)) { return; } let datas = {} let res = await Api.post(`/Domlc/msgeditor/getMsgIdByElcadd`, datas) if (res.respCode == SUCCESS) { let msgIdList = res.data sessionStorage.setItem('msgIdList', JSON.stringify(msgIdList)) } } }, mounted() { this.getMsgIdList(); Api.post(`/Domlc/msgeditor/getBranchList`).then(res => { if (res.respCode == SUCCESS) { this.bchlst = res.data; if (this.bchlst.length != 0) { this.extact = this.bchlst[0]; } } }); //挂载函数 let id = this.$route ? this.$route.query.id : ""; if (id) { let action = this.$route.query.action; Api.post(`/Domlc/msgeditor/msgbyid`, id).then(res => { if (res.respCode == SUCCESS) { this.regmsgtype = res.data.msgType; // this.imty = res.data.msgType; this.iaction = action; this.buildMesgStructure(); this.fillMesgObject(res.data.json); if(this.regmsgtype=='A01' || this.regmsgtype=='A03'){ this.model.imggrdm.imguseList = this.getImgData(res.data.json,'A') } if(this.regmsgtype=='B01' || this.regmsgtype=='B02'){ this.model.imggrdm.imguseList = this.getImgData(res.data.json,'B'); this.model.invgrdm.invlst = this.getInvImgData(res.data.json); } } }); } else { if (!this.regmsgtype) { return; } this.buildMesgStructure(); } }, destroyed() { window[this.imty] = undefined; } // watch:{ // treeData(newVal){ // this.buildMesgStructure() //初始化数据发生修改,重建数据结构 // } // } }; </script> <style> .arrow-up .el-icon__inner { display: flex; } .arrow-down .el-icon__inner { display: none; } .elc_page { overflow: auto; } .elc_page_title { margin: 0px; padding: 10px 20px; color: var(--black); font-size: 18px; font-weight: 800; background-color: #fff; } .el-icon-arrow-right:after { content: "\e791"; } p.elc_title { margin: 0; padding: 0; /* text-align: right; */ vertical-align: middle; float: left; font-size: 14px; color: #606266; line-height: 40px; padding: 0 12px 0 0; box-sizing: border-box; line-height: 22px; margin-bottom: 18px; /* border-bottom: 1px solid #606266; */ } p.elc_title.elc_notleaf { color: #169bff; /* border-bottom:1px dotted #169BFF; */ } p.elc_title.elc_title_1 { margin-left: 16px; font-size: 16px; } p.elc_title.elc_title_2 { margin-left: 16px; width: 150px; } p.elc_title.elc_title_3 { margin-left: 16px; } p.elc_title.elc_title_4 { margin-left: 16px; } p.elc_fix_label { color: #169bff; } .elc_tools { position: fixed; width: 100%; bottom: 0; left: 0; z-index: 9; } </style> <style lang="less" scoped> .elc_page { /deep/ .el-form-item__label:before { display: none; } } .cus-form-wrap { width: 100%; display: flex; align-items: flex-start; justify-content: flex-start; .cus-form-label { width: 150px; } .cus-form-content { width: calc(100% - 150px);; } } .elc_tools-wrap { width: 100%; height: 60px; background: #fff; display: flex; align-items: center; justify-content: center; position: absolute; bottom: 0; left: 0; z-index: 9; border-top: 1px dashed var(--collapse-border-color); } .elc-content-box { /deep/ .el-form { width: 100%; height: 100%; .el-tabs { height: 100%; } .el-tabs__content { height: calc(100% - 48px); .el-tab-pane { height: 100%; } } } } </style>