approach.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702
  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} 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. getClassListData()
  225. setContextMenu()
  226. getTableData()
  227. getUserListData()
  228. })
  229. //获取用户列表
  230. const userListData = ref([])
  231. const getUserListData = async () => {
  232. const { data } = await getContractUserList({
  233. contractId: contractId.value
  234. })
  235. userListData.value = getArrValue(data)
  236. }
  237. //左侧菜单
  238. const menuKey = ref('0')
  239. const menuItem = ref({})
  240. const menusProps = ref({
  241. key: 'id',
  242. label: 'className'
  243. })
  244. //获取菜单数据
  245. const menus = ref([]);
  246. const typeData = ref([]);
  247. const getClassListData = async () => {
  248. const { data } = await getClassList({
  249. contractId: contractId.value
  250. })
  251. const arr = getArrValue(data)
  252. typeData.value = arr
  253. menus.value = [{id: '0', className: '全部', isNoContextMenu: true}, ...arr]
  254. }
  255. //菜单被点击
  256. const menuChange = (item) => {
  257. menuItem.value = item
  258. menuKey.value = item?.id
  259. searchForm.value.deviceClassId = item?.id
  260. searchForm.value.current = 1;
  261. getTableData()
  262. }
  263. //菜单的右键菜单
  264. const contextMenu = ref([])
  265. const setContextMenu = () => {
  266. let newArr = [];
  267. if (HcIsButton('tentative_device_approach_menu_edit')) {
  268. newArr.push({icon: 'draft', label: '编辑分类', key: "edit"})
  269. }
  270. if (HcIsButton('tentative_device_approach_menu_del')) {
  271. newArr.push({icon: 'delete-bin', label: '删除分类', key: "del"})
  272. }
  273. contextMenu.value = newArr
  274. }
  275. //菜单的右键菜单被点击
  276. const contextMenuClick = ({key, item}) => {
  277. if (key === 'edit') {
  278. addEditNodeFormModel.value = item
  279. addEditNodeFormModal.value = true
  280. } else if (key === 'del') {
  281. delNodeModalClick(item.id)
  282. }
  283. }
  284. //搜索表单
  285. const searchForm = ref({
  286. deviceClassId: '', isCalibration: null, status: null, startTime: null, endTime: null, queryValue: null,
  287. current: 1, size: 20, total: 0
  288. })
  289. //日期时间被选择
  290. const betweenTime = ref(null)
  291. const betweenTimeUpdate = ({arr}) => {
  292. betweenTime.value = arr
  293. if (arr.length > 0) {
  294. searchForm.value.startTime = arr[0]
  295. searchForm.value.endTime = arr[1]
  296. }else{
  297. searchForm.value.startTime = ''
  298. searchForm.value.endTime = ''
  299. }
  300. }
  301. //回车搜索
  302. const keyUpEvent = (e) => {
  303. if (e.key === "Enter") {
  304. searchForm.value.current = 1;
  305. getTableData()
  306. }
  307. }
  308. //搜索
  309. const searchClick = () => {
  310. searchForm.value.current = 1;
  311. console.log( searchForm.value,' searchForm.value');
  312. getTableData()
  313. }
  314. //分页被点击
  315. const pageChange = ({current, size}) => {
  316. searchForm.value.current = current
  317. searchForm.value.size = size
  318. getTableData()
  319. }
  320. //表格数据
  321. const tableRef = ref(null)
  322. const tableColumn = ref([
  323. {key:'deviceName', name: '设备名称', width: '200'},
  324. {key:'deviceClassName', name: '设备分类', width: '160'},
  325. {key:'deviceNumber', name: '设备编号', width: '160'},
  326. {key:'deviceModel', name: '设备型号', width: '180'},
  327. {key:'manufacturer', name: '生产厂家', width: '200'},
  328. {key:'factoryDate', name: '出厂日期', width: '160'},
  329. {key:'factoryNumber', name: '出厂编号', width: '160'},
  330. {key:'mobilizationDate', name: '进场日期', width: '160'},
  331. {key:'measuringRange', name: '测量范围', width: '120'},
  332. {key:'accuracy', name: '精准度', width: '120'},
  333. {key:'calibrationCycle', name: '校准周期(月)', width: '120'},
  334. {key:'lastCalibrationTime', name: '最近效验时间', width: '160'},
  335. {key:'status', name: '状态', width: '100'},
  336. {key:'isCalibration', name: '是否需要效验', width: '120'},
  337. {key:'equipmentAcquisitionNumber', name: '设备采集编号', width: '160'},
  338. {key:'managerName', name: '设备管理人员', width: '120'},
  339. {key:'remarks', name: '备注', width: '160'},
  340. ])
  341. const tableData = ref([])
  342. //获取数据
  343. const tableLoading = ref(false)
  344. const getTableData = async () => {
  345. console.log( searchForm.value,' searchForm.value');
  346. tableLoading.value = true
  347. const { error, code, data } = await approachApi.queryPage({
  348. projectId: projectId.value,
  349. contractId: contractId.value,
  350. ...searchForm.value,
  351. })
  352. //处理数据
  353. tableLoading.value = false
  354. if (!error && code === 200) {
  355. tableData.value = getArrValue(data['records'])
  356. searchForm.value.total = data.total || 0
  357. } else {
  358. tableData.value = []
  359. searchForm.value.total = 0
  360. }
  361. }
  362. //多选
  363. const tableCheckedKeys = ref([]);
  364. const tableSelection = (rows) => {
  365. tableCheckedKeys.value = rows
  366. }
  367. //新增/编辑 分类
  368. const addEditNodeFormRef = ref(null)
  369. const addEditNodeFormModal = ref(false)
  370. //分类表单
  371. const addEditNodeFormModel = ref({
  372. className: ''
  373. })
  374. const addEditNodeFormRules = {
  375. className: {
  376. required: true,
  377. trigger: 'blur',
  378. message: "请输入分类名称"
  379. },
  380. }
  381. //新增分类弹窗打开
  382. const addEditNodeFormModalClick = () => {
  383. addEditNodeFormModel.value = {}
  384. addEditNodeFormModal.value = true
  385. }
  386. //保存节点信息
  387. const addEditNodeFormLoading = ref(false)
  388. const addEditNodeFormModalSave = async () => {
  389. const validate = await formValidate(addEditNodeFormRef.value)
  390. if (validate) {
  391. addEditNodeFormLoading.value = true
  392. const { error, code } = await approachApi.getClassSubmit({
  393. ...addEditNodeFormModel.value,
  394. projectId: projectId.value,
  395. contractId: contractId.value
  396. })
  397. //处理数据
  398. // addEditNodeFormLoading.value = false
  399. if (!error && code === 200) {
  400. window?.$message?.success('操作成功')
  401. addEditNodeFormModal.value = false
  402. setTimeout(() => {
  403. addEditNodeFormLoading.value = false
  404. }, 1000);
  405. await getClassListData()
  406. }
  407. }
  408. }
  409. //关闭分类编辑弹窗
  410. const addEditNodeFormModalClose = () => {
  411. addEditNodeFormModel.value = {}
  412. addEditNodeFormModal.value = false
  413. }
  414. //删除分类
  415. const delNodeModalClick = (id) => {
  416. window?.$messageBox?.alert('请谨慎考虑后,确认是否需要删除?', '删除提醒', {
  417. showCancelButton: true,
  418. confirmButtonText: '确认删除',
  419. cancelButtonText: '取消',
  420. type: 'warning',
  421. callback: (action) => {
  422. if (action === 'confirm') {
  423. setClassRemove(id)
  424. }
  425. }
  426. })
  427. }
  428. //删除分类
  429. const setClassRemove = async (id) => {
  430. const { error, code } = await approachApi.setClassRemove({
  431. projectId: projectId.value,
  432. contractId: contractId.value,
  433. id: id
  434. })
  435. //处理数据
  436. if (!error && code === 200) {
  437. window?.$message?.success('操作成功')
  438. await getClassListData()
  439. }
  440. }
  441. //删除表格数据
  442. const delTableModalClick = () => {
  443. window?.$messageBox?.alert('请谨慎考虑后,确认是否需要删除?', '删除提醒', {
  444. showCancelButton: true,
  445. confirmButtonText: '确认删除',
  446. cancelButtonText: '取消',
  447. type: 'warning',
  448. callback: (action) => {
  449. if (action === 'confirm') {
  450. tableRemoveData()
  451. }
  452. }
  453. })
  454. }
  455. //批量删除
  456. const tableRemoveData = async () => {
  457. const rows = tableCheckedKeys.value
  458. if (rows.length > 0 ) {
  459. const ids = rowsToId(rows)
  460. //删除请求
  461. const { error, code } = await approachApi.removeData({
  462. contractId: contractId.value,
  463. ids: ids,
  464. })
  465. //处理数据
  466. if (!error && code === 200) {
  467. window?.$message?.success('操作成功')
  468. searchClick()
  469. }
  470. }
  471. }
  472. //打印
  473. const printerLoading = ref(false)
  474. const printerClick = async () => {
  475. const rows = tableCheckedKeys.value
  476. if (rows.length > 0 ) {
  477. printerLoading.value = true
  478. const ids = rowsToId(rows)
  479. //删除请求
  480. const { error, code, data } = await approachApi.exportPdf({
  481. projectId: projectId.value,
  482. contractId: contractId.value,
  483. ids: ids,
  484. })
  485. //处理数据
  486. printerLoading.value = false
  487. if (!error && code === 200) {
  488. window.open(data,'_blank')
  489. }
  490. }
  491. }
  492. //导入
  493. const importModal = ref(false)
  494. const importModalClick = () => {
  495. tableImportData.value = []
  496. importModal.value = true
  497. }
  498. //上传进度
  499. const uploadprogress = (res) => {
  500. importModalLoading.value = res
  501. tableImportLoading.value = res
  502. }
  503. //上传完成
  504. const uploadFinished = (data) => {
  505. tableImportData.value = getArrValue(data)
  506. }
  507. //确认导入
  508. const importModalLoading = ref(false)
  509. const importModalYesClick = () => {
  510. const keys = tableImportKeys.value
  511. if (keys.length > 0) {
  512. samplingRecord(keys)
  513. } else {
  514. window?.$message?.warning('请先勾选要导入的数据')
  515. }
  516. }
  517. //导入数据保存
  518. const samplingRecord = async (keys) => {
  519. importModalLoading.value = true
  520. const { error, code } = await approachApi.samplingRecord({
  521. projectId: projectId.value,
  522. contractId: contractId.value,
  523. list: keys
  524. })
  525. //处理数据
  526. importModalLoading.value = false
  527. if (!error && code === 200) {
  528. importModal.value = false
  529. getTableData()
  530. } else {
  531. importModal.value = false
  532. }
  533. }
  534. //关闭导入
  535. const importModalClose = () => {
  536. importModal.value = false
  537. }
  538. //表格数据
  539. const tableImportRef = ref(null)
  540. const tableImportLoading = ref(false)
  541. const tableImportData = ref([])
  542. //多选
  543. const tableImportKeys = ref([]);
  544. const tableImportSelection = (rows) => {
  545. tableImportKeys.value = rows
  546. }
  547. //新增/编辑 表单
  548. const addEditFormRef = ref(null)
  549. const addEditFormModel = ref({})
  550. const addEditFormRules = {
  551. deviceName: {
  552. required: true,
  553. trigger: 'blur',
  554. message: "请输入设备名称"
  555. },
  556. deviceClassId: {
  557. required: true,
  558. trigger: 'blur',
  559. message: "请选择设备分类"
  560. },
  561. deviceNumber: {
  562. required: true,
  563. trigger: 'blur',
  564. message: "请输入设备编号"
  565. },
  566. }
  567. //新增 设备信息
  568. const addEditFormModal = ref(false)
  569. const addFormModalClick = () => {
  570. addEditFormModel.value = {
  571. isCalibration: 0,
  572. status: 1,
  573. }
  574. addEditFormModal.value = true
  575. }
  576. //编辑 设备信息
  577. const editFormModalClick = () => {
  578. const keys = tableCheckedKeys.value
  579. if (keys.length === 1) {
  580. addEditFormModel.value = keys[0]
  581. addEditFormModal.value = true
  582. } else if (keys.length > 1) {
  583. window?.$message?.warning('只能选择一条数据编辑')
  584. }
  585. }
  586. //关闭新增/编辑的弹窗
  587. const addEditFormModalClose = () => {
  588. addEditFormModal.value = false
  589. addEditFormModel.value = {
  590. isCalibration: 0,
  591. status: 1
  592. }
  593. }
  594. //新增/编辑 保存
  595. const addEditFormLoading = ref(false)
  596. const addEditFormClick = async () => {
  597. const validate = await formValidate(addEditFormRef.value)
  598. if (validate) {
  599. addEditFormLoading.value = true
  600. const { error, code } = await approachApi.submitForm({
  601. ...addEditFormModel.value,
  602. projectId: projectId.value,
  603. contractId: contractId.value
  604. })
  605. //处理数据
  606. // addEditFormLoading.value = false
  607. if (!error && code === 200) {
  608. window?.$message?.success('操作成功')
  609. addEditFormModal.value = false
  610. setTimeout(() => {
  611. addEditFormLoading.value = false
  612. }, 1000);
  613. await getTableData()
  614. }
  615. }
  616. }
  617. //下载导入模板
  618. const downloadImportClick = () => {
  619. window.open('https://bladex-test-info.oss-cn-chengdu.aliyuncs.com//upload/20221109/2be4f32d07f9dd3e43479038b0c4aa2d.xlsx','_blank')
  620. }
  621. //拼接ID
  622. const rowsToId = (rows) => {
  623. return rows.map((obj) => {
  624. return obj.id;
  625. }).join(",")
  626. }
  627. //左右拖动,改变树形结构宽度
  628. const leftWidth = ref(240);
  629. const onmousedown = () => {
  630. const leftNum = isCollapse.value ? 142 : 272
  631. document.onmousemove = (ve) => {
  632. let diffVal = ve.clientX - leftNum;
  633. if(diffVal >= 220 && diffVal <= 400) {
  634. leftWidth.value = diffVal;
  635. }
  636. }
  637. document.onmouseup = () => {
  638. document.onmousemove = null;
  639. document.onmouseup = null;
  640. }
  641. }
  642. </script>
  643. <style lang="scss" scoped>
  644. .hc-import-modal-table-box {
  645. position: relative;
  646. height: calc(100% - 228px);
  647. margin-top: 25px;
  648. }
  649. </style>