outside.vue 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787
  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. formModalTitle.value = '编辑'
  485. addEditFormModal.value = true
  486. } else if (keys.length > 1) {
  487. window?.$message?.warning('只能选择一条数据编辑')
  488. }
  489. }
  490. //关闭
  491. const addEditFormModalClose = () => {
  492. addEditFormModal.value = false
  493. addEditFormModel.value = {}
  494. }
  495. //类型tab数据和相关处理
  496. const tabTypeKey = ref('tab1')
  497. const tabTypeTab = ref([
  498. { key: 'tab1', name: '基础信息' },
  499. { key: 'tab2', name: '检查结论' },
  500. ])
  501. const tabTypeChange = (item) => {
  502. tabTypeKey.value = item?.key
  503. }
  504. //新增/编辑 表单
  505. const addEditFormRef = ref(null)
  506. const addEditFormModel = ref({})
  507. const delegationOrderUrlName = ref('')
  508. const recordTableUrlName = ref('')
  509. const reportAttachmentUrlName = ref('')
  510. const addEditFormRules = {
  511. entrustNo: {
  512. required: true,
  513. trigger: 'blur',
  514. message: '请输入编号',
  515. },
  516. reportNo: {
  517. required: true,
  518. trigger: 'blur',
  519. message: '请输入报告编号',
  520. },
  521. entrustCompany: {
  522. required: true,
  523. trigger: 'blur',
  524. message: '请输入委托单位',
  525. },
  526. }
  527. const addEditFormRules2 = {}
  528. //新增/编辑/复制弹窗 保存
  529. const addEditFormLoading = ref(false)
  530. const addEditFormClick = async () => {
  531. let validate
  532. if (addEditFormRef.value !== null) {
  533. validate = await formValidate(addEditFormRef.value)
  534. }
  535. if (validate) {
  536. if (formModalTitle.value === '复制') {
  537. await copyFormApi()
  538. } else {
  539. await submitFormApi()
  540. }
  541. } else if (validate === undefined) {
  542. window?.$message?.warning('请输入表单所需必填项')
  543. }
  544. }
  545. //新增、编辑 提交保存
  546. const submitFormApi = async () => {
  547. addEditFormLoading.value = true
  548. const { error, code } = await dataApi.submitForm({
  549. ...addEditFormModel.value,
  550. projectId: projectId.value,
  551. contractId: contractId.value,
  552. })
  553. //处理数据
  554. addEditFormLoading.value = false
  555. if (!error && code === 200) {
  556. window?.$message?.success('操作成功')
  557. addEditFormModal.value = false
  558. isShowTree.value = false
  559. setTimeout(() => {
  560. isShowTree.value = true
  561. }, 100)
  562. await getTableData()
  563. // window?.location?.reload() //刷新页面
  564. }
  565. }
  566. //复制
  567. const copyTableModalClick = () => {
  568. const rows = tableCheckedKeys.value
  569. if (rows.length === 1) {
  570. addEditFormModel.value = rows[0]
  571. formModalTitle.value = '复制'
  572. addEditFormModal.value = true
  573. } else if (rows.length > 1) {
  574. const ids = arrToId(rows)
  575. batchCopyFormApi(ids)
  576. }
  577. }
  578. //复制提交保存
  579. const copyFormApi = async () => {
  580. addEditFormLoading.value = true
  581. const { error, code } = await dataApi.copyData({
  582. ...addEditFormModel.value,
  583. projectId: projectId.value,
  584. contractId: contractId.value,
  585. })
  586. //处理数据
  587. addEditFormLoading.value = false
  588. if (!error && code === 200) {
  589. window?.$message?.success('操作成功')
  590. addEditFormModal.value = false
  591. await getTableData()
  592. }
  593. }
  594. //批量复制 提交保存
  595. const copyLoading = ref(false)
  596. const batchCopyFormApi = async (ids) => {
  597. copyLoading.value = true
  598. const { error, code } = await dataApi.copyData({
  599. projectId: projectId.value,
  600. contractId: contractId.value,
  601. ids: ids,
  602. })
  603. //处理数据
  604. copyLoading.value = false
  605. if (!error && code === 200) {
  606. window?.$message?.success('操作成功')
  607. await getTableData()
  608. }
  609. }
  610. //删除
  611. const delModalClick = async (_, resolve) => {
  612. await tableRemoveData()
  613. resolve()
  614. }
  615. //批量删除
  616. const tableRemoveData = async () => {
  617. const rows = tableCheckedKeys.value
  618. if (rows.length > 0) {
  619. const ids = arrToId(rows)
  620. //删除请求
  621. const { error, code } = await dataApi.removeData({
  622. projectId: projectId.value,
  623. contractId: contractId.value,
  624. ids: ids,
  625. })
  626. //处理数据
  627. if (!error && code === 200) {
  628. window?.$message?.success('操作成功')
  629. // getTableData()
  630. isShowTree.value = false
  631. setTimeout(() => {
  632. isShowTree.value = true
  633. }, 100)
  634. }
  635. }
  636. }
  637. //关联数据搜索
  638. const searchSampleForm = ref({
  639. current: 1, size: 20, total: 0,
  640. })
  641. //关联进场材料
  642. const linksSampleModal = ref(false)
  643. const linksSampleModalClick = () => {
  644. searchSampleForm.value.current = 1
  645. linksSampleTableData.value = []
  646. linksSampleModal.value = true
  647. }
  648. //树被点击
  649. const sampleTreeClick = ({ data }) => {
  650. searchSampleForm.value.nodeId = data['primaryKeyId'] || ''
  651. searchSampleForm.value.current = 1
  652. getLinksSampleTable()
  653. }
  654. //分页被点击
  655. const pageSampleChange = ({ current, size }) => {
  656. searchSampleForm.value.current = current
  657. searchSampleForm.value.size = size
  658. getLinksSampleTable()
  659. }
  660. //关联进场材料数据
  661. const linksSampleTableColumn = ref([
  662. { key: 'materialName', name: '取样名称' },
  663. { key: 'samplingDate', name: '取样日期' },
  664. { key: 'specificationNumber', name: '样品编号' },
  665. { key: 'specificationModel', name: '规格型号' },
  666. { key: 'materialCount', name: '试样数量' },
  667. { key: 'calculationUnit', name: '计算单位' },
  668. { key: 'proposedPosition', name: '拟用部位' },
  669. { key: 'representativeCount', name: '代表数量' },
  670. { key: 'userName', name: '取样人' },
  671. { key: 'action', name: '操作' },
  672. ])
  673. const linksSampleTableData = ref([])
  674. //获取关联数据
  675. const linksSampleTableLoading = ref(false)
  676. const getLinksSampleTable = async () => {
  677. const { nodeId } = searchSampleForm.value
  678. if (nodeId) {
  679. linksSampleTableLoading.value = true
  680. const { error, code, data } = await samplingApi.queryPage({
  681. ...searchSampleForm.value,
  682. projectId: projectId.value,
  683. contractId: contractId.value,
  684. })
  685. //处理数据
  686. linksSampleTableLoading.value = false
  687. if (!error && code === 200) {
  688. linksSampleTableData.value = getArrValue(data['records'])
  689. searchSampleForm.value.total = data.total || 0
  690. } else {
  691. linksSampleTableData.value = []
  692. searchSampleForm.value.total = 0
  693. }
  694. } else {
  695. window?.$message?.warning('请先选择一个树节点')
  696. }
  697. }
  698. //确认关联
  699. const linksSampleRow = (row) => {
  700. const form = addEditFormModel.value
  701. form.materialName = row.materialName ?? '' //样品名称
  702. form.specificationNumber = row.specificationNumber ?? '' //样品编号
  703. form.materialCount = row.materialCount ?? '' //试样数量
  704. form.userName = row.userName ?? '' //取样人
  705. form.representativeCount = row.representativeCount ?? '' //代表数量
  706. form.samplingDate = row.samplingDate ?? '' //取样日期
  707. form.samplingLocation = row.samplingLocation ?? '' //取样地点
  708. form.batchNumber = row.batchNumber ?? '' //生产批号
  709. form.specificationModel = row.specificationModel ?? '' //规格型号
  710. form.sampleId = row.id //关联ID
  711. //更新数据
  712. addEditFormModel.value = form
  713. }
  714. //关闭关联进场材料
  715. const linksSampleModalClose = () => {
  716. linksSampleModal.value = false
  717. linksSampleTableData.value = []
  718. searchSampleForm.value.current = 1
  719. }
  720. //左右拖动,改变树形结构宽度
  721. const leftWidth = ref(300)
  722. const onmousedown = () => {
  723. const leftNum = isCollapse.value ? 142 : 272
  724. document.onmousemove = (ve) => {
  725. let diffVal = ve.clientX - leftNum
  726. if (diffVal >= 260 && diffVal <= 700) {
  727. leftWidth.value = diffVal
  728. }
  729. }
  730. document.onmouseup = () => {
  731. document.onmousemove = null
  732. document.onmouseup = null
  733. }
  734. }
  735. </script>
  736. <style lang="scss" scoped>
  737. @import "../../../styles/tentative/detect/third.scss";
  738. // :deep.dialog .select-popper{
  739. // position: fixed;
  740. // // top: 100px !important;
  741. // // left: 133px !important;
  742. // }
  743. </style>