approach.vue 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706
  1. <template>
  2. <div class="hc-page-layout-box">
  3. <div class="hc-layout-left-box menu" :style="'width:' + leftWidth + 'px;'">
  4. <div class="hc-menu-header-box">
  5. <div class="text-xl name">设备分类</div>
  6. <HcTooltip keys="tentative_device_approach_menu_add">
  7. <el-button type="primary" hc-btn _icon size="small" @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 :props="menusProps" :datas="menus" :keys="menuKey" :menus="contextMenu" @change="menuChange" @menuTap="contextMenuClick"/>
  15. </el-scrollbar>
  16. </div>
  17. <!--左右拖动-->
  18. <div class="horizontal-drag-line" @mousedown="onmousedown"/>
  19. </div>
  20. <div class="hc-page-content-box">
  21. <HcCard>
  22. <template #header>
  23. <HcTooltip keys="tentative_device_approach_add">
  24. <el-button type="primary" hc-btn @click="addFormModalClick">
  25. <HcIcon name="add-circle"/>
  26. <span>新增</span>
  27. </el-button>
  28. </HcTooltip>
  29. <HcTooltip keys="tentative_device_approach_edit">
  30. <el-button hc-btn :disabled="tableCheckedKeys.length <= 0" @click="editFormModalClick">
  31. <HcIcon name="edit"/>
  32. <span>编辑</span>
  33. </el-button>
  34. </HcTooltip>
  35. <HcTooltip keys="tentative_device_approach_del">
  36. <el-button hc-btn :disabled="tableCheckedKeys.length <= 0" @click="delTableModalClick">
  37. <HcIcon name="delete-bin-2"/>
  38. <span>删除</span>
  39. </el-button>
  40. </HcTooltip>
  41. <HcTooltip keys="tentative_device_approach_printer">
  42. <el-button hc-btn :disabled="tableCheckedKeys.length <= 0" :loading="printerLoading" @click="printerClick">
  43. <HcIcon name="printer"/>
  44. <span>打印</span>
  45. </el-button>
  46. </HcTooltip>
  47. <HcTooltip keys="tentative_device_approach_import">
  48. <el-button hc-btn @click="importModalClick">
  49. <HcIcon name="folder-upload"/>
  50. <span>导入</span>
  51. </el-button>
  52. </HcTooltip>
  53. </template>
  54. <template #search>
  55. <div class="w-32">
  56. <el-select v-model="searchForm.isCalibration" placeholder="是否需要效验" clearable>
  57. <el-option label="是" :value="1"/>
  58. <el-option label="否" :value="0"/>
  59. </el-select>
  60. </div>
  61. <div class="w-32 ml-2">
  62. <el-select v-model="searchForm.status" placeholder="状态" clearable>
  63. <el-option label="启用中" :value="1"/>
  64. <el-option label="已停用" :value="0"/>
  65. </el-select>
  66. </div>
  67. <div class="w-64 ml-2">
  68. <HcDatePicker :dates="betweenTime" clearable @change="betweenTimeUpdate"/>
  69. </div>
  70. <div class="w-72 ml-2">
  71. <el-input v-model="searchForm.queryValue" placeholder="请输入设备名称\设备型号查询" clearable @keyup="keyUpEvent"/>
  72. </div>
  73. <div class="ml-2">
  74. <el-button type="primary" @click="searchClick">
  75. <HcIcon name="search-2"/>
  76. <span>搜索</span>
  77. </el-button>
  78. </div>
  79. </template>
  80. <HcTable ref="tableRef" :column="tableColumn" :datas="tableData" :loading="tableLoading" isCheck @selection-change="tableSelection">
  81. <template #status="{row}">
  82. {{row.status === 1?'启用中':'已停用'}}
  83. </template>
  84. <template #isCalibration="{row}">
  85. {{row.isCalibration === 1?'是':'否'}}
  86. </template>
  87. </HcTable>
  88. <template #action>
  89. <HcPages :pages="searchForm" @change="pageChange"/>
  90. </template>
  91. </HcCard>
  92. </div>
  93. <!--新增/编辑 节点-->
  94. <HcDialog :show="addEditNodeFormModal" :title="`${addEditNodeFormModel.id?'编辑':'新增'}分类`" widths="30rem" :loading="addEditNodeFormLoading" @save="addEditNodeFormModalSave" @close="addEditNodeFormModalClose">
  95. <el-form ref="addEditNodeFormRef" :model="addEditNodeFormModel" :rules="addEditNodeFormRules" label-width="auto" label-position="top" size="large">
  96. <el-form-item class="mb-0" label="分类名称" prop="className">
  97. <el-input v-model="addEditNodeFormModel.className" placeholder="请输入分类名称"/>
  98. </el-form-item>
  99. </el-form>
  100. </HcDialog>
  101. <!--新增/编辑-->
  102. <HcDialog :show="addEditFormModal" :title="`${addEditFormModel.id?'编辑':'新增'}设备信息`" widths="50rem" :loading="addEditFormLoading" @close="addEditFormModalClose" @save="addEditFormClick">
  103. <el-form ref="addEditFormRef" :model="addEditFormModel" :rules="addEditFormRules" label-width="auto" size="large">
  104. <div class="hc-form-item">
  105. <el-form-item label="设备名称" prop="deviceName">
  106. <el-input v-model="addEditFormModel.deviceName"/>
  107. </el-form-item>
  108. <el-form-item label="进场日期">
  109. <el-date-picker type="date" v-model="addEditFormModel.mobilizationDate" class="block" value-format="YYYY-MM-DD" :clearable="false"/>
  110. </el-form-item>
  111. </div>
  112. <div class="hc-form-item">
  113. <el-form-item label="设备分类" prop="deviceClassId">
  114. <el-select v-model="addEditFormModel.deviceClassId" block>
  115. <el-option v-for="item in typeData" :label="item.className" :value="item.id"/>
  116. </el-select>
  117. </el-form-item>
  118. <el-form-item label="测量范围">
  119. <el-input v-model="addEditFormModel.measuringRange"/>
  120. </el-form-item>
  121. </div>
  122. <div class="hc-form-item">
  123. <el-form-item label="设备编号" prop="deviceNumber">
  124. <el-input v-model="addEditFormModel.deviceNumber"/>
  125. </el-form-item>
  126. <el-form-item label="精准度">
  127. <el-input v-model="addEditFormModel.accuracy"/>
  128. </el-form-item>
  129. </div>
  130. <div class="hc-form-item">
  131. <el-form-item label="设备型号">
  132. <el-input v-model="addEditFormModel.deviceModel"/>
  133. </el-form-item>
  134. <el-form-item label="效验周期">
  135. <HcCounter v-model="addEditFormModel.calibrationCycle" text="(月)" size="large" block/>
  136. </el-form-item>
  137. </div>
  138. <div class="hc-form-item">
  139. <el-form-item label="生产厂家">
  140. <el-input v-model="addEditFormModel.manufacturer"/>
  141. </el-form-item>
  142. <el-form-item label="最近效验时间">
  143. <el-date-picker type="date" v-model="addEditFormModel.lastCalibrationTime" class="block" value-format="YYYY-MM-DD" :clearable="false"/>
  144. </el-form-item>
  145. </div>
  146. <div class="hc-form-item">
  147. <el-form-item label="出厂日期">
  148. <el-date-picker type="date" v-model="addEditFormModel.factoryDate" class="block" value-format="YYYY-MM-DD" :clearable="false"/>
  149. </el-form-item>
  150. <el-form-item label="状态">
  151. <el-select v-model="addEditFormModel.status" placeholder="状态" block>
  152. <el-option label="启用中" :value="1"/>
  153. <el-option label="已停用" :value="0"/>
  154. </el-select>
  155. </el-form-item>
  156. </div>
  157. <div class="hc-form-item">
  158. <el-form-item label="出厂编号">
  159. <el-input v-model="addEditFormModel.factoryNumber"/>
  160. </el-form-item>
  161. <el-form-item label="管理人员">
  162. <hcAutoComplete v-model="addEditFormModel.managerName" :datas="userListData" keys="userName" placeholder="请选择或输入试验人员名称"/>
  163. </el-form-item>
  164. </div>
  165. <div class="hc-form-item">
  166. <el-form-item label="设备采集编号">
  167. <el-input v-model="addEditFormModel.equipmentAcquisitionNumber"/>
  168. </el-form-item>
  169. <el-form-item label="是否需要效验">
  170. <el-select v-model="addEditFormModel.isCalibration" block disabled>
  171. <el-option label="是" :value="1"/>
  172. <el-option label="否" :value="0"/>
  173. </el-select>
  174. </el-form-item>
  175. </div>
  176. <el-form-item label="备注">
  177. <el-input v-model="addEditFormModel.remarks" type="textarea" placeholder="备注" :autosize="{ minRows: 3}"/>
  178. </el-form-item>
  179. </el-form>
  180. </HcDialog>
  181. <!--导入-->
  182. <HcDialog :show="importModal" title="导入设备数据" widths="70rem" isTable isFooterCenter :loading="importModalLoading" @save="importModalYesClick" @close="importModalClose">
  183. <div class="text-orange mb-6">
  184. <span>请先下载模板模板表格 (</span>
  185. <span class="text-link" @click="downloadImportClick">范例试验设备文件</span>
  186. <span>) ,按模板样式编辑试验容器后,在点击“选择文件”按钮选择编辑好的文件,点击确认即可导入成功!</span>
  187. </div>
  188. <HcDragUpload action="mobilization/read-excel" @progress="uploadprogress" @finished="uploadFinished"/>
  189. <div class="hc-import-modal-table-box">
  190. <HcTable ref="tableImportRef" :column="tableColumn" :datas="tableImportData" :loading="tableImportLoading" isCheck @selection-change="tableImportSelection">
  191. <template #status="{row}">
  192. {{row.status == 1?'启用中':'已停用'}}
  193. </template>
  194. <template #isCalibration="{row}">
  195. {{row.isCalibration == 1?'是':'否'}}
  196. </template>
  197. </HcTable>
  198. </div>
  199. </HcDialog>
  200. </div>
  201. </template>
  202. <script setup>
  203. import {ref, onMounted, watch} from "vue";
  204. import {useAppStore} from "~src/store";
  205. import {HcIsButton} from "~src/plugins/IsButtons";
  206. import HcDragUpload from "./components/HcDragUpload.vue"
  207. import approachApi from "~api/tentative/device/approach";
  208. import {formValidate, getArrValue} from "vue-utils-plus"
  209. import {getContractUserList} from "~api/other";
  210. import {getClassList,deviceClassListInit} from "~api/tentative";
  211. //初始变量
  212. const useAppState = useAppStore()
  213. const projectId = ref(useAppState.getProjectId);
  214. const contractId = ref(useAppState.getContractId);
  215. const isCollapse = ref(useAppState.getCollapse)
  216. //监听
  217. watch(() => [
  218. useAppState.getCollapse
  219. ], ([Collapse]) => {
  220. isCollapse.value = Collapse
  221. })
  222. //渲染完成
  223. onMounted(() => {
  224. deviceClassListInitdata()
  225. getClassListData()
  226. setContextMenu()
  227. getTableData()
  228. getUserListData()
  229. })
  230. //获取用户列表
  231. const userListData = ref([])
  232. const getUserListData = async () => {
  233. const { data } = await getContractUserList({
  234. contractId: contractId.value
  235. })
  236. userListData.value = getArrValue(data)
  237. }
  238. //左侧菜单
  239. const menuKey = ref('0')
  240. const menuItem = ref({})
  241. const menusProps = ref({
  242. key: 'id',
  243. label: 'className'
  244. })
  245. //获取菜单数据
  246. const menus = ref([]);
  247. const typeData = ref([]);
  248. const getClassListData = async () => {
  249. const { data } = await getClassList({
  250. contractId: contractId.value
  251. })
  252. const arr = getArrValue(data)
  253. typeData.value = arr
  254. menus.value = [{id: '0', className: '全部', isNoContextMenu: true}, ...arr]
  255. }
  256. //初始化设备分类
  257. const deviceClassListInitdata= async () => {
  258. const { data } = await deviceClassListInit({
  259. contractId: contractId.value
  260. })
  261. }
  262. //菜单被点击
  263. const menuChange = (item) => {
  264. menuItem.value = item
  265. menuKey.value = item?.id
  266. searchForm.value.deviceClassId = item?.id
  267. searchForm.value.current = 1;
  268. getTableData()
  269. }
  270. //菜单的右键菜单
  271. const contextMenu = ref([])
  272. const setContextMenu = () => {
  273. let newArr = [];
  274. if (HcIsButton('tentative_device_approach_menu_edit')) {
  275. newArr.push({icon: 'draft', label: '编辑分类', key: "edit"})
  276. }
  277. if (HcIsButton('tentative_device_approach_menu_del')) {
  278. newArr.push({icon: 'delete-bin', label: '删除分类', key: "del"})
  279. }
  280. contextMenu.value = newArr
  281. }
  282. //菜单的右键菜单被点击
  283. const contextMenuClick = ({key, item}) => {
  284. if (key === 'edit') {
  285. addEditNodeFormModel.value = item
  286. addEditNodeFormModal.value = true
  287. } else if (key === 'del') {
  288. delNodeModalClick(item.id)
  289. }
  290. }
  291. //搜索表单
  292. const searchForm = ref({
  293. deviceClassId: '', isCalibration: null, status: null, startTime: null, endTime: null, queryValue: null,
  294. current: 1, size: 20, total: 0
  295. })
  296. //日期时间被选择
  297. const betweenTime = ref(null)
  298. const betweenTimeUpdate = ({arr}) => {
  299. betweenTime.value = arr
  300. if (arr.length > 0) {
  301. searchForm.value.startTime = arr[0]
  302. searchForm.value.endTime = arr[1]
  303. }else{
  304. searchForm.value.startTime = ''
  305. searchForm.value.endTime = ''
  306. }
  307. }
  308. //回车搜索
  309. const keyUpEvent = (e) => {
  310. if (e.key === "Enter") {
  311. searchForm.value.current = 1;
  312. getTableData()
  313. }
  314. }
  315. //搜索
  316. const searchClick = () => {
  317. searchForm.value.current = 1;
  318. console.log( searchForm.value,' searchForm.value');
  319. getTableData()
  320. }
  321. //分页被点击
  322. const pageChange = ({current, size}) => {
  323. searchForm.value.current = current
  324. searchForm.value.size = size
  325. getTableData()
  326. }
  327. //表格数据
  328. const tableRef = ref(null)
  329. const tableColumn = ref([
  330. {key:'deviceName', name: '设备名称', width: '200'},
  331. {key:'deviceClassName', name: '设备分类', width: '160'},
  332. {key:'deviceNumber', name: '设备编号', width: '160'},
  333. {key:'deviceModel', name: '设备型号', width: '180'},
  334. {key:'manufacturer', name: '生产厂家', width: '200'},
  335. {key:'factoryDate', name: '出厂日期', width: '160'},
  336. {key:'factoryNumber', name: '出厂编号', width: '160'},
  337. {key:'mobilizationDate', name: '进场日期', width: '160'},
  338. {key:'measuringRange', name: '测量范围', width: '120'},
  339. {key:'accuracy', name: '精准度', width: '120'},
  340. {key:'calibrationCycle', name: '校准周期(月)', width: '120'},
  341. {key:'lastCalibrationTime', name: '最近效验时间', width: '160'},
  342. {key:'status', name: '状态', width: '100'},
  343. {key:'isCalibration', name: '是否需要效验', width: '120'},
  344. {key:'equipmentAcquisitionNumber', name: '设备采集编号', width: '160'},
  345. {key:'managerName', name: '设备管理人员', width: '120'},
  346. {key:'remarks', name: '备注', width: '160'},
  347. ])
  348. const tableData = ref([])
  349. //获取数据
  350. const tableLoading = ref(false)
  351. const getTableData = async () => {
  352. console.log( searchForm.value,' searchForm.value');
  353. tableLoading.value = true
  354. const { error, code, data } = await approachApi.queryPage({
  355. projectId: projectId.value,
  356. contractId: contractId.value,
  357. ...searchForm.value,
  358. })
  359. //处理数据
  360. tableLoading.value = false
  361. if (!error && code === 200) {
  362. tableData.value = getArrValue(data['records'])
  363. searchForm.value.total = data.total || 0
  364. } else {
  365. tableData.value = []
  366. searchForm.value.total = 0
  367. }
  368. }
  369. //多选
  370. const tableCheckedKeys = ref([]);
  371. const tableSelection = (rows) => {
  372. tableCheckedKeys.value = rows
  373. }
  374. //新增/编辑 分类
  375. const addEditNodeFormRef = ref(null)
  376. const addEditNodeFormModal = ref(false)
  377. //分类表单
  378. const addEditNodeFormModel = ref({
  379. className: ''
  380. })
  381. const addEditNodeFormRules = {
  382. className: {
  383. required: true,
  384. trigger: 'blur',
  385. message: "请输入分类名称"
  386. },
  387. }
  388. //新增分类弹窗打开
  389. const addEditNodeFormModalClick = () => {
  390. addEditNodeFormModel.value = {}
  391. addEditNodeFormModal.value = true
  392. }
  393. //保存节点信息
  394. const addEditNodeFormLoading = ref(false)
  395. const addEditNodeFormModalSave = async () => {
  396. const validate = await formValidate(addEditNodeFormRef.value)
  397. if (validate) {
  398. addEditNodeFormLoading.value = true
  399. const { error, code } = await approachApi.getClassSubmit({
  400. ...addEditNodeFormModel.value,
  401. projectId: projectId.value,
  402. contractId: contractId.value
  403. })
  404. //处理数据
  405. // addEditNodeFormLoading.value = false
  406. if (!error && code === 200) {
  407. window?.$message?.success('操作成功')
  408. addEditNodeFormModal.value = false
  409. addEditNodeFormLoading.value = false
  410. await getClassListData()
  411. }
  412. }
  413. }
  414. //关闭分类编辑弹窗
  415. const addEditNodeFormModalClose = () => {
  416. addEditNodeFormModel.value = {}
  417. addEditNodeFormModal.value = false
  418. }
  419. //删除分类
  420. const delNodeModalClick = (id) => {
  421. window?.$messageBox?.alert('请谨慎考虑后,确认是否需要删除?', '删除提醒', {
  422. showCancelButton: true,
  423. confirmButtonText: '确认删除',
  424. cancelButtonText: '取消',
  425. type: 'warning',
  426. callback: (action) => {
  427. if (action === 'confirm') {
  428. setClassRemove(id)
  429. }
  430. }
  431. })
  432. }
  433. //删除分类
  434. const setClassRemove = async (id) => {
  435. const { error, code } = await approachApi.setClassRemove({
  436. projectId: projectId.value,
  437. contractId: contractId.value,
  438. id: id
  439. })
  440. //处理数据
  441. if (!error && code === 200) {
  442. window?.$message?.success('操作成功')
  443. await getClassListData()
  444. }
  445. }
  446. //删除表格数据
  447. const delTableModalClick = () => {
  448. window?.$messageBox?.alert('请谨慎考虑后,确认是否需要删除?', '删除提醒', {
  449. showCancelButton: true,
  450. confirmButtonText: '确认删除',
  451. cancelButtonText: '取消',
  452. type: 'warning',
  453. callback: (action) => {
  454. if (action === 'confirm') {
  455. tableRemoveData()
  456. }
  457. }
  458. })
  459. }
  460. //批量删除
  461. const tableRemoveData = async () => {
  462. const rows = tableCheckedKeys.value
  463. if (rows.length > 0 ) {
  464. const ids = rowsToId(rows)
  465. //删除请求
  466. const { error, code } = await approachApi.removeData({
  467. contractId: contractId.value,
  468. ids: ids,
  469. })
  470. //处理数据
  471. if (!error && code === 200) {
  472. window?.$message?.success('操作成功')
  473. searchClick()
  474. }
  475. }
  476. }
  477. //打印
  478. const printerLoading = ref(false)
  479. const printerClick = async () => {
  480. const rows = tableCheckedKeys.value
  481. if (rows.length > 0 ) {
  482. printerLoading.value = true
  483. const ids = rowsToId(rows)
  484. //删除请求
  485. const { error, code, data } = await approachApi.exportPdf({
  486. projectId: projectId.value,
  487. contractId: contractId.value,
  488. ids: ids,
  489. })
  490. //处理数据
  491. printerLoading.value = false
  492. if (!error && code === 200) {
  493. window.open(data,'_blank')
  494. }
  495. }
  496. }
  497. //导入
  498. const importModal = ref(false)
  499. const importModalClick = () => {
  500. tableImportData.value = []
  501. importModal.value = true
  502. }
  503. //上传进度
  504. const uploadprogress = (res) => {
  505. importModalLoading.value = res
  506. tableImportLoading.value = res
  507. }
  508. //上传完成
  509. const uploadFinished = (data) => {
  510. tableImportData.value = getArrValue(data)
  511. }
  512. //确认导入
  513. const importModalLoading = ref(false)
  514. const importModalYesClick = () => {
  515. const keys = tableImportKeys.value
  516. if (keys.length > 0) {
  517. samplingRecord(keys)
  518. } else {
  519. window?.$message?.warning('请先勾选要导入的数据')
  520. }
  521. }
  522. //导入数据保存
  523. const samplingRecord = async (keys) => {
  524. importModalLoading.value = true
  525. const { error, code } = await approachApi.samplingRecord({
  526. projectId: projectId.value,
  527. contractId: contractId.value,
  528. list: keys
  529. })
  530. //处理数据
  531. importModalLoading.value = false
  532. if (!error && code === 200) {
  533. importModal.value = false
  534. getTableData()
  535. } else {
  536. importModal.value = false
  537. }
  538. }
  539. //关闭导入
  540. const importModalClose = () => {
  541. importModal.value = false
  542. }
  543. //表格数据
  544. const tableImportRef = ref(null)
  545. const tableImportLoading = ref(false)
  546. const tableImportData = ref([])
  547. //多选
  548. const tableImportKeys = ref([]);
  549. const tableImportSelection = (rows) => {
  550. tableImportKeys.value = rows
  551. }
  552. //新增/编辑 表单
  553. const addEditFormRef = ref(null)
  554. const addEditFormModel = ref({})
  555. const addEditFormRules = {
  556. deviceName: {
  557. required: true,
  558. trigger: 'blur',
  559. message: "请输入设备名称"
  560. },
  561. deviceClassId: {
  562. required: true,
  563. trigger: 'blur',
  564. message: "请选择设备分类"
  565. },
  566. deviceNumber: {
  567. required: true,
  568. trigger: 'blur',
  569. message: "请输入设备编号"
  570. },
  571. }
  572. //新增 设备信息
  573. const addEditFormModal = ref(false)
  574. const addFormModalClick = () => {
  575. addEditFormModel.value = {
  576. isCalibration: 0,
  577. status: 1,
  578. }
  579. addEditFormModal.value = true
  580. }
  581. //编辑 设备信息
  582. const editFormModalClick = () => {
  583. const keys = tableCheckedKeys.value
  584. if (keys.length === 1) {
  585. addEditFormModel.value = keys[0]
  586. addEditFormModal.value = true
  587. } else if (keys.length > 1) {
  588. window?.$message?.warning('只能选择一条数据编辑')
  589. }
  590. }
  591. //关闭新增/编辑的弹窗
  592. const addEditFormModalClose = () => {
  593. addEditFormModal.value = false
  594. addEditFormModel.value = {
  595. isCalibration: 0,
  596. status: 1
  597. }
  598. }
  599. //新增/编辑 保存
  600. const addEditFormLoading = ref(false)
  601. const addEditFormClick = async () => {
  602. const validate = await formValidate(addEditFormRef.value)
  603. if (validate) {
  604. addEditFormLoading.value = true
  605. const { error, code } = await approachApi.submitForm({
  606. ...addEditFormModel.value,
  607. projectId: projectId.value,
  608. contractId: contractId.value
  609. })
  610. //处理数据
  611. // addEditFormLoading.value = false
  612. if (!error && code === 200) {
  613. window?.$message?.success('操作成功')
  614. addEditFormModal.value = false
  615. addEditFormLoading.value = false
  616. await getTableData()
  617. }
  618. addEditFormLoading.value = false
  619. }
  620. }
  621. //下载导入模板
  622. const downloadImportClick = () => {
  623. window.open('https://bladex-test-info.oss-cn-chengdu.aliyuncs.com//upload/20221109/2be4f32d07f9dd3e43479038b0c4aa2d.xlsx','_blank')
  624. }
  625. //拼接ID
  626. const rowsToId = (rows) => {
  627. return rows.map((obj) => {
  628. return obj.id;
  629. }).join(",")
  630. }
  631. //左右拖动,改变树形结构宽度
  632. const leftWidth = ref(240);
  633. const onmousedown = () => {
  634. const leftNum = isCollapse.value ? 142 : 272
  635. document.onmousemove = (ve) => {
  636. let diffVal = ve.clientX - leftNum;
  637. if(diffVal >= 220 && diffVal <= 400) {
  638. leftWidth.value = diffVal;
  639. }
  640. }
  641. document.onmouseup = () => {
  642. document.onmousemove = null;
  643. document.onmouseup = null;
  644. }
  645. }
  646. </script>
  647. <style lang="scss" scoped>
  648. .hc-import-modal-table-box {
  649. position: relative;
  650. height: calc(100% - 228px);
  651. margin-top: 25px;
  652. }
  653. </style>