sieve.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490
  1. <template>
  2. <div class="hc-page-layout-box">
  3. <div :style="`width:${leftWidth}px;`" class="hc-layout-left-box menu">
  4. <div class="hc-menu-header-box">
  5. <div class="text-xl name">自定义筛孔类型</div>
  6. <HcTooltip keys="tentative_parameter_sieve_menu_add">
  7. <el-button _icon hc-btn size="small" type="primary" @click="addEditNodeFormModalClick">
  8. <HcIcon name="add" />
  9. </el-button>
  10. </HcTooltip>
  11. </div>
  12. <div class="hc-menu-contents-box">
  13. <el-scrollbar>
  14. <HcMenuSimple
  15. :datas="menus" :keys="menuKey" :menus="contextMenu" :props="menuProps"
  16. @change="menuChange" @menu-tap="contextMenuClick"
  17. />
  18. </el-scrollbar>
  19. </div>
  20. <!-- 左右拖动 -->
  21. <div class="horizontal-drag-line" @mousedown="onmousedown" />
  22. </div>
  23. <div class="hc-page-content-box">
  24. <HcNewCard>
  25. <!-- <template #header>
  26. <div class="w-72">
  27. <el-input v-model="searchForm.queryValue" placeholder="请输入容器编号查询" clearable @keyup="keyUpEvent" size="large"/>
  28. </div>
  29. <div class="ml-2">
  30. <el-button type="primary" @click="searchClick" size="large">
  31. <HcIcon name="search-2"/>
  32. <span>搜索</span>
  33. </el-button>
  34. </div>
  35. </template> -->
  36. <template #extra>
  37. <HcTooltip keys="tentative_parameter_sieve_add">
  38. <el-button :disabled="menus.length < 1 " hc-btn type="primary" @click="addFormModalClick">
  39. <HcIcon name="add-circle" />
  40. <span>新增</span>
  41. </el-button>
  42. </HcTooltip>
  43. <HcTooltip keys="tentative_parameter_sieve_edit">
  44. <el-button :disabled="tableCheckedKeys.length <= 0" hc-btn type="primary" color="#12C060" style="color: white;" @click="editFormModalClick">
  45. <HcIcon name="edit" />
  46. <span>编辑</span>
  47. </el-button>
  48. </HcTooltip>
  49. <HcTooltip keys="tentative_parameter_sieve_del">
  50. <el-button v-del-com:[delNodeModalClick] :disabled="tableCheckedKeys.length <= 0" hc-btn color="#e03997">
  51. <HcIcon name="delete-bin-2" />
  52. <span>删除</span>
  53. </el-button>
  54. </HcTooltip>
  55. </template>
  56. <HcTable
  57. ref="tableRef" :column="tableColumn" :datas="tableData" :loading="tableLoading"
  58. is-new :index-style="{ width: 60 }" is-check :check-style="{ width: 29 }"
  59. @selection-change="tableSelection"
  60. />
  61. <template #action>
  62. <HcPages :pages="searchForm" @change="pageChange" />
  63. </template>
  64. </HcNewCard>
  65. </div>
  66. <!-- 新增/编辑 节点 -->
  67. <hc-new-dialog
  68. v-model="addEditNodeFormModal" :loading="addEditNodeFormLoading" :title="`${addEditNodeFormModel.id ? '编辑' : '新增'}类型`"
  69. widths="30rem" @close="addEditNodeFormModalClose" @save="addEditNodeFormModalSave"
  70. >
  71. <el-form
  72. ref="addEditNodeFormRef" :model="addEditNodeFormModel" :rules="addEditNodeFormRules"
  73. label-position="top" label-width="auto" size="large"
  74. >
  75. <el-form-item label="类型名称" prop="name">
  76. <el-input v-model="addEditNodeFormModel.name" placeholder="请输入类型名称" />
  77. </el-form-item>
  78. </el-form>
  79. </hc-new-dialog>
  80. <!-- 新增/编辑 -->
  81. <hc-new-dialog
  82. v-model="addEditFormModal" :loading="addEditFormLoading" :title="`${addEditFormModel.id ? '编辑' : '新增'}筛孔尺寸信息`"
  83. widths="45rem" @close="addEditFormModalClose" @save="addEditFormClick"
  84. >
  85. <el-form
  86. ref="addEditFormRef" :model="addEditFormModel" :rules="addEditFormRules" label-width="auto"
  87. size="large"
  88. >
  89. <div class="hc-form-item">
  90. <el-form-item label="筛孔尺寸" prop="sievePoreSize">
  91. <el-input v-model="addEditFormModel.sievePoreSize" />
  92. </el-form-item>
  93. <el-form-item label="标准" prop="standard">
  94. <el-input v-model="addEditFormModel.standard" />
  95. </el-form-item>
  96. </div>
  97. <div class="hc-form-item">
  98. <el-form-item label="下限" prop="lowerLimit">
  99. <el-input v-model="addEditFormModel.lowerLimit" />
  100. </el-form-item>
  101. <el-form-item label="上限" prop="upperLimit">
  102. <el-input v-model="addEditFormModel.upperLimit" />
  103. </el-form-item>
  104. </div>
  105. <div class="hc-form-item">
  106. <el-form-item label="限制区界限最大" prop="maxLimitBoundary">
  107. <el-input v-model="addEditFormModel.maxLimitBoundary" />
  108. </el-form-item>
  109. <el-form-item label="限制区界限最小" prop="minLimitBoundary">
  110. <el-input v-model="addEditFormModel.minLimitBoundary" />
  111. </el-form-item>
  112. </div>
  113. <div class="hc-form-item">
  114. <el-form-item label="控制点界限最大" prop="maxLimitControl">
  115. <el-input v-model="addEditFormModel.maxLimitControl" />
  116. </el-form-item>
  117. <el-form-item label="控制点界限最小" prop="minLimitControl">
  118. <el-input v-model="addEditFormModel.minLimitControl" />
  119. </el-form-item>
  120. </div>
  121. </el-form>
  122. </hc-new-dialog>
  123. </div>
  124. </template>
  125. <script setup>
  126. import { onMounted, ref, watch } from 'vue'
  127. import { useAppStore } from '~src/store'
  128. import { HcIsButton } from '~src/plugins/IsButtons'
  129. import { arrToId, formValidate, getArrValue } from 'js-fast-way'
  130. import dataApi from '~api/tentative/parameter/sieve'
  131. import { HcDelMsg } from 'hc-vue3-ui'
  132. //初始变量
  133. const useAppState = useAppStore()
  134. const projectId = ref(useAppState.getProjectId)
  135. const contractId = ref(useAppState.getContractId)
  136. const isCollapse = ref(useAppState.getCollapse)
  137. //监听
  138. watch(() => [
  139. useAppState.getCollapse,
  140. ], ([Collapse]) => {
  141. isCollapse.value = Collapse
  142. })
  143. //渲染完成
  144. onMounted(() => {
  145. queryClassification()
  146. setContextMenu()
  147. })
  148. //左侧菜单
  149. const menuKey = ref('')
  150. const menus = ref([])
  151. const menuProps = {
  152. key: 'id',
  153. label: 'name',
  154. }
  155. const queryClassification = async () => {
  156. const { data } = await dataApi.queryClassification({
  157. projectId: projectId.value,
  158. contractId: contractId.value,
  159. })
  160. const arr = getArrValue(data)
  161. menus.value = arr
  162. if (arr.length > 0) {
  163. menuChange(arr[0])
  164. }
  165. }
  166. //菜单被点击
  167. const menuItem = ref({})
  168. const menuChange = (item) => {
  169. menuItem.value = item
  170. menuKey.value = item?.id
  171. searchForm.value.current = 1
  172. searchForm.value.classId = item?.id
  173. getTableData()
  174. }
  175. //菜单的右键菜单
  176. const contextMenu = ref([])
  177. const setContextMenu = () => {
  178. let newArr = []
  179. if (HcIsButton('tentative_parameter_sieve_menu_edit')) {
  180. newArr.push({ icon: 'draft', label: '编辑分类', key: 'edit' })
  181. }
  182. if (HcIsButton('tentative_parameter_sieve_menu_del')) {
  183. newArr.push({ icon: 'delete-bin', label: '删除分类', key: 'del' })
  184. }
  185. contextMenu.value = newArr
  186. }
  187. //菜单的右键菜单被点击
  188. const contextMenuItem = ref({})
  189. const contextMenuClick = ({ key, item }) => {
  190. contextMenuItem.value = item
  191. if (key === 'edit') {
  192. addEditNodeFormModel.value = { ...item }
  193. addEditNodeFormModal.value = true
  194. } else if (key === 'del') {
  195. HcDelMsg( async ( resolve) => {
  196. await delClassification(item)
  197. resolve() //关闭弹窗的回调
  198. })
  199. }
  200. }
  201. //搜索表单
  202. const searchForm = ref({
  203. classId: null, queryValue: null,
  204. current: 1, size: 20, total: 0,
  205. })
  206. //回车搜索
  207. const keyUpEvent = (e) => {
  208. if (e.key === 'Enter') {
  209. searchForm.value.current = 1
  210. getTableData()
  211. }
  212. }
  213. //搜索
  214. const searchClick = () => {
  215. searchForm.value.current = 1
  216. getTableData()
  217. }
  218. //分页被点击
  219. const pageChange = ({ current, size }) => {
  220. searchForm.value.current = current
  221. searchForm.value.size = size
  222. getTableData()
  223. }
  224. //表格数据
  225. const tableRef = ref(null)
  226. const tableColumn = ref([
  227. { key: 'sievePoreSize', name: '筛孔尺寸' },
  228. { key: 'lowerLimit', name: '下限' },
  229. { key: 'upperLimit', name: '上限' },
  230. { key: 'standard', name: '标准' },
  231. { key: 'maxLimitBoundary', name: '限制区最大' },
  232. { key: 'minLimitBoundary', name: '限制区最小' },
  233. { key: 'maxLimitControl', name: '控制点最大' },
  234. { key: 'minLimitControl', name: '控制点最小' },
  235. ])
  236. const tableData = ref([])
  237. //获取数据
  238. const tableLoading = ref(false)
  239. const getTableData = async () => {
  240. tableLoading.value = true
  241. const { error, code, data } = await dataApi.queryPage({
  242. projectId: projectId.value,
  243. contractId: contractId.value,
  244. ...searchForm.value,
  245. })
  246. //处理数据
  247. tableLoading.value = false
  248. if (!error && code === 200) {
  249. tableData.value = getArrValue(data['records'])
  250. searchForm.value.total = data.total || 0
  251. } else {
  252. tableData.value = []
  253. searchForm.value.total = 0
  254. }
  255. }
  256. //多选
  257. const tableCheckedKeys = ref([])
  258. const tableSelection = (rows) => {
  259. tableCheckedKeys.value = rows
  260. }
  261. //新增/编辑 分类
  262. const addEditNodeFormModal = ref(false)
  263. const addEditNodeFormRef = ref(null)
  264. const addEditNodeFormModel = ref({ name: '' })
  265. const addEditNodeFormRules = {
  266. name: {
  267. required: true,
  268. trigger: 'blur',
  269. message: '请输入分类名称',
  270. },
  271. }
  272. //新增分类
  273. const addEditNodeFormModalClick = () => {
  274. addEditNodeFormModel.value = {}
  275. addEditNodeFormModal.value = true
  276. }
  277. //保存节点信息
  278. const addEditNodeFormLoading = ref(false)
  279. const addEditNodeFormModalSave = async () => {
  280. const validate = await formValidate(addEditNodeFormRef.value)
  281. if (validate) {
  282. addEditNodeFormLoading.value = true
  283. //发起请求
  284. const { error, code, msg } = await dataApi.submitClassification({
  285. ...addEditNodeFormModel.value,
  286. projectId: projectId.value,
  287. contractId: contractId.value,
  288. })
  289. //处理数据
  290. addEditNodeFormLoading.value = false
  291. if (!error && code === 200) {
  292. window?.$message?.success('操作成功')
  293. addEditNodeFormModal.value = false
  294. await queryClassification()
  295. } else {
  296. window?.$message?.error(msg)
  297. }
  298. addEditFormLoading.value = false
  299. addEditNodeFormLoading.value = false
  300. }
  301. }
  302. //关闭分类编辑弹窗
  303. const addEditNodeFormModalClose = () => {
  304. addEditNodeFormModal.value = false
  305. }
  306. //删除分类
  307. const delClassification = async (item) => {
  308. //删除请求
  309. const { error, code, msg } = await dataApi.removeField({
  310. projectId: projectId.value,
  311. contractId: contractId.value,
  312. id: item.id,
  313. })
  314. //处理数据
  315. if (!error && code === 200) {
  316. window?.$message?.success('操作成功')
  317. await queryClassification()
  318. } else {
  319. window?.$message?.error(msg)
  320. }
  321. }
  322. //新增/编辑
  323. const addEditFormModal = ref(false)
  324. const addFormModalClick = () => {
  325. const { id } = menuItem.value
  326. addEditFormModel.value = {
  327. classId: id,
  328. }
  329. addEditFormModal.value = true
  330. }
  331. const editFormModalClick = () => {
  332. const keys = tableCheckedKeys.value
  333. if (keys.length === 1) {
  334. addEditFormModel.value = { ...keys[0] }
  335. addEditFormModal.value = true
  336. } else if (keys.length > 1) {
  337. window?.$message?.warning('只能选择一条数据编辑')
  338. }
  339. }
  340. const addEditFormModalClose = () => {
  341. addEditFormModal.value = false
  342. }
  343. //新增/编辑 表单
  344. const addEditFormRef = ref(null)
  345. const addEditFormModel = ref({})
  346. const addEditFormRules = {
  347. sievePoreSize: {
  348. required: true,
  349. trigger: 'blur',
  350. message: '请输入筛孔尺寸',
  351. },
  352. standard: {
  353. required: true,
  354. trigger: 'blur',
  355. message: '请输入标准',
  356. },
  357. upperLimit: {
  358. required: true,
  359. trigger: 'blur',
  360. message: '请输入上限',
  361. },
  362. lowerLimit: {
  363. required: true,
  364. trigger: 'blur',
  365. message: '请输入下限',
  366. },
  367. maxLimitBoundary: {
  368. required: true,
  369. trigger: 'blur',
  370. message: '请输入限制区界限最大',
  371. },
  372. minLimitBoundary: {
  373. required: true,
  374. trigger: 'blur',
  375. message: '请输入限制区界限最小',
  376. },
  377. maxLimitControl: {
  378. required: true,
  379. trigger: 'blur',
  380. message: '请输入控制点界限最小',
  381. },
  382. minLimitControl: {
  383. required: true,
  384. trigger: 'blur',
  385. message: '请输入标准',
  386. },
  387. }
  388. //新增/编辑 保存
  389. const addEditFormLoading = ref(false)
  390. const addEditFormClick = async () => {
  391. const validate = await formValidate(addEditFormRef.value)
  392. if (validate) {
  393. addEditFormLoading.value = true
  394. //发起请求
  395. const { error, code, msg } = await dataApi.submitForm({
  396. ...addEditFormModel.value,
  397. projectId: projectId.value,
  398. contractId: contractId.value,
  399. })
  400. //处理数据
  401. addEditFormLoading.value = false
  402. if (!error && code === 200) {
  403. window?.$message?.success('操作成功')
  404. addEditFormModal.value = false
  405. await getTableData()
  406. } else {
  407. window?.$message?.error(msg)
  408. }
  409. }
  410. }
  411. //删除分类
  412. const delNodeModalClick = async (_, resolve) => {
  413. await tableRemoveData()
  414. resolve()
  415. }
  416. //批量删除
  417. const tableRemoveData = async () => {
  418. const rows = tableCheckedKeys.value
  419. if (rows.length > 0) {
  420. const ids = arrToId(rows)
  421. const { error, code, msg } = await dataApi.removeData({
  422. projectId: projectId.value,
  423. contractId: contractId.value,
  424. ids: ids,
  425. })
  426. //处理数据
  427. if (!error && code === 200) {
  428. window?.$message?.success('操作成功')
  429. searchClick()
  430. } else {
  431. window?.$message?.error(msg)
  432. }
  433. }
  434. }
  435. //左右拖动,改变树形结构宽度
  436. const leftWidth = ref(240)
  437. const onmousedown = () => {
  438. const leftNum = isCollapse.value ? 142 : 272
  439. document.onmousemove = (ve) => {
  440. let diffVal = ve.clientX - leftNum
  441. if (diffVal >= 220 && diffVal <= 400) {
  442. leftWidth.value = diffVal
  443. }
  444. }
  445. document.onmouseup = () => {
  446. document.onmousemove = null
  447. document.onmouseup = null
  448. }
  449. }
  450. </script>
  451. <style lang="scss" scoped>
  452. .hc-import-modal-table-box {
  453. position: relative;
  454. height: calc(100% - 228px);
  455. margin-top: 25px;
  456. }
  457. </style>