outside.vue 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796
  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="project-name-box ml-2">
  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="ml-2 w-40">
  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="ml-2 w-64">
  70. <HcDatePicker :dates="betweenTime" clearable @change="betweenTimeUpdate" />
  71. </div>
  72. <div class="ml-2 w-72">
  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. :entrust="1"
  299. @node-tap="sampleTreeClick"
  300. />
  301. </el-scrollbar>
  302. </div>
  303. <div class="hc-links-sample-table-box">
  304. <HcTable
  305. :column="linksSampleTableColumn" :datas="linksSampleTableData" is-new
  306. :is-index="false" :loading="linksSampleTableLoading"
  307. >
  308. <template #action="{ row }">
  309. <el-button v-if="addEditFormModel.sampleId === row.id" plain size="small" type="primary">
  310. 已选择
  311. </el-button>
  312. <el-button v-else plain size="small" type="primary" @click="linksSampleRow(row)">
  313. 选择
  314. </el-button>
  315. </template>
  316. </HcTable>
  317. </div>
  318. </div>
  319. <template #leftRowFooter>
  320. <el-button size="large" @click="linksSampleModalClose">
  321. <HcIcon name="close" />
  322. <span>取消</span>
  323. </el-button>
  324. </template>
  325. <template #rightRowFooter>
  326. <HcPages :pages="searchSampleForm" @change="pageSampleChange" />
  327. </template>
  328. </hc-new-dialog>
  329. </div>
  330. </template>
  331. <script setup>
  332. import { onMounted, ref, watch } from 'vue'
  333. import { useAppStore } from '~src/store'
  334. import HcTreeData from './components/HcTreeData.vue'
  335. import FormItemUpload from './components/FormItemUpload.vue'
  336. import TestTree from '../material/components/TestTree.vue'
  337. import { getStoreValue, setStoreValue } from '~src/utils/storage'
  338. import dataApi from '~api/tentative/detect/third'
  339. import samplingApi from '~api/tentative/material/sampling'
  340. import { arrToId, formValidate, getArrValue } from 'js-fast-way'
  341. //变量
  342. const useAppState = useAppStore()
  343. const projectId = ref(useAppState.getProjectId)
  344. const contractId = ref(useAppState.getContractId)
  345. const projectInfo = ref(useAppState.getProjectInfo)
  346. const userInfo = ref(useAppState.getUserInfo)
  347. const isCollapse = ref(useAppState.getCollapse)
  348. //监听
  349. watch(() => [
  350. useAppState.getCollapse,
  351. ], ([Collapse]) => {
  352. isCollapse.value = Collapse
  353. })
  354. //自动展开缓存
  355. const thirdTreeKeys = ref(getStoreValue('outsideTreeKeys'))
  356. //渲染完成
  357. onMounted(() => {
  358. const keys = thirdTreeKeys.value
  359. if (keys) {
  360. searchForm.value.nodeId = keys
  361. getTableData()
  362. }
  363. })
  364. //是否合格
  365. const qualifiedData = ref([
  366. { label: '不合格', value: 0 },
  367. { label: '合格', value: 1 },
  368. ])
  369. //搜索表单
  370. const searchForm = ref({
  371. queryName: null, queryStatus: null, queryValue: null, startTime: null, endTime: null,
  372. current: 1, size: 20, total: 0,
  373. })
  374. //树被点击
  375. const nodeItemInfo = ref({})
  376. const wbsElTreeClick = ({ node, keys }) => {
  377. nodeItemInfo.value = node
  378. //缓存自动展开
  379. thirdTreeKeys.value = keys
  380. setStoreValue('outsideTreeKeys', keys)
  381. //改变搜索表单数据
  382. searchForm.value.nodeId = keys
  383. searchForm.value.current = 1
  384. getTableData()
  385. }
  386. const menuTapClick = ({ data }) => {
  387. if (data?.isData === 1) {
  388. window.$message.warning('当前节点下已有数据,不允许新增节点')
  389. }
  390. }
  391. const isShowTree = ref(true)
  392. //日期时间被选择
  393. const betweenTime = ref(null)
  394. const betweenTimeUpdate = ({ arr }) => {
  395. betweenTime.value = arr
  396. if (arr.length > 0) {
  397. searchForm.value.startTime = arr[0]
  398. searchForm.value.endTime = arr[1]
  399. } else {
  400. searchForm.value.startTime = ''
  401. searchForm.value.endTime = ''
  402. }
  403. }
  404. //回车搜索
  405. const keyUpEvent = (e) => {
  406. if (e.key === 'Enter') {
  407. searchForm.value.current = 1
  408. getTableData()
  409. }
  410. }
  411. //搜索
  412. const searchClick = () => {
  413. searchForm.value.current = 1
  414. getTableData()
  415. }
  416. //分页被点击
  417. const pageChange = ({ current, size }) => {
  418. searchForm.value.current = current
  419. searchForm.value.size = size
  420. getTableData()
  421. }
  422. //表格数据
  423. const tableRef = ref(null)
  424. const tableColumn = ref([
  425. { key: 'entrustNo', name: '委托编号', width: 150 },
  426. { key: 'reportNo', name: '报告编号', width: 150 },
  427. { key: 'specificationNumber', name: '样品编号', width: 150 },
  428. { key: 'trialType', name: '试验类型', width: 150 },
  429. { key: 'materialName', name: '样品名称', width: 150 },
  430. { key: 'specificationModel', name: '规格型号', width: 150 },
  431. { key: 'entrustCompany', name: '委托单位', width: 150 },
  432. { key: 'inspectionOrganization', name: '检测机构', width: 150 },
  433. { key: 'projectPosition', name: '工程部位', width: 150 },
  434. { key: 'userName', name: '送样人', width: 100 },
  435. { key: 'sampleDeliveryDate', name: '送样日期', width: 150 },
  436. { key: 'reportDate', name: '报告日期', width: 150 },
  437. { key: 'status', name: '检测结果', width: 150 },
  438. { key: 'remarks', name: '备注', width: 180 },
  439. ])
  440. const tableData = ref([])
  441. //获取数据
  442. const tableLoading = ref(false)
  443. const getTableData = async () => {
  444. tableLoading.value = true
  445. const { error, code, data } = await dataApi.queryPage({
  446. ...searchForm.value,
  447. projectId: projectId.value,
  448. contractId: contractId.value,
  449. })
  450. //处理数据
  451. tableLoading.value = false
  452. if (!error && code === 200) {
  453. tableData.value = getArrValue(data['records'])
  454. searchForm.value.total = data.total || 0
  455. } else {
  456. tableData.value = []
  457. searchForm.value.total = 0
  458. }
  459. }
  460. //多选
  461. const tableCheckedKeys = ref([])
  462. const tableSelection = (rows) => {
  463. tableCheckedKeys.value = rows
  464. }
  465. //新增/编辑
  466. const addEditFormModal = ref(false)
  467. const formModalTitle = ref('新增')
  468. const addFormModalClick = () => {
  469. const { data } = nodeItemInfo.value
  470. if (data?.id) {
  471. addEditFormModel.value = {
  472. nodeId: data.id, trialType: data.nodeName, status: 1,
  473. }
  474. formModalTitle.value = '新增'
  475. addEditFormModal.value = true
  476. } else {
  477. window.$message.warning('请先选择一个树节点')
  478. }
  479. }
  480. //编辑
  481. const editFormModalClick = () => {
  482. const keys = tableCheckedKeys.value
  483. if (keys.length === 1) {
  484. // addEditFormModel.value = keys[0]
  485. addEditFormModel.value = { ...keys[0] }
  486. formModalTitle.value = '编辑'
  487. addEditFormModal.value = true
  488. } else if (keys.length > 1) {
  489. window?.$message?.warning('只能选择一条数据编辑')
  490. }
  491. }
  492. //关闭
  493. const addEditFormModalClose = () => {
  494. addEditFormModal.value = false
  495. addEditFormModel.value = {}
  496. }
  497. //类型tab数据和相关处理
  498. const tabTypeKey = ref('tab1')
  499. const tabTypeTab = ref([
  500. { key: 'tab1', name: '基础信息' },
  501. { key: 'tab2', name: '检查结论' },
  502. ])
  503. const tabTypeChange = (item) => {
  504. tabTypeKey.value = item?.key
  505. }
  506. //新增/编辑 表单
  507. const addEditFormRef = ref(null)
  508. const addEditFormModel = ref({})
  509. const delegationOrderUrlName = ref('')
  510. const recordTableUrlName = ref('')
  511. const reportAttachmentUrlName = ref('')
  512. const addEditFormRules = {
  513. entrustNo: {
  514. required: true,
  515. trigger: 'blur',
  516. message: '请输入编号',
  517. },
  518. reportNo: {
  519. required: true,
  520. trigger: 'blur',
  521. message: '请输入报告编号',
  522. },
  523. entrustCompany: {
  524. required: true,
  525. trigger: 'blur',
  526. message: '请输入委托单位',
  527. },
  528. }
  529. const addEditFormRules2 = {}
  530. //新增/编辑/复制弹窗 保存
  531. const addEditFormLoading = ref(false)
  532. const addEditFormClick = async () => {
  533. let validate
  534. if (addEditFormRef.value !== null) {
  535. validate = await formValidate(addEditFormRef.value)
  536. }
  537. if (validate) {
  538. if (formModalTitle.value === '复制') {
  539. await copyFormApi()
  540. } else {
  541. await submitFormApi()
  542. }
  543. } else if (validate === undefined) {
  544. window?.$message?.warning('请输入表单所需必填项')
  545. }
  546. }
  547. //新增、编辑 提交保存
  548. const submitFormApi = async () => {
  549. addEditFormLoading.value = true
  550. const { error, code, msg } = await dataApi.submitForm({
  551. ...addEditFormModel.value,
  552. projectId: projectId.value,
  553. contractId: contractId.value,
  554. })
  555. //处理数据
  556. addEditFormLoading.value = false
  557. if (!error && code === 200) {
  558. window?.$message?.success('操作成功')
  559. addEditFormModal.value = false
  560. isShowTree.value = false
  561. setTimeout(() => {
  562. isShowTree.value = true
  563. }, 100)
  564. await getTableData()
  565. // window?.location?.reload() //刷新页面
  566. } else {
  567. window?.$message?.error(msg)
  568. }
  569. }
  570. //复制
  571. const copyTableModalClick = () => {
  572. const rows = tableCheckedKeys.value
  573. if (rows.length === 1) {
  574. addEditFormModel.value = rows[0]
  575. formModalTitle.value = '复制'
  576. addEditFormModal.value = true
  577. } else if (rows.length > 1) {
  578. const ids = arrToId(rows)
  579. batchCopyFormApi(ids)
  580. }
  581. }
  582. //复制提交保存
  583. const copyFormApi = async () => {
  584. addEditFormLoading.value = true
  585. const { error, code, msg } = await dataApi.copyData({
  586. ...addEditFormModel.value,
  587. projectId: projectId.value,
  588. contractId: contractId.value,
  589. })
  590. //处理数据
  591. addEditFormLoading.value = false
  592. if (!error && code === 200) {
  593. window?.$message?.success('操作成功')
  594. addEditFormModal.value = false
  595. await getTableData()
  596. } else {
  597. window?.$message?.error(msg)
  598. }
  599. }
  600. //批量复制 提交保存
  601. const copyLoading = ref(false)
  602. const batchCopyFormApi = async (ids) => {
  603. copyLoading.value = true
  604. const { error, code, msg } = await dataApi.copyData({
  605. projectId: projectId.value,
  606. contractId: contractId.value,
  607. ids: ids,
  608. })
  609. //处理数据
  610. copyLoading.value = false
  611. if (!error && code === 200) {
  612. window?.$message?.success('操作成功')
  613. await getTableData()
  614. } else {
  615. window?.$message?.error(msg)
  616. }
  617. }
  618. //删除
  619. const delModalClick = async (_, resolve) => {
  620. await tableRemoveData()
  621. resolve()
  622. }
  623. //批量删除
  624. const tableRemoveData = async () => {
  625. const rows = tableCheckedKeys.value
  626. if (rows.length > 0) {
  627. const ids = arrToId(rows)
  628. //删除请求
  629. const { error, code, msg } = await dataApi.removeData({
  630. projectId: projectId.value,
  631. contractId: contractId.value,
  632. ids: ids,
  633. })
  634. //处理数据
  635. if (!error && code === 200) {
  636. window?.$message?.success('操作成功')
  637. // getTableData()
  638. isShowTree.value = false
  639. setTimeout(() => {
  640. isShowTree.value = true
  641. }, 100)
  642. } else {
  643. window?.$message?.error(msg)
  644. }
  645. }
  646. }
  647. //关联数据搜索
  648. const searchSampleForm = ref({
  649. current: 1, size: 20, total: 0,
  650. })
  651. //关联进场材料
  652. const linksSampleModal = ref(false)
  653. const linksSampleModalClick = () => {
  654. searchSampleForm.value.current = 1
  655. linksSampleTableData.value = []
  656. linksSampleModal.value = true
  657. }
  658. //树被点击
  659. const sampleTreeClick = ({ data }) => {
  660. searchSampleForm.value.nodeId = data['primaryKeyId'] || ''
  661. searchSampleForm.value.current = 1
  662. getLinksSampleTable()
  663. }
  664. //分页被点击
  665. const pageSampleChange = ({ current, size }) => {
  666. searchSampleForm.value.current = current
  667. searchSampleForm.value.size = size
  668. getLinksSampleTable()
  669. }
  670. //关联进场材料数据
  671. const linksSampleTableColumn = ref([
  672. { key: 'materialName', name: '取样名称' },
  673. { key: 'samplingDate', name: '取样日期' },
  674. { key: 'specificationNumber', name: '样品编号' },
  675. { key: 'specificationModel', name: '规格型号' },
  676. { key: 'materialCount', name: '试样数量' },
  677. { key: 'calculationUnit', name: '计算单位' },
  678. { key: 'proposedPosition', name: '拟用部位' },
  679. { key: 'representativeCount', name: '代表数量' },
  680. { key: 'userName', name: '取样人' },
  681. { key: 'action', name: '操作' },
  682. ])
  683. const linksSampleTableData = ref([])
  684. //获取关联数据
  685. const linksSampleTableLoading = ref(false)
  686. const getLinksSampleTable = async () => {
  687. const { nodeId } = searchSampleForm.value
  688. if (nodeId) {
  689. linksSampleTableLoading.value = true
  690. const { error, code, data } = await samplingApi.queryPage({
  691. ...searchSampleForm.value,
  692. projectId: projectId.value,
  693. contractId: contractId.value,
  694. })
  695. //处理数据
  696. linksSampleTableLoading.value = false
  697. if (!error && code === 200) {
  698. linksSampleTableData.value = getArrValue(data['records'])
  699. searchSampleForm.value.total = data.total || 0
  700. } else {
  701. linksSampleTableData.value = []
  702. searchSampleForm.value.total = 0
  703. }
  704. } else {
  705. window?.$message?.warning('请先选择一个树节点')
  706. }
  707. }
  708. //确认关联
  709. const linksSampleRow = (row) => {
  710. const form = addEditFormModel.value
  711. form.materialName = row.materialName ?? '' //样品名称
  712. form.specificationNumber = row.specificationNumber ?? '' //样品编号
  713. form.materialCount = row.materialCount ?? '' //试样数量
  714. form.userName = row.userName ?? '' //取样人
  715. form.representativeCount = row.representativeCount ?? '' //代表数量
  716. form.samplingDate = row.samplingDate ?? '' //取样日期
  717. form.samplingLocation = row.samplingLocation ?? '' //取样地点
  718. form.batchNumber = row.batchNumber ?? '' //生产批号
  719. form.specificationModel = row.specificationModel ?? '' //规格型号
  720. form.sampleId = row.id //关联ID
  721. //更新数据
  722. addEditFormModel.value = form
  723. }
  724. //关闭关联进场材料
  725. const linksSampleModalClose = () => {
  726. linksSampleModal.value = false
  727. linksSampleTableData.value = []
  728. searchSampleForm.value.current = 1
  729. }
  730. //左右拖动,改变树形结构宽度
  731. const leftWidth = ref(300)
  732. const onmousedown = () => {
  733. const leftNum = isCollapse.value ? 142 : 272
  734. document.onmousemove = (ve) => {
  735. let diffVal = ve.clientX - leftNum
  736. if (diffVal >= 260 && diffVal <= 700) {
  737. leftWidth.value = diffVal
  738. }
  739. }
  740. document.onmouseup = () => {
  741. document.onmousemove = null
  742. document.onmouseup = null
  743. }
  744. }
  745. </script>
  746. <style lang="scss" scoped>
  747. @import "../../../styles/tentative/detect/third.scss";
  748. // :deep.dialog .select-popper{
  749. // position: fixed;
  750. // // top: 100px !important;
  751. // // left: 133px !important;
  752. // }
  753. </style>