SingleLayoutTemp.vue 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. <template>
  2. <div class="page-container" >
  3. <div class="edit-box">
  4. <LayoutTmp v-model="layoutELModels"></LayoutTmp>
  5. </div>
  6. <VueDragResize
  7. :isActive="false"
  8. :w="320"
  9. :h="300"
  10. :x="60"
  11. :isResizable="false"
  12. :parentLimitation="false"
  13. key="ctr-panel"
  14. >
  15. <el-card class="ctr-panel">
  16. <el-button-group>
  17. <el-button type="primary" icon="Folder" @click="saveTemp('save')">保存</el-button>
  18. <el-button type="primary" icon="FolderAdd" @click="saveTemp('saveAs')">另存为</el-button>
  19. <el-button type="primary" icon="Delete" @click="delTemp">删除</el-button>
  20. </el-button-group>
  21. <el-select v-model="formModel.tempId" placeholder="选择单井模板" style="width:100%;margin-top:10px;" @change="changeTempHandle">
  22. <el-option value="new" label="空白模板"/>
  23. <el-option
  24. v-for="item in tempList"
  25. :key="item.tempId"
  26. :label="item.tempName"
  27. :value="item.tempId"
  28. />
  29. </el-select>
  30. <el-collapse accordion>
  31. <el-collapse-item title="单值元素" name="1">
  32. <el-tag v-for="(el,index) in elOpts?.single" :key="index" @click="selEL(el)" :effect="el?.checked?'dark':'light'">{{el?.paramName}}</el-tag>
  33. </el-collapse-item>
  34. <el-collapse-item title="多值元素" name="2">
  35. <el-tag v-for="(el,index) in elOpts?.multi" :key="index" @click="selEL(el)" :effect="el?.checked?'dark':'light'">{{el?.paramName}}</el-tag>
  36. </el-collapse-item>
  37. <el-collapse-item title="其它元素" name="3">
  38. <el-tag v-for="(el,index) in elOpts?.oth" :key="index" @click="selEL(el)" :effect="el?.checked?'dark':'light'">{{el?.paramName}}</el-tag>
  39. </el-collapse-item>
  40. </el-collapse>
  41. </el-card>
  42. </VueDragResize>
  43. </div>
  44. </template>
  45. <script setup>
  46. import {ref,reactive,toRaw,onMounted } from 'vue'
  47. import paramMgrAPI from '../../api/paramMgr.js'
  48. import LayoutTmp from '../../components/layouttmp/LayoutTmp.vue'
  49. import VueDragResize from 'vue-drag-resize/src'
  50. import api from '../../api/singleLayoutTemp.js'
  51. import {ElMessageBox,ElMessage} from 'element-plus'
  52. const formModel = reactive({
  53. tempId:null
  54. })
  55. const layoutELModels=ref([])
  56. const tempList=ref([])
  57. const elOpts=reactive({
  58. single:[],
  59. multi:[],
  60. oth:[
  61. {paramCode:'wellName',paramName:'井名标题',elType:'wellName'}
  62. ]
  63. })
  64. //选择布局元素
  65. const selEL=(el)=>{
  66. el['checked']=!el['checked']
  67. synLayoutEL(el)
  68. }
  69. //同步更新layoutel
  70. const synLayoutEL=(srcEL)=>{
  71. if(!srcEL.checked){
  72. let finedIdx=null
  73. layoutELModels.value.forEach((item,index)=>{
  74. if(item&&item.paramCode==srcEL.paramCode){
  75. finedIdx=index
  76. return false
  77. }
  78. })
  79. if(finedIdx!=null){
  80. layoutELModels.value.splice(finedIdx,1)
  81. }
  82. }
  83. else{
  84. let initVal={
  85. width: 120,
  86. height: 60,
  87. top: 0,
  88. left: 100,
  89. paramName:srcEL.paramName,
  90. paramCode:srcEL.paramCode,
  91. elType:srcEL.elType
  92. }
  93. if(srcEL.elType=="multi"){
  94. initVal.width=400
  95. initVal.height=220
  96. }
  97. else if(srcEL.elType=="wellName"){
  98. initVal.width=120
  99. initVal.height=30
  100. }
  101. layoutELModels.value.push(initVal)
  102. }
  103. }
  104. onMounted(()=>{
  105. loadParamType()
  106. loadTempList()
  107. })
  108. const loadParamType=()=>{
  109. paramMgrAPI.loadAll().then(resp=>{
  110. if(resp.code==0){
  111. let tmp
  112. resp.data.forEach(param=>{
  113. //param['name']=param.paramName
  114. //param['code']=param.paramCode
  115. param['elType']='single'
  116. tmp=elOpts.single
  117. if(param.paramCode.indexOf('diagram')>=0){
  118. param['elType']='multi'
  119. tmp=elOpts.multi
  120. }
  121. tmp.push(param)
  122. })
  123. }
  124. }).catch(error=>{
  125. console.log(error)
  126. })
  127. }
  128. const resetPage=()=>{
  129. layoutELModels.value=[]
  130. elOpts.single.forEach((item,index)=>{
  131. item.checked=false
  132. })
  133. elOpts.multi.forEach((item,index)=>{
  134. item.checked=false
  135. })
  136. elOpts.oth.forEach((item,index)=>{
  137. item.checked=false
  138. })
  139. }
  140. const initElOptsCheck=(checkMap)=>{
  141. elOpts.single.forEach((item,index)=>{
  142. item.checked=checkMap[item.paramCode]
  143. })
  144. elOpts.multi.forEach((item,index)=>{
  145. item.checked=checkMap[item.paramCode]
  146. })
  147. elOpts.oth.forEach((item,index)=>{
  148. item.checked=checkMap[item.paramCode]
  149. })
  150. }
  151. //选择模板后,加载明细
  152. const changeTempHandle=(val)=>{
  153. resetPage()
  154. api.getTempDtl(val).then(resp=>{
  155. if(resp.code!=0){
  156. ElMessage.error(err||'加载模板明细失败')
  157. return
  158. }
  159. if(resp.data&&resp.data.tempContent){
  160. let elModels=JSON.parse(resp.data.tempContent)
  161. let mapping={}
  162. elModels.forEach((item,index)=>{
  163. mapping[item.paramCode]=true
  164. layoutELModels.value.push(item)
  165. })
  166. initElOptsCheck(mapping)
  167. }
  168. }).catch(err=>{
  169. }
  170. )
  171. }
  172. //加载库中模板
  173. const loadTempList=()=>{
  174. api.loadTempList().then(resp=>{
  175. if(resp.code==0){
  176. tempList.value=resp.data
  177. }
  178. }).catch(error=>{
  179. })
  180. }
  181. //获取要保存的数据
  182. const getSaveData=()=>{
  183. let tempName=''
  184. if(tempList.value&&tempList.value.length>0){
  185. let chkedtemp=tempList.value.filter(temp=>temp.tempId==formModel.tempId)
  186. tempName=chkedtemp&&chkedtemp.length>0?chkedtemp[0].tempName:null
  187. }
  188. return {tempName,tempId:formModel.tempId,tempContent:JSON.stringify(layoutELModels.value),tempType:'single'}
  189. }
  190. const saveTemp=(tag)=>{
  191. if(tag==="save"){
  192. api.save(getSaveData()).then(resp=>{
  193. if(resp.code!=0){
  194. ElMessage.error(resp.msg)
  195. return
  196. }
  197. ElMessage.success('操作成功')
  198. }).catch(err=>{
  199. ElMessage.error(err||'操作失败')
  200. })
  201. }
  202. else if(tag==="saveAs"){
  203. return ElMessageBox.prompt('创建新模板',null,{
  204. showCancelButton:true,
  205. showInput:true,
  206. inputType:'text',
  207. inputPlaceholder:'请输入模板名称',
  208. inputPattern:/\S+/,
  209. inputErrorMessage:'模板名称不能为空',
  210. closeOnClickModal:false
  211. }).then(({value })=>{
  212. let saveData=getSaveData()
  213. saveData['tempName']=value
  214. api.saveAs(saveData).then(resp=>{
  215. if(resp.code!=0){
  216. ElMessage.error(resp.msg||'操作失败')
  217. }
  218. else{
  219. ElMessage.success('操作成功')
  220. loadTempList()
  221. formModel.tempId=resp.data
  222. }
  223. })
  224. })
  225. .catch(err => {
  226. console.log('cancel save as '+err)
  227. })
  228. }
  229. }
  230. //删除模板
  231. const delTemp=()=>{
  232. if(formModel.tempId==null){
  233. ElMessage.error('还未选择模板')
  234. return
  235. }
  236. ElMessageBox.confirm(
  237. '确定要删除该模板吗?',
  238. '操作确认',
  239. {
  240. confirmButtonText:'确定',
  241. cancelButtonText:'取消',
  242. type: 'warning'
  243. }
  244. ).then(()=>{
  245. api.del(formModel.tempId).then(resp=>{
  246. if(resp.code!=0){
  247. ElMessage.error(resp.msg)
  248. return
  249. }
  250. ElMessage.success('操作成功')
  251. formModel.tempId=null
  252. resetPage()
  253. loadTempList()
  254. }).catch(err=>{
  255. ElMessage.error(err||'操作失败')
  256. })
  257. }).catch(()=>{
  258. console.log('cancel del')
  259. })
  260. }
  261. </script>
  262. <style scoped>
  263. .page-container{
  264. position: relative;
  265. left:0px;
  266. top:0px;
  267. height: 100%;
  268. }
  269. .edit-box{
  270. width:100%;
  271. height: 100%;
  272. box-sizing: border-box;
  273. position: relative;
  274. }
  275. .item2 {
  276. margin-bottom: 18px;
  277. }
  278. .ctr-panel{
  279. width: 300px;
  280. position: absolute;
  281. top:0px;
  282. right: 10px;
  283. }
  284. .ctr-panel .el-tag{
  285. width:70px;
  286. margin:0px 5px 5px 0px;
  287. cursor:pointer;
  288. }
  289. </style>