EditBaseEDB.vue 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. <script setup>
  2. import {watch,ref, reactive, computed} from 'vue'
  3. import apiDataEDB from '@/api/dataEDB'
  4. import {edbFrequencyOpts,edbUnitOpts} from '../util/config'
  5. import {deleteClassifyItemEmpty,findItemWithIdAndParents} from '../util/util'
  6. import { showToast } from 'vant'
  7. const props=defineProps({
  8. modelValue:{
  9. type:Boolean,
  10. default:false
  11. },
  12. edbInfoId:{
  13. type:Number,
  14. default:0
  15. },//当前指标id
  16. baseInfo:{},//新增指标时传来的初始数据
  17. })
  18. const emits=defineEmits(['update:modelValue','success','addSuccess'])
  19. const edbNameInputFocus=ref(false)//指标名称输入框聚焦状态
  20. const formState=reactive({
  21. name:'',
  22. classify:'',
  23. frequency:'',
  24. unit:''
  25. })
  26. // 获取指标详情
  27. async function getEDBInfo(){
  28. const res=await apiDataEDB.getBaseEdbInfo({EdbInfoId:props.edbInfoId})
  29. if(res.Ret===200){
  30. formState.name=res.Data.EdbName
  31. formState.classify=res.Data.ClassifyId
  32. formState.frequency=res.Data.Frequency
  33. formState.unit=res.Data.Unit
  34. getEdbClassifyList()
  35. }
  36. }
  37. watch(
  38. ()=>props.modelValue,
  39. ()=>{
  40. if(props.modelValue){
  41. // 编辑
  42. if(props.edbInfoId){
  43. getEDBInfo()
  44. }else{
  45. // 新增
  46. formState.name=props.baseInfo.edb_name
  47. formState.frequency=props.baseInfo.frequency
  48. formState.unit=props.baseInfo.unit
  49. getEdbClassifyList()
  50. }
  51. }
  52. }
  53. )
  54. function handleClose(){
  55. emits('update:modelValue',false)
  56. }
  57. // 获取指标库分类
  58. const edbClassifyList=ref([])
  59. function getEdbClassifyList(){
  60. apiDataEDB.edbClassifyList().then(res=>{
  61. if(res.Ret===200){
  62. deleteClassifyItemEmpty(res.Data.AllNodes||[])
  63. edbClassifyList.value=res.Data.AllNodes||[]
  64. }
  65. })
  66. }
  67. const showSelectClassify=ref(false)
  68. const selectClassifyNameStr=computed(()=>{
  69. if(!formState.classify) return ''
  70. let arr=[]
  71. arr=findItemWithIdAndParents(edbClassifyList.value,formState.classify)
  72. if(arr?.length){
  73. const textArr=arr.map(item=>item.ClassifyName)
  74. return `${textArr.join('/')}`
  75. }
  76. })
  77. // 选择频率
  78. const showSelectFrequency=ref(false)
  79. const frequencyOpts=edbFrequencyOpts.map(item=>{
  80. return {
  81. text:item,
  82. value:item
  83. }
  84. })
  85. function onConfirmSelectFrequency(e){
  86. formState.frequency=e.selectedValues[0]
  87. showSelectFrequency.value=false
  88. }
  89. // 选择单位
  90. const showSelectUnit=ref(false)
  91. const unitOpts=edbUnitOpts.map(item=>{return{text:item,value:item}})
  92. function onConfirmSelectUnit(e){
  93. formState.unit=e.selectedValues[0]
  94. showSelectUnit.value=false
  95. }
  96. // 保存编辑
  97. async function handleSave(){
  98. let params={
  99. ClassifyId:formState.classify,
  100. EdbName:formState.name,
  101. Frequency:formState.frequency,
  102. Unit:formState.unit
  103. }
  104. if(!params.EdbName){
  105. showToast('指标名称不能为空')
  106. return
  107. }
  108. if(!params.ClassifyId){
  109. showToast('目录名称不能为空')
  110. return
  111. }
  112. if(!params.Frequency){
  113. showToast('频率不能为空')
  114. return
  115. }
  116. if(!params.Unit){
  117. showToast('单位不能为空')
  118. return
  119. }
  120. if(props.edbInfoId){
  121. params={
  122. EdbInfoId:props.edbInfoId,
  123. ...params
  124. }
  125. const res=await apiDataEDB.editBaseEdbInfo(params)
  126. if(res.Ret===200){
  127. showToast(res.Msg)
  128. emits('update:modelValue',false)
  129. emits('success',params)
  130. }
  131. }else{
  132. params={
  133. ...props.baseInfo,
  134. ...params
  135. }
  136. const res=await apiDataEDB.AddBaseEdbInfo(params)
  137. if(res.Ret===200){
  138. showToast('新增指标成功!')
  139. emits('update:modelValue',false)
  140. emits('addSuccess')
  141. }
  142. }
  143. }
  144. </script>
  145. <template>
  146. <van-popup
  147. :show="props.modelValue"
  148. position="bottom"
  149. style="width:100%;height:100%"
  150. >
  151. <div class="edit-baseEDB-wrap">
  152. <van-field
  153. v-model="formState.name"
  154. label="指标名称"
  155. placeholder="指标名称"
  156. input-align="right"
  157. @focus="edbNameInputFocus=true"
  158. @blur="edbNameInputFocus=false"
  159. >
  160. <template #right-icon>
  161. <svg class="edit-icon" xmlns="http://www.w3.org/2000/svg" width="48" height="48" viewBox="0 0 48 48" fill="none">
  162. <path d="M23.4 13.2L34.8 24.6L19.4 40H8V28.6L23.4 13.2ZM23.4 19L12 30.4V36H17.6L29 24.6L23.4 19ZM28.8 8L40 19.4L36.6 22.8L25.2 11.4L28.8 8Z" :fill="edbNameInputFocus?'#0052D9':'#333333'"/>
  163. </svg>
  164. </template>
  165. </van-field>
  166. <van-field
  167. :modelValue="selectClassifyNameStr"
  168. readonly
  169. label="所属目录"
  170. placeholder="请选择所属目录"
  171. input-align="right"
  172. right-icon="arrow"
  173. @click-input="showSelectClassify=true"
  174. />
  175. <van-field
  176. :modelValue="formState.frequency"
  177. readonly
  178. label="频率"
  179. placeholder="请选择频率"
  180. input-align="right"
  181. right-icon="arrow"
  182. @click-input="showSelectFrequency=true"
  183. />
  184. <van-field
  185. :modelValue="formState.unit"
  186. readonly
  187. label="单位"
  188. placeholder="请选择单位"
  189. input-align="right"
  190. right-icon="arrow"
  191. @click-input="showSelectUnit=true"
  192. />
  193. <div class="btn-box">
  194. <van-button @click="handleClose">取消</van-button>
  195. <van-button type="primary" @click="handleSave">保存</van-button>
  196. </div>
  197. </div>
  198. </van-popup>
  199. <!-- 选择分类 -->
  200. <van-popup
  201. v-model:show="showSelectClassify"
  202. round
  203. position="bottom"
  204. >
  205. <van-cascader
  206. v-model="formState.classify"
  207. title="选择目录"
  208. :options="edbClassifyList"
  209. :field-names="{text:'ClassifyName',value:'ClassifyId',children:'Children'}"
  210. @close="showSelectClassify = false"
  211. />
  212. <div style="width:300px;margin:0 auto;padding:20px 0">
  213. <van-button type="primary" round block @click="showSelectClassify = false">确定</van-button>
  214. </div>
  215. </van-popup>
  216. <!-- 选择频率 -->
  217. <van-popup
  218. v-model:show="showSelectFrequency"
  219. round
  220. position="bottom"
  221. >
  222. <van-picker
  223. title="请选择频率"
  224. :columns="frequencyOpts"
  225. @cancel="showSelectFrequency=false"
  226. @confirm="onConfirmSelectFrequency"
  227. />
  228. </van-popup>
  229. <!-- 选择单位 -->
  230. <van-popup
  231. v-model:show="showSelectUnit"
  232. round
  233. position="bottom"
  234. >
  235. <van-picker
  236. title="选择单位"
  237. :columns="unitOpts"
  238. @cancel="showSelectUnit=false"
  239. @confirm="onConfirmSelectUnit"
  240. />
  241. </van-popup>
  242. </template>
  243. <style lang="scss" scoped>
  244. .edit-baseEDB-wrap{
  245. .edit-icon{
  246. width: 48px;
  247. height: 48px;
  248. }
  249. :deep(.van-field__right-icon){
  250. width: 60px;
  251. }
  252. .btn-box{
  253. margin-top: 50PX;
  254. text-align: center;
  255. .van-button{
  256. width: 150PX;
  257. margin: 0 10PX;
  258. }
  259. }
  260. }
  261. @media screen and (min-width:$media-width){
  262. .edit-baseEDB-wrap{
  263. .edit-icon{
  264. width: 24px;
  265. height: 24px;
  266. }
  267. :deep(.van-field__right-icon){
  268. width: 30px;
  269. }
  270. }
  271. }
  272. </style>