edit-element.vue 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. <template>
  2. <hc-drawer v-model="isShow" ui="hc-project-list-edit-element-drawer" to-id="hc-layout-box" is-close @close="drawerClose">
  3. <hc-page-split :fold="false" :options="splitOptions">
  4. <template #left>
  5. <hc-card :title="`【编辑元素】${dataInfo.tableName}`">
  6. <template #search>
  7. <div class="text-13px color-#f0720a">
  8. <span>提示:鼠标右键功能:更换匹配元素字段、新增元素字段、删除匹配元素字段、公式配置</span>
  9. <span class="ml-14px text-red-6">红色:代表匹配不成功、</span>
  10. <span class="text-blue-6">蓝色代表推荐匹配元素字段、</span>
  11. <span class="text-green-6">绿色代表匹配成功</span>
  12. </div>
  13. </template>
  14. <hc-table-form ref="excelRef" :html="excelHtml" @tap="excelClick" />
  15. </hc-card>
  16. </template>
  17. <hc-card scrollbar>
  18. <template #header>
  19. <el-button type="warning">表单调整</el-button>
  20. <el-button type="primary">公式配置</el-button>
  21. </template>
  22. <template #extra>
  23. <el-button @click="drawerClose">返回上一级</el-button>
  24. </template>
  25. <el-form ref="formRef" :model="formModel" :rules="formRules" label-position="left" label-width="auto">
  26. <el-form-item label="当前元素坐标:" prop="colName">
  27. <el-input v-model="formModel.colName" placeholder="请点击左侧表单" disabled />
  28. </el-form-item>
  29. <el-form-item label="将元素替换为:" prop="htmlType">
  30. <el-select v-model="formModel.htmlType" filterable block placeholder="输入元素名称搜索">
  31. <el-option label="个人证书" :value="2" />
  32. <el-option label="企业证书" :value="6" />
  33. </el-select>
  34. </el-form-item>
  35. </el-form>
  36. <div class="action-btn-box mb-40px mt-10px text-center">
  37. <el-button type="primary" @click="savingClick">临时保存</el-button>
  38. <el-button type="danger" style="margin-left: 50px">删除文本</el-button>
  39. </div>
  40. <div class="hc-edit-element-collapse">
  41. <el-collapse v-model="activeNames">
  42. <el-collapse-item name="key1">
  43. <template #title>
  44. <div class="hc-collapse-item-header hc-flex">
  45. <div class="title text-green">本次临时保存的元素</div>
  46. <div class="hc-extra-text-box">
  47. <el-button type="success" size="small" :loading="submitLoading" @click="dialogSubmit">全部提交保存</el-button>
  48. </div>
  49. </div>
  50. </template>
  51. 1111
  52. </el-collapse-item>
  53. <el-collapse-item name="key2">
  54. <template #title>
  55. <div class="hc-collapse-item-header hc-flex">
  56. <div class="title text-orange">未进行匹配的元素字段</div>
  57. <div class="hc-extra-text-box">
  58. <el-button type="warning" size="small">新增元素</el-button>
  59. </div>
  60. </div>
  61. </template>
  62. 1111
  63. </el-collapse-item>
  64. </el-collapse>
  65. </div>
  66. </hc-card>
  67. </hc-page-split>
  68. </hc-drawer>
  69. </template>
  70. <script setup>
  71. import { ref, watch } from 'vue'
  72. import { getArrValue, getObjValue, isNullES } from 'js-fast-way'
  73. import excelApi from '~api/exctab/exceltab'
  74. const props = defineProps({
  75. info: {
  76. type: Object,
  77. default: () => ({}),
  78. },
  79. data: {
  80. type: Object,
  81. default: () => ({}),
  82. },
  83. })
  84. //事件
  85. const emit = defineEmits(['close'])
  86. //双向绑定
  87. const isShow = defineModel('modelValue', {
  88. default: false,
  89. })
  90. //监听数据
  91. const dataInfo = ref(props.info)
  92. const editData = ref(props.data)
  93. watch(() => [props.info, props.data], ([info, data]) => {
  94. dataInfo.value = getObjValue(info)
  95. editData.value = getObjValue(data)
  96. }, { immediate: true, deep: true })
  97. //监听显示
  98. watch(isShow, (val) => {
  99. if (val) getDataApi()
  100. })
  101. //页面分割
  102. const splitOptions = { sizes: [70, 30], snapOffset: 0, minSize: [300, 300] }
  103. //处理相关数据
  104. const excelRef = ref(null)
  105. const excelHtml = ref('')
  106. const getDataApi = async () => {
  107. const { pkeyId, excelId } = getObjValue(dataInfo.value)
  108. if (isNullES(pkeyId) || isNullES(excelId)) {
  109. window?.$message.warning('表单值异常,请联系管理员')
  110. return
  111. }
  112. const { data } = await excelApi.getExcelHtml({ pkeyId })
  113. excelHtml.value = data || ''
  114. }
  115. //基础表单
  116. const formRef = ref(null)
  117. const formModel = ref({})
  118. const formRules = {
  119. colName: { required: true, trigger: 'change', message: '请先获取元素坐标' },
  120. htmlType: { required: true, trigger: 'change', message: '请先寻找将元素替换为' },
  121. }
  122. //元素被点击
  123. const excelClick = async (item) => {
  124. const { pkeyId } = getObjValue(dataInfo.value)
  125. if (isNullES(pkeyId)) {
  126. window?.$message.warning('表单值异常,请联系管理员')
  127. return
  128. }
  129. const data = await getDomAttribute(item)
  130. const arr = getArrValue(formDataArr.value)
  131. console.log(data)
  132. /*formModel.value = {
  133. tabId: pkeyId,
  134. colName: data.name || data.key,
  135. tdIndex: data.td,
  136. trIndex: data.tr,
  137. htmlType: '',
  138. }*/
  139. }
  140. //获取元素相关信息
  141. const keys = [
  142. 'type', 'key', 'tr', 'td', 'index', 'x1', 'y1', 'x2', 'y2', 'name', 'text', 'rows', 'format', 'tip',
  143. 'weighing', 'label', 'value', 'src', 'val', 'contractid', 'pkeyid', 'objs', 'range', 'def', 'max',
  144. ]
  145. const getDomAttribute = async (item) => {
  146. const dom = item?.target
  147. let obj = { zdom: item }
  148. for (let i = 0; i < keys.length; i++) {
  149. obj[keys[i]] = await getAttribute(dom, keys[i])
  150. }
  151. return obj
  152. }
  153. //获取属性
  154. const getAttribute = async (dom, key) => {
  155. try {
  156. return dom?.getAttribute(`data-${key}`)
  157. } catch (e) {
  158. return null
  159. }
  160. }
  161. //临时保存
  162. const formDataArr = ref([])
  163. const savingClick = () => {
  164. }
  165. //折叠面板
  166. const activeNames = ref(['key2'])
  167. //保存数据
  168. const submitLoading = ref(false)
  169. const dialogSubmit = async () => {
  170. console.log(formModel.value)
  171. }
  172. //关闭抽屉
  173. const drawerClose = () => {
  174. isShow.value = false
  175. emit('close')
  176. }
  177. </script>
  178. <style lang="scss">
  179. .el-overlay .el-drawer.hc-project-list-edit-element-drawer {
  180. background-color: #F1F5F8;
  181. .hc-table-form-data-item {
  182. padding: 0;
  183. }
  184. .hc-table-form-data-item .hc-excel-table-form {
  185. background: #e4e7eb;
  186. }
  187. .hc-edit-element-collapse {
  188. position: relative;
  189. border: 1px solid #ebeef5;
  190. border-top: 0;
  191. border-bottom: 0;
  192. .el-collapse {
  193. --el-collapse-header-bg-color: #f9f9f9;
  194. }
  195. .el-collapse .el-collapse-item {
  196. .el-collapse-item__header {
  197. padding-left: 10px;
  198. }
  199. .el-collapse-item__wrap {
  200. padding: 10px;
  201. border-top: 1px solid #ebeef5;
  202. .el-collapse-item__content {
  203. padding-bottom: 0;
  204. }
  205. }
  206. }
  207. .el-collapse .el-collapse-item .hc-collapse-item-header {
  208. position: relative;
  209. flex: 1;
  210. .title {
  211. position: relative;
  212. flex: 1;
  213. text-align: left;
  214. }
  215. .hc-extra-text-box {
  216. position: relative;
  217. margin-right: 24px;
  218. }
  219. }
  220. }
  221. }
  222. </style>