sieve.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496
  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" @menuTap="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 :disabled="tableCheckedKeys.length <= 0" hc-btn color="#e03997" @click="delNodeModalClick">
  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. <HcDialog
  68. :loading="addEditNodeFormLoading" :show="addEditNodeFormModal" :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. </HcDialog>
  80. <!-- 新增/编辑 -->
  81. <HcDialog
  82. :loading="addEditFormLoading" :show="addEditFormModal" :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. </HcDialog>
  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 { delMessageV2 } from '~com/message/index.js'
  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. delMessageV2(async (action, instance, done) => {
  196. if (action === 'confirm') {
  197. instance.confirmButtonLoading = true
  198. delClassification(item)
  199. instance.confirmButtonLoading = false
  200. done()
  201. } else {
  202. done()
  203. }
  204. })
  205. }
  206. }
  207. //搜索表单
  208. const searchForm = ref({
  209. classId: null, queryValue: null,
  210. current: 1, size: 20, total: 0,
  211. })
  212. //回车搜索
  213. const keyUpEvent = (e) => {
  214. if (e.key === 'Enter') {
  215. searchForm.value.current = 1
  216. getTableData()
  217. }
  218. }
  219. //搜索
  220. const searchClick = () => {
  221. searchForm.value.current = 1
  222. getTableData()
  223. }
  224. //分页被点击
  225. const pageChange = ({ current, size }) => {
  226. searchForm.value.current = current
  227. searchForm.value.size = size
  228. getTableData()
  229. }
  230. //表格数据
  231. const tableRef = ref(null)
  232. const tableColumn = ref([
  233. { key: 'sievePoreSize', name: '筛孔尺寸' },
  234. { key: 'lowerLimit', name: '下限' },
  235. { key: 'upperLimit', name: '上限' },
  236. { key: 'standard', name: '标准' },
  237. { key: 'maxLimitBoundary', name: '限制区最大' },
  238. { key: 'minLimitBoundary', name: '限制区最小' },
  239. { key: 'maxLimitControl', name: '控制点最大' },
  240. { key: 'minLimitControl', name: '控制点最小' },
  241. ])
  242. const tableData = ref([])
  243. //获取数据
  244. const tableLoading = ref(false)
  245. const getTableData = async () => {
  246. tableLoading.value = true
  247. const { error, code, data } = await dataApi.queryPage({
  248. projectId: projectId.value,
  249. contractId: contractId.value,
  250. ...searchForm.value,
  251. })
  252. //处理数据
  253. tableLoading.value = false
  254. if (!error && code === 200) {
  255. tableData.value = getArrValue(data['records'])
  256. searchForm.value.total = data.total || 0
  257. } else {
  258. tableData.value = []
  259. searchForm.value.total = 0
  260. }
  261. }
  262. //多选
  263. const tableCheckedKeys = ref([])
  264. const tableSelection = (rows) => {
  265. tableCheckedKeys.value = rows
  266. }
  267. //新增/编辑 分类
  268. const addEditNodeFormModal = ref(false)
  269. const addEditNodeFormRef = ref(null)
  270. const addEditNodeFormModel = ref({ name: '' })
  271. const addEditNodeFormRules = {
  272. name: {
  273. required: true,
  274. trigger: 'blur',
  275. message: '请输入分类名称',
  276. },
  277. }
  278. //新增分类
  279. const addEditNodeFormModalClick = () => {
  280. addEditNodeFormModel.value = {}
  281. addEditNodeFormModal.value = true
  282. }
  283. //保存节点信息
  284. const addEditNodeFormLoading = ref(false)
  285. const addEditNodeFormModalSave = async () => {
  286. const validate = await formValidate(addEditNodeFormRef.value)
  287. if (validate) {
  288. addEditNodeFormLoading.value = true
  289. //发起请求
  290. const { error, code } = await dataApi.submitClassification({
  291. ...addEditNodeFormModel.value,
  292. projectId: projectId.value,
  293. contractId: contractId.value,
  294. })
  295. //处理数据
  296. if (!error && code === 200) {
  297. window?.$message?.success('操作成功')
  298. addEditNodeFormModal.value = false
  299. addEditNodeFormLoading.value = false
  300. await queryClassification()
  301. }
  302. addEditFormLoading.value = false
  303. addEditNodeFormLoading.value = false
  304. }
  305. }
  306. //关闭分类编辑弹窗
  307. const addEditNodeFormModalClose = () => {
  308. addEditNodeFormModal.value = false
  309. }
  310. //删除分类
  311. const delClassification = async (item) => {
  312. //删除请求
  313. const { error, code } = await dataApi.removeField({
  314. projectId: projectId.value,
  315. contractId: contractId.value,
  316. id: item.id,
  317. })
  318. //处理数据
  319. if (!error && code === 200) {
  320. window?.$message?.success('操作成功')
  321. await queryClassification()
  322. }
  323. }
  324. //新增/编辑
  325. const addEditFormModal = ref(false)
  326. const addFormModalClick = () => {
  327. const { id } = menuItem.value
  328. addEditFormModel.value = {
  329. classId: id,
  330. }
  331. addEditFormModal.value = true
  332. }
  333. const editFormModalClick = () => {
  334. const keys = tableCheckedKeys.value
  335. if (keys.length === 1) {
  336. addEditFormModel.value = keys[0]
  337. addEditFormModal.value = true
  338. } else if (keys.length > 1) {
  339. window?.$message?.warning('只能选择一条数据编辑')
  340. }
  341. }
  342. const addEditFormModalClose = () => {
  343. addEditFormModal.value = false
  344. }
  345. //新增/编辑 表单
  346. const addEditFormRef = ref(null)
  347. const addEditFormModel = ref({})
  348. const addEditFormRules = {
  349. sievePoreSize: {
  350. required: true,
  351. trigger: 'blur',
  352. message: '请输入筛孔尺寸',
  353. },
  354. standard: {
  355. required: true,
  356. trigger: 'blur',
  357. message: '请输入标准',
  358. },
  359. upperLimit: {
  360. required: true,
  361. trigger: 'blur',
  362. message: '请输入上限',
  363. },
  364. lowerLimit: {
  365. required: true,
  366. trigger: 'blur',
  367. message: '请输入下限',
  368. },
  369. maxLimitBoundary: {
  370. required: true,
  371. trigger: 'blur',
  372. message: '请输入限制区界限最大',
  373. },
  374. minLimitBoundary: {
  375. required: true,
  376. trigger: 'blur',
  377. message: '请输入限制区界限最小',
  378. },
  379. maxLimitControl: {
  380. required: true,
  381. trigger: 'blur',
  382. message: '请输入控制点界限最小',
  383. },
  384. minLimitControl: {
  385. required: true,
  386. trigger: 'blur',
  387. message: '请输入标准',
  388. },
  389. }
  390. //新增/编辑 保存
  391. const addEditFormLoading = ref(false)
  392. const addEditFormClick = async () => {
  393. const validate = await formValidate(addEditFormRef.value)
  394. if (validate) {
  395. addEditFormLoading.value = true
  396. //发起请求
  397. const { error, code } = await dataApi.submitForm({
  398. ...addEditFormModel.value,
  399. projectId: projectId.value,
  400. contractId: contractId.value,
  401. })
  402. //处理数据
  403. if (!error && code === 200) {
  404. window?.$message?.success('操作成功')
  405. addEditFormModal.value = false
  406. addEditFormLoading.value = false
  407. await getTableData()
  408. }
  409. }
  410. }
  411. //删除分类
  412. const delNodeModalClick = () => {
  413. delMessageV2(async (action, instance, done) => {
  414. if (action === 'confirm') {
  415. instance.confirmButtonLoading = true
  416. tableRemoveData()
  417. instance.confirmButtonLoading = false
  418. done()
  419. } else {
  420. done()
  421. }
  422. })
  423. }
  424. //批量删除
  425. const tableRemoveData = async () => {
  426. const rows = tableCheckedKeys.value
  427. if (rows.length > 0) {
  428. const ids = arrToId(rows)
  429. const { error, code } = await dataApi.removeData({
  430. projectId: projectId.value,
  431. contractId: contractId.value,
  432. ids: ids,
  433. })
  434. //处理数据
  435. if (!error && code === 200) {
  436. window?.$message?.success('操作成功')
  437. searchClick()
  438. }
  439. }
  440. }
  441. //左右拖动,改变树形结构宽度
  442. const leftWidth = ref(240)
  443. const onmousedown = () => {
  444. const leftNum = isCollapse.value ? 142 : 272
  445. document.onmousemove = (ve) => {
  446. let diffVal = ve.clientX - leftNum
  447. if (diffVal >= 220 && diffVal <= 400) {
  448. leftWidth.value = diffVal
  449. }
  450. }
  451. document.onmouseup = () => {
  452. document.onmousemove = null
  453. document.onmouseup = null
  454. }
  455. }
  456. </script>
  457. <style lang="scss" scoped>
  458. .hc-import-modal-table-box {
  459. position: relative;
  460. height: calc(100% - 228px);
  461. margin-top: 25px;
  462. }
  463. </style>