check-list.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. <template>
  2. <div class="relative h-full flex">
  3. <div :id="`hc_tree_card_${uuid}`">
  4. <hc-new-card scrollbar>
  5. <hc-lazy-tree :h-props="treeProps" is-load-menu @load="treeLoadNode" @loadMenu="treeLoadMenu" @menuTap="treeMenuTap" />
  6. </hc-new-card>
  7. </div>
  8. <div :id="`hc_table_card_${uuid}`" class="flex-1">
  9. <hc-new-card scrollbar title="合同工程清单明细">
  10. <template #extra>
  11. <el-button hc-btn type="primary">增补清单</el-button>
  12. <el-button hc-btn type="primary" @click="leadModalShow = true">导入</el-button>
  13. <el-button hc-btn type="primary">导出</el-button>
  14. </template>
  15. <div class="relative">
  16. <infoTable />
  17. <el-divider border-style="dashed">下级节点列表</el-divider>
  18. <hc-table :column="tableColumn" :datas="tableData" :loading="tableLoading" is-new :index-style="{ width: 60 }" />
  19. </div>
  20. </hc-new-card>
  21. </div>
  22. <!-- 节点数据 -->
  23. <hc-new-dialog v-model="treeModalShow" widths="1100px" :title="treeModalTitle" @save="treeModalSave">
  24. <el-form ref="formRef" class="p-4" label-position="left" label-width="auto" :model="formModel" :rules="formRules">
  25. <el-row :gutter="20">
  26. <el-col :span="8">
  27. <el-form-item label="清单编号:">
  28. <el-input v-model="formModel.key1" />
  29. </el-form-item>
  30. </el-col>
  31. <el-col :span="8">
  32. <el-form-item label="清单名称:">
  33. <el-input v-model="formModel.key2" />
  34. </el-form-item>
  35. </el-col>
  36. <el-col :span="8">
  37. <el-form-item label="单位:">
  38. <el-input v-model="formModel.key3" />
  39. </el-form-item>
  40. </el-col>
  41. <el-col :span="8">
  42. <el-form-item label="清单节点:">
  43. <el-select v-model="formModel.key4" block>
  44. <el-option label="是" :value="1" />
  45. </el-select>
  46. </el-form-item>
  47. </el-col>
  48. <el-col :span="8">
  49. <el-form-item label="中标单价:">
  50. <el-input v-model="formModel.key5" />
  51. </el-form-item>
  52. </el-col>
  53. <el-col :span="8">
  54. <el-form-item label="合同数量:">
  55. <el-input v-model="formModel.key6" />
  56. </el-form-item>
  57. </el-col>
  58. <el-col :span="8">
  59. <el-form-item label="章编号:">
  60. <el-input v-model="formModel.key7" />
  61. </el-form-item>
  62. </el-col>
  63. <el-col :span="8">
  64. <el-form-item label="清单标识:">
  65. <el-input v-model="formModel.key8" />
  66. </el-form-item>
  67. </el-col>
  68. <el-col :span="8">
  69. <el-form-item label="清单类型:">
  70. <el-select v-model="formModel.key9" block>
  71. <el-option label="普通清单" :value="1" />
  72. </el-select>
  73. </el-form-item>
  74. </el-col>
  75. <el-col :span="24">
  76. <el-form-item label="备注:">
  77. <el-input v-model="formModel.key10" :autosize="{ minRows: 4, maxRows: 8 }" type="textarea" />
  78. </el-form-item>
  79. </el-col>
  80. </el-row>
  81. </el-form>
  82. </hc-new-dialog>
  83. <!-- 导入清单 -->
  84. <hc-new-dialog v-model="leadModalShow" scrollbar widths="1100px" title="合同工程清单导入" @save="leadModalSave">
  85. <div class="hc-el-upload-drag">
  86. <el-upload
  87. ref="leadUploadRef" hc drag :show-file-list="false" :auto-upload="false" :headers="getHeader()"
  88. action="/api/blade-resource/oss/endpoint/upload-file" :data="leadUploadData"
  89. accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel"
  90. >
  91. <div class="hc-ui-upload-btn">
  92. <div class="hc-uploader-drop">
  93. <div class="upload-icon">
  94. <HcIcon name="upload-cloud" />
  95. </div>
  96. <div class="text">将文件拖动到此处,或点击上传</div>
  97. </div>
  98. <div class="hc-uploader-accept">支持的文件格式: Excel(xls、xlsx)</div>
  99. </div>
  100. </el-upload>
  101. </div>
  102. <hc-title>
  103. <span>范例模板</span>
  104. <template #extra>
  105. <el-link type="primary">下载范例模板.xls</el-link>
  106. </template>
  107. </hc-title>
  108. <el-table :data="tableLeadData" style="width: 100%;" row-key="id" border>
  109. <el-table-column prop="k1" label="导入编号" width="90" />
  110. <el-table-column prop="k2" label="清单编号" width="90" />
  111. <el-table-column prop="k3" label="清单名称" />
  112. <el-table-column prop="k4" label="单位" width="80" />
  113. <el-table-column prop="k5" label="合同数量" width="90" />
  114. <el-table-column prop="k6" label="中标单价" width="90" />
  115. <el-table-column prop="k7" label="清单类型" width="90" />
  116. <el-table-column prop="k8" label="章编号" width="80" />
  117. <el-table-column prop="k9" label="备注" width="90" />
  118. </el-table>
  119. <div class="mt-4 text-orange">特别提示:清单类型分为:1、普通清单,2、计日工清单,3、暂定金清单,请填写具体数字对应</div>
  120. </hc-new-dialog>
  121. </div>
  122. </template>
  123. <script setup>
  124. import { nextTick, onMounted, ref } from 'vue'
  125. import { getRandom } from 'js-fast-way'
  126. import { getHeader } from 'hc-vue3-ui'
  127. import infoTable from './components/check-list/info-table.vue'
  128. defineOptions({
  129. name: 'ProjectDebitContractList',
  130. })
  131. const uuid = getRandom(4)
  132. //渲染完成
  133. onMounted(() => {
  134. setSplitRef()
  135. })
  136. //初始化设置拖动分割线
  137. const setSplitRef = () => {
  138. //配置参考: https://split.js.org/#/?direction=vertical&snapOffset=0
  139. nextTick(() => {
  140. window.$split(['#hc_tree_card_' + uuid, '#hc_table_card_' + uuid], {
  141. sizes: [20, 80],
  142. snapOffset: 0,
  143. minSize: [50, 500],
  144. })
  145. })
  146. }
  147. //搜索表单
  148. const searchForm = ref({})
  149. //数据格式
  150. const treeProps = {
  151. label: 'name',
  152. children: 'children',
  153. isLeaf: 'leaf',
  154. }
  155. //懒加载的数据
  156. const treeLoadNode = ({ level }, resolve) => {
  157. if (level === 0) {
  158. return resolve([{ name: 'region' }])
  159. }
  160. if (level > 3) {
  161. return resolve([])
  162. }
  163. setTimeout(() => {
  164. resolve([
  165. { name: 'leaf', leaf: true },
  166. { name: 'zone' },
  167. ])
  168. }, 500)
  169. }
  170. //菜单
  171. const treeLoadMenu = ({ item, level }, resolve) => {
  172. if (level === 1) {
  173. return resolve([
  174. { icon: 'lock', label: '锁定', key: 'lock' },
  175. { icon: 'add', label: '新增', key: 'add' },
  176. { icon: 'arrow-up-down-line', label: '排序', key: 'sort' },
  177. ])
  178. } else {
  179. return resolve([
  180. { icon: 'lock', label: '锁定', key: 'lock' },
  181. { icon: 'add', label: '新增', key: 'add' },
  182. { icon: 'pencil', label: '修改', key: 'edit' },
  183. { icon: 'arrow-up-down-line', label: '排序', key: 'sort' },
  184. { icon: 'close', label: '删除', key: 'del' },
  185. ])
  186. }
  187. }
  188. const treeMenuTap = ({ key, node, data }) => {
  189. if (key === 'add') {
  190. treeModalTitle.value = '新增合同工程清单'
  191. treeModalShow.value = true
  192. }
  193. if (key === 'edit') {
  194. treeModalTitle.value = '修改合同工程清单'
  195. treeModalShow.value = true
  196. }
  197. }
  198. //表格数据
  199. const tableLoading = ref(false)
  200. const tableColumn = ref([
  201. { key: 'key1', name: '清单编号' },
  202. { key: 'key2', name: '清单名称' },
  203. { key: 'key3', name: '单位' },
  204. { key: 'key4', name: '现行单价' },
  205. { key: 'key5', name: '合同数量' },
  206. { key: 'key6', name: '合同金额' },
  207. { key: 'key7', name: '变更后单价' },
  208. { key: 'key8', name: '变更后数量' },
  209. { key: 'key9', name: '变更后金额' },
  210. { key: 'key10', name: '是否增补' },
  211. ])
  212. const tableData = ref([
  213. { key1: '1111' },
  214. ])
  215. //弹窗
  216. const treeModalShow = ref(false)
  217. const treeModalTitle = ref('')
  218. //弹窗表单
  219. const formRef = ref(null)
  220. const formModel = ref({})
  221. const formRules = ref({})
  222. //弹窗保存
  223. const treeModalSave = () => {
  224. }
  225. //合同工程清单导入
  226. const leadModalShow = ref(false)
  227. const leadUploadRef = ref(null)
  228. const leadUploadData = ref({})
  229. const tableLeadData = ref([
  230. { id: 1, k1: '100', k2: '100', k3: '总则', k4: '', k5: '', k6: '', k7: '1', k8: '100', k9: '' },
  231. { id: 2, k1: '101-1', k2: '101-1', k3: '保险费', k4: '', k5: '', k6: '', k7: '1', k8: '100', k9: '' },
  232. { id: 3, k1: '101-1a', k2: '101-1a', k3: '按合同条款规定,提供建筑工程一切险', k4: '总额', k5: '27', k6: '1.2', k7: '1', k8: '100', k9: '' },
  233. { id: 4, k1: '101-1b', k2: '101-1b', k3: '按合同条款规定,提供建筑工程一切险', k4: '总额', k5: '20', k6: '3', k7: '1', k8: '100', k9: '' },
  234. { id: 5, k1: '101-1c', k2: '101-1c', k3: '按合同条款规定,提供建筑工程一切险', k4: '总额', k5: '12', k6: '3.9', k7: '1', k8: '100', k9: '' },
  235. ])
  236. const leadModalSave = () => {
  237. leadModalShow.value = false
  238. }
  239. </script>