outside.vue 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795
  1. <template>
  2. <div class="hc-page-layout-box">
  3. <div :style="`width:${leftWidth}px;`" class="hc-layout-left-box bg-white">
  4. <div class="hc-project-box">
  5. <div class="hc-project-icon-box">
  6. <HcIcon name="stack" />
  7. </div>
  8. <div class="ml-2 project-name-box">
  9. <span class="project-alias">{{ projectInfo.projectName }}</span>
  10. </div>
  11. </div>
  12. <div class="hc-tree-box">
  13. <el-scrollbar>
  14. <HcTreeData
  15. v-if="isShowTree" :auto-expand-keys="thirdTreeKeys" :contract-id="contractId"
  16. :project-id="projectId" type="rightTree" @menu-tap="menuTapClick" @node-tap="wbsElTreeClick"
  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 :scrollbar="false" action-size="lg">
  25. <template #header>
  26. <HcTooltip keys="tentative_detect_third_add">
  27. <el-button :disabled="!thirdTreeKeys" hc-btn type="primary" @click="addFormModalClick">
  28. <HcIcon name="add-circle" />
  29. <span>新增</span>
  30. </el-button>
  31. </HcTooltip>
  32. <HcTooltip keys="tentative_detect_third_edit">
  33. <el-button
  34. :disabled="tableCheckedKeys.length <= 0" hc-btn type="primary" color="#12C060" style="color: white;"
  35. @click="editFormModalClick"
  36. >
  37. <HcIcon name="edit" />
  38. <span>编辑</span>
  39. </el-button>
  40. </HcTooltip>
  41. <HcTooltip keys="tentative_detect_third_copy">
  42. <el-button
  43. :disabled="tableCheckedKeys.length <= 0" :loading="copyLoading" hc-btn
  44. color="#A16222" @click="copyTableModalClick"
  45. >
  46. <HcIcon name="file-copy-2" />
  47. <span>复制</span>
  48. </el-button>
  49. </HcTooltip>
  50. <HcTooltip keys="tentative_detect_third_del">
  51. <el-button v-del-com:[delModalClick] :disabled="tableCheckedKeys.length <= 0" hc-btn color="#e03997">
  52. <HcIcon name="delete-bin-2" />
  53. <span>删除</span>
  54. </el-button>
  55. </HcTooltip>
  56. </template>
  57. <template #search>
  58. <div class="w-40">
  59. <el-input v-model="searchForm.queryName" clearable placeholder="送样人员" />
  60. </div>
  61. <div class="w-40 ml-2">
  62. <el-select v-model="searchForm.queryStatus" clearable placeholder="请选择是否合格">
  63. <el-option
  64. v-for="item in qualifiedData" :key="item.value" :label="item.label"
  65. :value="item.value"
  66. />
  67. </el-select>
  68. </div>
  69. <div class="w-64 ml-2">
  70. <HcDatePicker :dates="betweenTime" clearable @change="betweenTimeUpdate" />
  71. </div>
  72. <div class="w-72 ml-2">
  73. <el-input
  74. v-model="searchForm.queryValue" clearable placeholder="请输入报告编号、委托编号"
  75. @keyup="keyUpEvent"
  76. />
  77. </div>
  78. <div class="ml-2">
  79. <el-button type="primary" @click="searchClick">
  80. <HcIcon name="search-2" />
  81. <span>搜索</span>
  82. </el-button>
  83. </div>
  84. </template>
  85. <HcTable
  86. ref="tableRef" :column="tableColumn" :datas="tableData" :loading="tableLoading"
  87. is-new :index-style="{ width: 60 }" is-check :check-style="{ width: 29 }"
  88. @selection-change="tableSelection"
  89. >
  90. <template #status="{ row }">
  91. <span>{{ row.status === 1 ? '合格' : row.status === 0 ? '不合格' : '' }}</span>
  92. </template>
  93. </HcTable>
  94. <template #action>
  95. <HcPages :pages="searchForm" @change="pageChange" />
  96. </template>
  97. </HcNewCard>
  98. </div>
  99. <!-- 新增/编辑 -->
  100. <hc-new-dialog :is-close="false" :show="addEditFormModal" :title="`${formModalTitle} 第三方试验信息`" is-row-footer widths="70rem" @close="addEditFormModalClose">
  101. <template #extra>
  102. <HcNewSwitch :datas="tabTypeTab" :keys="tabTypeKey" size="default" @change="tabTypeChange" />
  103. </template>
  104. <el-form
  105. v-if="tabTypeKey === 'tab1'" ref="addEditFormRef" :model="addEditFormModel"
  106. :rules="addEditFormRules"
  107. label-width="auto" size="large"
  108. >
  109. <div class="hc-form-item">
  110. <el-form-item label="合同段">
  111. <el-select
  112. v-model="addEditFormModel.contractId" :teleported="false" block
  113. placeholder="请选择合同段" popper-class="select-popper"
  114. >
  115. <el-option
  116. v-for="item in projectInfo?.contractInfoList" :key="item.id"
  117. :label="item.name" :value="item.id"
  118. />
  119. </el-select>
  120. </el-form-item>
  121. <el-form-item label="合格状态">
  122. <el-radio-group v-model="addEditFormModel.status" size="large">
  123. <el-radio :value="0">不合格</el-radio>
  124. <el-radio :value="1">合格</el-radio>
  125. </el-radio-group>
  126. </el-form-item>
  127. </div>
  128. <div class="hc-form-item">
  129. <el-form-item label="委托编号" prop="entrustNo">
  130. <el-input v-model="addEditFormModel.entrustNo" />
  131. </el-form-item>
  132. <el-form-item label="样品名称">
  133. <el-input v-model="addEditFormModel.materialName" />
  134. </el-form-item>
  135. </div>
  136. <div class="hc-form-item">
  137. <el-form-item label="委托单位" prop="entrustCompany">
  138. <el-input v-model="addEditFormModel.entrustCompany" />
  139. </el-form-item>
  140. <el-form-item label="样品编号">
  141. <el-input v-model="addEditFormModel.specificationNumber" />
  142. </el-form-item>
  143. </div>
  144. <div class="hc-form-item">
  145. <el-form-item label="证书编号">
  146. <el-input
  147. v-model="addEditFormModel.testingAgencyCertificateNo"
  148. placeholder="检测机构资质证书编号"
  149. />
  150. </el-form-item>
  151. <el-form-item label="样品数量">
  152. <el-input v-model="addEditFormModel.materialCount" />
  153. </el-form-item>
  154. </div>
  155. <div class="hc-form-item">
  156. <el-form-item label="取样人">
  157. <el-input v-model="addEditFormModel.userName" />
  158. </el-form-item>
  159. <el-form-item label="代表数量">
  160. <el-input v-model="addEditFormModel.representativeCount" />
  161. </el-form-item>
  162. </div>
  163. <div class="hc-form-item">
  164. <el-form-item label="见证人">
  165. <el-input v-model="addEditFormModel.witness" />
  166. </el-form-item>
  167. <el-form-item label="检测机构">
  168. <el-input v-model="addEditFormModel.inspectionOrganization" />
  169. </el-form-item>
  170. </div>
  171. <div class="hc-form-item">
  172. <el-form-item label="送样日期">
  173. <el-date-picker
  174. v-model="addEditFormModel.sampleDeliveryDate" :clearable="false" class="block"
  175. type="date" value-format="YYYY-MM-DD"
  176. />
  177. </el-form-item>
  178. <el-form-item label="产地">
  179. <el-input v-model="addEditFormModel.placeOfOrigin" />
  180. </el-form-item>
  181. </div>
  182. <div class="hc-form-item">
  183. <el-form-item label="取样日期">
  184. <el-date-picker
  185. v-model="addEditFormModel.samplingDate" :clearable="false" class="block"
  186. type="date" value-format="YYYY-MM-DD"
  187. />
  188. </el-form-item>
  189. <el-form-item label="取样地点">
  190. <el-input v-model="addEditFormModel.samplingLocation" />
  191. </el-form-item>
  192. </div>
  193. <div class="hc-form-item">
  194. <el-form-item label="检测日期">
  195. <el-date-picker
  196. v-model="addEditFormModel.testDate" :clearable="false" class="block"
  197. type="date" value-format="YYYY-MM-DD"
  198. />
  199. </el-form-item>
  200. <el-form-item label="生产厂家">
  201. <el-input v-model="addEditFormModel.manufacturer" />
  202. </el-form-item>
  203. </div>
  204. <div class="hc-form-item">
  205. <el-form-item label="报告日期">
  206. <el-date-picker
  207. v-model="addEditFormModel.reportDate" :clearable="false" class="block"
  208. type="date" value-format="YYYY-MM-DD"
  209. />
  210. </el-form-item>
  211. <el-form-item label="生产批号">
  212. <el-input v-model="addEditFormModel.batchNumber" />
  213. </el-form-item>
  214. </div>
  215. <div class="hc-form-item">
  216. <el-form-item label="报告编号" prop="reportNo">
  217. <el-input v-model="addEditFormModel.reportNo" />
  218. </el-form-item>
  219. <el-form-item label="工程部位">
  220. <el-input v-model="addEditFormModel.projectPosition" />
  221. </el-form-item>
  222. </div>
  223. <div class="hc-form-item">
  224. <el-form-item label="试验类型">
  225. <el-input v-model="addEditFormModel.trialType" />
  226. </el-form-item>
  227. <el-form-item label="规格型号">
  228. <el-input v-model="addEditFormModel.specificationModel" />
  229. </el-form-item>
  230. </div>
  231. <el-form-item label="委托单附件">
  232. <FormItemUpload v-model="addEditFormModel.delegationOrderUrl" action="upload-file" :file-name="addEditFormModel.delegationOrderUrlName" />
  233. </el-form-item>
  234. <el-form-item label="记录表附件">
  235. <FormItemUpload v-model="addEditFormModel.recordTableUrl" action="upload-file" :file-name="addEditFormModel.recordTableUrlName" />
  236. </el-form-item>
  237. <el-form-item label="报告单附件">
  238. <FormItemUpload v-model="addEditFormModel.reportAttachmentUrl" action="upload-file" :file-name="addEditFormModel.reportAttachmentUrlName" />
  239. </el-form-item>
  240. </el-form>
  241. <el-form
  242. v-if="tabTypeKey === 'tab2'" ref="addEditFormRef" :model="addEditFormModel" :rules="addEditFormRules"
  243. label-position="top"
  244. label-width="auto" size="large"
  245. >
  246. <el-form-item label="检测依据">
  247. <el-input
  248. v-model="addEditFormModel.testBasisText" :autosize="{ minRows: 3 }" maxlength="1000"
  249. placeholder="请输入检测依据" show-word-limit type="textarea"
  250. />
  251. </el-form-item>
  252. <el-form-item label="评定标准">
  253. <el-input
  254. v-model="addEditFormModel.evaluationCriteriaText" :autosize="{ minRows: 3 }"
  255. maxlength="1000" placeholder="请输入评定标准" show-word-limit type="textarea"
  256. />
  257. </el-form-item>
  258. <el-form-item label="检测结论">
  259. <el-input
  260. v-model="addEditFormModel.testConclusionText" :autosize="{ minRows: 3 }" maxlength="1000"
  261. placeholder="请输入检测结论" show-word-limit type="textarea"
  262. />
  263. </el-form-item>
  264. <el-form-item label="备注">
  265. <el-input
  266. v-model="addEditFormModel.remarks" :autosize="{ minRows: 3 }" maxlength="1000"
  267. placeholder="请输入备注" show-word-limit type="textarea"
  268. />
  269. </el-form-item>
  270. </el-form>
  271. <template #leftRowFooter>
  272. <el-button hc-btn type="primary" @click="linksSampleModalClick">
  273. <HcIcon name="links" />
  274. <span>选择样品信息</span>
  275. </el-button>
  276. </template>
  277. <template #rightRowFooter>
  278. <el-button size="large" @click="addEditFormModalClose">
  279. <HcIcon name="close" />
  280. <span>取消</span>
  281. </el-button>
  282. <el-button :loading="addEditFormLoading" hc-btn type="primary" @click="addEditFormClick">
  283. <HcIcon name="check" />
  284. <span>确认</span>
  285. </el-button>
  286. </template>
  287. </hc-new-dialog>
  288. <!-- 选择样品信息 -->
  289. <hc-new-dialog v-model="linksSampleModal" is-row-footer is-table title="选择样品信息" widths="70%" @close="linksSampleModalClose">
  290. <div class="hc-links-sample-modal-box">
  291. <div class="hc-links-sample-tree-box">
  292. <el-scrollbar>
  293. <TestTree
  294. :project-id="projectId"
  295. :tenant-id="userInfo?.tenant_id"
  296. :wbs-temp-id="projectInfo?.referenceWbsTemplateIdTrial"
  297. :wbs-type="2"
  298. @node-tap="sampleTreeClick"
  299. />
  300. </el-scrollbar>
  301. </div>
  302. <div class="hc-links-sample-table-box">
  303. <HcTable
  304. :column="linksSampleTableColumn" :datas="linksSampleTableData" is-new
  305. :is-index="false" :loading="linksSampleTableLoading"
  306. >
  307. <template #action="{ row }">
  308. <el-button v-if="addEditFormModel.sampleId === row.id" plain size="small" type="primary">
  309. 已选择
  310. </el-button>
  311. <el-button v-else plain size="small" type="primary" @click="linksSampleRow(row)">
  312. 选择
  313. </el-button>
  314. </template>
  315. </HcTable>
  316. </div>
  317. </div>
  318. <template #leftRowFooter>
  319. <el-button size="large" @click="linksSampleModalClose">
  320. <HcIcon name="close" />
  321. <span>取消</span>
  322. </el-button>
  323. </template>
  324. <template #rightRowFooter>
  325. <HcPages :pages="searchSampleForm" @change="pageSampleChange" />
  326. </template>
  327. </hc-new-dialog>
  328. </div>
  329. </template>
  330. <script setup>
  331. import { onMounted, ref, watch } from 'vue'
  332. import { useAppStore } from '~src/store'
  333. import HcTreeData from './components/HcTreeData.vue'
  334. import FormItemUpload from './components/FormItemUpload.vue'
  335. import TestTree from '../material/components/TestTree.vue'
  336. import { getStoreValue, setStoreValue } from '~src/utils/storage'
  337. import dataApi from '~api/tentative/detect/third'
  338. import samplingApi from '~api/tentative/material/sampling'
  339. import { arrToId, formValidate, getArrValue } from 'js-fast-way'
  340. //变量
  341. const useAppState = useAppStore()
  342. const projectId = ref(useAppState.getProjectId)
  343. const contractId = ref(useAppState.getContractId)
  344. const projectInfo = ref(useAppState.getProjectInfo)
  345. const userInfo = ref(useAppState.getUserInfo)
  346. const isCollapse = ref(useAppState.getCollapse)
  347. //监听
  348. watch(() => [
  349. useAppState.getCollapse,
  350. ], ([Collapse]) => {
  351. isCollapse.value = Collapse
  352. })
  353. //自动展开缓存
  354. const thirdTreeKeys = ref(getStoreValue('outsideTreeKeys'))
  355. //渲染完成
  356. onMounted(() => {
  357. const keys = thirdTreeKeys.value
  358. if (keys) {
  359. searchForm.value.nodeId = keys
  360. getTableData()
  361. }
  362. })
  363. //是否合格
  364. const qualifiedData = ref([
  365. { label: '不合格', value: 0 },
  366. { label: '合格', value: 1 },
  367. ])
  368. //搜索表单
  369. const searchForm = ref({
  370. queryName: null, queryStatus: null, queryValue: null, startTime: null, endTime: null,
  371. current: 1, size: 20, total: 0,
  372. })
  373. //树被点击
  374. const nodeItemInfo = ref({})
  375. const wbsElTreeClick = ({ node, keys }) => {
  376. nodeItemInfo.value = node
  377. //缓存自动展开
  378. thirdTreeKeys.value = keys
  379. setStoreValue('outsideTreeKeys', keys)
  380. //改变搜索表单数据
  381. searchForm.value.nodeId = keys
  382. searchForm.value.current = 1
  383. getTableData()
  384. }
  385. const menuTapClick = ({ data }) => {
  386. if (data?.isData === 1) {
  387. window.$message.warning('当前节点下已有数据,不允许新增节点')
  388. }
  389. }
  390. const isShowTree = ref(true)
  391. //日期时间被选择
  392. const betweenTime = ref(null)
  393. const betweenTimeUpdate = ({ arr }) => {
  394. betweenTime.value = arr
  395. if (arr.length > 0) {
  396. searchForm.value.startTime = arr[0]
  397. searchForm.value.endTime = arr[1]
  398. } else {
  399. searchForm.value.startTime = ''
  400. searchForm.value.endTime = ''
  401. }
  402. }
  403. //回车搜索
  404. const keyUpEvent = (e) => {
  405. if (e.key === 'Enter') {
  406. searchForm.value.current = 1
  407. getTableData()
  408. }
  409. }
  410. //搜索
  411. const searchClick = () => {
  412. searchForm.value.current = 1
  413. getTableData()
  414. }
  415. //分页被点击
  416. const pageChange = ({ current, size }) => {
  417. searchForm.value.current = current
  418. searchForm.value.size = size
  419. getTableData()
  420. }
  421. //表格数据
  422. const tableRef = ref(null)
  423. const tableColumn = ref([
  424. { key: 'entrustNo', name: '委托编号', width: 150 },
  425. { key: 'reportNo', name: '报告编号', width: 150 },
  426. { key: 'specificationNumber', name: '样品编号', width: 150 },
  427. { key: 'trialType', name: '试验类型', width: 150 },
  428. { key: 'materialName', name: '样品名称', width: 150 },
  429. { key: 'specificationModel', name: '规格型号', width: 150 },
  430. { key: 'entrustCompany', name: '委托单位', width: 150 },
  431. { key: 'inspectionOrganization', name: '检测机构', width: 150 },
  432. { key: 'projectPosition', name: '工程部位', width: 150 },
  433. { key: 'userName', name: '送样人', width: 100 },
  434. { key: 'sampleDeliveryDate', name: '送样日期', width: 150 },
  435. { key: 'reportDate', name: '报告日期', width: 150 },
  436. { key: 'status', name: '检测结果', width: 150 },
  437. { key: 'remarks', name: '备注', width: 180 },
  438. ])
  439. const tableData = ref([])
  440. //获取数据
  441. const tableLoading = ref(false)
  442. const getTableData = async () => {
  443. tableLoading.value = true
  444. const { error, code, data } = await dataApi.queryPage({
  445. ...searchForm.value,
  446. projectId: projectId.value,
  447. contractId: contractId.value,
  448. })
  449. //处理数据
  450. tableLoading.value = false
  451. if (!error && code === 200) {
  452. tableData.value = getArrValue(data['records'])
  453. searchForm.value.total = data.total || 0
  454. } else {
  455. tableData.value = []
  456. searchForm.value.total = 0
  457. }
  458. }
  459. //多选
  460. const tableCheckedKeys = ref([])
  461. const tableSelection = (rows) => {
  462. tableCheckedKeys.value = rows
  463. }
  464. //新增/编辑
  465. const addEditFormModal = ref(false)
  466. const formModalTitle = ref('新增')
  467. const addFormModalClick = () => {
  468. const { data } = nodeItemInfo.value
  469. if (data?.id) {
  470. addEditFormModel.value = {
  471. nodeId: data.id, trialType: data.nodeName, status: 1,
  472. }
  473. formModalTitle.value = '新增'
  474. addEditFormModal.value = true
  475. } else {
  476. window.$message.warning('请先选择一个树节点')
  477. }
  478. }
  479. //编辑
  480. const editFormModalClick = () => {
  481. const keys = tableCheckedKeys.value
  482. if (keys.length === 1) {
  483. // addEditFormModel.value = keys[0]
  484. addEditFormModel.value = { ...keys[0] }
  485. formModalTitle.value = '编辑'
  486. addEditFormModal.value = true
  487. } else if (keys.length > 1) {
  488. window?.$message?.warning('只能选择一条数据编辑')
  489. }
  490. }
  491. //关闭
  492. const addEditFormModalClose = () => {
  493. addEditFormModal.value = false
  494. addEditFormModel.value = {}
  495. }
  496. //类型tab数据和相关处理
  497. const tabTypeKey = ref('tab1')
  498. const tabTypeTab = ref([
  499. { key: 'tab1', name: '基础信息' },
  500. { key: 'tab2', name: '检查结论' },
  501. ])
  502. const tabTypeChange = (item) => {
  503. tabTypeKey.value = item?.key
  504. }
  505. //新增/编辑 表单
  506. const addEditFormRef = ref(null)
  507. const addEditFormModel = ref({})
  508. const delegationOrderUrlName = ref('')
  509. const recordTableUrlName = ref('')
  510. const reportAttachmentUrlName = ref('')
  511. const addEditFormRules = {
  512. entrustNo: {
  513. required: true,
  514. trigger: 'blur',
  515. message: '请输入编号',
  516. },
  517. reportNo: {
  518. required: true,
  519. trigger: 'blur',
  520. message: '请输入报告编号',
  521. },
  522. entrustCompany: {
  523. required: true,
  524. trigger: 'blur',
  525. message: '请输入委托单位',
  526. },
  527. }
  528. const addEditFormRules2 = {}
  529. //新增/编辑/复制弹窗 保存
  530. const addEditFormLoading = ref(false)
  531. const addEditFormClick = async () => {
  532. let validate
  533. if (addEditFormRef.value !== null) {
  534. validate = await formValidate(addEditFormRef.value)
  535. }
  536. if (validate) {
  537. if (formModalTitle.value === '复制') {
  538. await copyFormApi()
  539. } else {
  540. await submitFormApi()
  541. }
  542. } else if (validate === undefined) {
  543. window?.$message?.warning('请输入表单所需必填项')
  544. }
  545. }
  546. //新增、编辑 提交保存
  547. const submitFormApi = async () => {
  548. addEditFormLoading.value = true
  549. const { error, code, msg } = await dataApi.submitForm({
  550. ...addEditFormModel.value,
  551. projectId: projectId.value,
  552. contractId: contractId.value,
  553. })
  554. //处理数据
  555. addEditFormLoading.value = false
  556. if (!error && code === 200) {
  557. window?.$message?.success('操作成功')
  558. addEditFormModal.value = false
  559. isShowTree.value = false
  560. setTimeout(() => {
  561. isShowTree.value = true
  562. }, 100)
  563. await getTableData()
  564. // window?.location?.reload() //刷新页面
  565. } else {
  566. window?.$message?.error(msg)
  567. }
  568. }
  569. //复制
  570. const copyTableModalClick = () => {
  571. const rows = tableCheckedKeys.value
  572. if (rows.length === 1) {
  573. addEditFormModel.value = rows[0]
  574. formModalTitle.value = '复制'
  575. addEditFormModal.value = true
  576. } else if (rows.length > 1) {
  577. const ids = arrToId(rows)
  578. batchCopyFormApi(ids)
  579. }
  580. }
  581. //复制提交保存
  582. const copyFormApi = async () => {
  583. addEditFormLoading.value = true
  584. const { error, code, msg } = await dataApi.copyData({
  585. ...addEditFormModel.value,
  586. projectId: projectId.value,
  587. contractId: contractId.value,
  588. })
  589. //处理数据
  590. addEditFormLoading.value = false
  591. if (!error && code === 200) {
  592. window?.$message?.success('操作成功')
  593. addEditFormModal.value = false
  594. await getTableData()
  595. } else {
  596. window?.$message?.error(msg)
  597. }
  598. }
  599. //批量复制 提交保存
  600. const copyLoading = ref(false)
  601. const batchCopyFormApi = async (ids) => {
  602. copyLoading.value = true
  603. const { error, code, msg } = await dataApi.copyData({
  604. projectId: projectId.value,
  605. contractId: contractId.value,
  606. ids: ids,
  607. })
  608. //处理数据
  609. copyLoading.value = false
  610. if (!error && code === 200) {
  611. window?.$message?.success('操作成功')
  612. await getTableData()
  613. } else {
  614. window?.$message?.error(msg)
  615. }
  616. }
  617. //删除
  618. const delModalClick = async (_, resolve) => {
  619. await tableRemoveData()
  620. resolve()
  621. }
  622. //批量删除
  623. const tableRemoveData = async () => {
  624. const rows = tableCheckedKeys.value
  625. if (rows.length > 0) {
  626. const ids = arrToId(rows)
  627. //删除请求
  628. const { error, code, msg } = await dataApi.removeData({
  629. projectId: projectId.value,
  630. contractId: contractId.value,
  631. ids: ids,
  632. })
  633. //处理数据
  634. if (!error && code === 200) {
  635. window?.$message?.success('操作成功')
  636. // getTableData()
  637. isShowTree.value = false
  638. setTimeout(() => {
  639. isShowTree.value = true
  640. }, 100)
  641. } else {
  642. window?.$message?.error(msg)
  643. }
  644. }
  645. }
  646. //关联数据搜索
  647. const searchSampleForm = ref({
  648. current: 1, size: 20, total: 0,
  649. })
  650. //关联进场材料
  651. const linksSampleModal = ref(false)
  652. const linksSampleModalClick = () => {
  653. searchSampleForm.value.current = 1
  654. linksSampleTableData.value = []
  655. linksSampleModal.value = true
  656. }
  657. //树被点击
  658. const sampleTreeClick = ({ data }) => {
  659. searchSampleForm.value.nodeId = data['primaryKeyId'] || ''
  660. searchSampleForm.value.current = 1
  661. getLinksSampleTable()
  662. }
  663. //分页被点击
  664. const pageSampleChange = ({ current, size }) => {
  665. searchSampleForm.value.current = current
  666. searchSampleForm.value.size = size
  667. getLinksSampleTable()
  668. }
  669. //关联进场材料数据
  670. const linksSampleTableColumn = ref([
  671. { key: 'materialName', name: '取样名称' },
  672. { key: 'samplingDate', name: '取样日期' },
  673. { key: 'specificationNumber', name: '样品编号' },
  674. { key: 'specificationModel', name: '规格型号' },
  675. { key: 'materialCount', name: '试样数量' },
  676. { key: 'calculationUnit', name: '计算单位' },
  677. { key: 'proposedPosition', name: '拟用部位' },
  678. { key: 'representativeCount', name: '代表数量' },
  679. { key: 'userName', name: '取样人' },
  680. { key: 'action', name: '操作' },
  681. ])
  682. const linksSampleTableData = ref([])
  683. //获取关联数据
  684. const linksSampleTableLoading = ref(false)
  685. const getLinksSampleTable = async () => {
  686. const { nodeId } = searchSampleForm.value
  687. if (nodeId) {
  688. linksSampleTableLoading.value = true
  689. const { error, code, data } = await samplingApi.queryPage({
  690. ...searchSampleForm.value,
  691. projectId: projectId.value,
  692. contractId: contractId.value,
  693. })
  694. //处理数据
  695. linksSampleTableLoading.value = false
  696. if (!error && code === 200) {
  697. linksSampleTableData.value = getArrValue(data['records'])
  698. searchSampleForm.value.total = data.total || 0
  699. } else {
  700. linksSampleTableData.value = []
  701. searchSampleForm.value.total = 0
  702. }
  703. } else {
  704. window?.$message?.warning('请先选择一个树节点')
  705. }
  706. }
  707. //确认关联
  708. const linksSampleRow = (row) => {
  709. const form = addEditFormModel.value
  710. form.materialName = row.materialName ?? '' //样品名称
  711. form.specificationNumber = row.specificationNumber ?? '' //样品编号
  712. form.materialCount = row.materialCount ?? '' //试样数量
  713. form.userName = row.userName ?? '' //取样人
  714. form.representativeCount = row.representativeCount ?? '' //代表数量
  715. form.samplingDate = row.samplingDate ?? '' //取样日期
  716. form.samplingLocation = row.samplingLocation ?? '' //取样地点
  717. form.batchNumber = row.batchNumber ?? '' //生产批号
  718. form.specificationModel = row.specificationModel ?? '' //规格型号
  719. form.sampleId = row.id //关联ID
  720. //更新数据
  721. addEditFormModel.value = form
  722. }
  723. //关闭关联进场材料
  724. const linksSampleModalClose = () => {
  725. linksSampleModal.value = false
  726. linksSampleTableData.value = []
  727. searchSampleForm.value.current = 1
  728. }
  729. //左右拖动,改变树形结构宽度
  730. const leftWidth = ref(300)
  731. const onmousedown = () => {
  732. const leftNum = isCollapse.value ? 142 : 272
  733. document.onmousemove = (ve) => {
  734. let diffVal = ve.clientX - leftNum
  735. if (diffVal >= 260 && diffVal <= 700) {
  736. leftWidth.value = diffVal
  737. }
  738. }
  739. document.onmouseup = () => {
  740. document.onmousemove = null
  741. document.onmouseup = null
  742. }
  743. }
  744. </script>
  745. <style lang="scss" scoped>
  746. @import "../../../styles/tentative/detect/third.scss";
  747. // :deep.dialog .select-popper{
  748. // position: fixed;
  749. // // top: 100px !important;
  750. // // left: 133px !important;
  751. // }
  752. </style>