approach.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707
  1. <template>
  2. <div class="hc-page-box">
  3. <HcCard>
  4. <template #header>
  5. <HcTooltip keys="tentative_material_approach_add">
  6. <el-button type="primary" hc-btn @click="addFormModalClick">
  7. <HcIcon name="add-circle"/>
  8. <span>新增</span>
  9. </el-button>
  10. </HcTooltip>
  11. <HcTooltip keys="tentative_material_approach_edit">
  12. <el-button hc-btn :disabled="tableCheckedKeys.length <= 0" @click="editFormModalClick">
  13. <HcIcon name="edit"/>
  14. <span>编辑</span>
  15. </el-button>
  16. </HcTooltip>
  17. <HcTooltip keys="tentative_material_approach_copy">
  18. <el-button hc-btn :disabled="tableCheckedKeys.length <= 0" @click="copyTableModalClick">
  19. <HcIcon name="file-copy-2"/>
  20. <span>复制</span>
  21. </el-button>
  22. </HcTooltip>
  23. <HcTooltip keys="tentative_material_approach_del">
  24. <el-button hc-btn :disabled="tableCheckedKeys.length <= 0" @click="delModalClick">
  25. <HcIcon name="delete-bin-2"/>
  26. <span>删除</span>
  27. </el-button>
  28. </HcTooltip>
  29. <HcTooltip keys="tentative_material_approach_printer">
  30. <el-button hc-btn :disabled="tableCheckedKeys.length <= 0" :loading="printerLoading" @click="printerClick">
  31. <HcIcon name="printer"/>
  32. <span>打印</span>
  33. </el-button>
  34. </HcTooltip>
  35. <HcTooltip keys="tentative_material_approach_import">
  36. <el-button hc-btn @click="importModalClick">
  37. <HcIcon name="folder-upload"/>
  38. <span>导入</span>
  39. </el-button>
  40. </HcTooltip>
  41. </template>
  42. <template #search>
  43. <div class="w-40">
  44. <el-select v-model="searchForm.materialType" placeholder="请选择材料类型" clearable>
  45. <el-option v-for="item in typeData" :key="item.value" :label="item['dictValue']" :value="item['dictKey']"/>
  46. </el-select>
  47. </div>
  48. <div class="w-64 ml-2">
  49. <HcDatePicker :dates="betweenTime" clearable @change="betweenTimeUpdate"/>
  50. </div>
  51. <div class="w-72 ml-2">
  52. <el-input v-model="searchForm.queryValue" placeholder="请输入名称、规格、材料编号进行查询" clearable @keyup="keyUpEvent"/>
  53. </div>
  54. <div class="ml-2">
  55. <el-button type="primary" @click="searchClick">
  56. <HcIcon name="search-2"/>
  57. <span>搜索</span>
  58. </el-button>
  59. </div>
  60. </template>
  61. <HcTable ref="tableRef" :column="tableColumn" :datas="tableData" :loading="tableLoading" isCheck @selection-change="tableSelection">
  62. <template #materialType="{row}">{{getRowTableMaterialType(row['materialType'])}}</template>
  63. <template #materialCount="{row}">{{row.materialCount===-1?"":row.materialCount}}</template>
  64. <template #materialPrice="{row}">{{row.materialPrice===-1?"":row.materialPrice}}</template>
  65. <template #action="{row}">
  66. <HcTooltip keys="tentative_material_approach_annex">
  67. <el-button type="primary" size="small" plain @click="viewAttachmentModalClick(row)">附件</el-button>
  68. </HcTooltip>
  69. <HcTooltip keys="tentative_material_approach_sampling">
  70. <el-button type="primary" size="small" plain @click="samplingRecordModalClick(row)">取样记录</el-button>
  71. </HcTooltip>
  72. </template>
  73. </HcTable>
  74. <template #action>
  75. <HcPages :pages="searchForm" @change="pageChange"/>
  76. </template>
  77. </HcCard>
  78. <!--新增/编辑-->
  79. <HcDialog :show="addEditFormModal" :title="`${addEditFormModel.id?'编辑':'新增'}材料进场`" widths="45rem" :loading="addEditFormLoading" @close="addEditFormModalClose" @save="addEditFormClick">
  80. <el-form ref="addEditFormRef" :model="addEditFormModel" :rules="addEditFormRules" label-width="auto" size="large">
  81. <div class="hc-form-item">
  82. <el-form-item label="材料类型" prop="materialType">
  83. <el-select v-model="addEditFormModel.materialType" block>
  84. <el-option v-for="item in typeData" :label="item['dictValue']" :value="item['dictKey']"/>
  85. </el-select>
  86. </el-form-item>
  87. <el-form-item label="材料单价">
  88. <el-input v-model="addEditFormModel.materialPrice"/>
  89. </el-form-item>
  90. </div>
  91. <div class="hc-form-item">
  92. <el-form-item label="材料名称" prop="materialName">
  93. <el-input v-model="addEditFormModel.materialName"/>
  94. </el-form-item>
  95. <el-form-item label="材料数量">
  96. <el-input v-model="addEditFormModel.materialCount" onkeyup="value = value.replace(/^\D*(\d*(?:\.\d{0,2})?).*$/g,'$1')"/>
  97. </el-form-item>
  98. </div>
  99. <div class="hc-form-item">
  100. <el-form-item label="规格型号" prop="specificationModel">
  101. <el-input v-model="addEditFormModel.specificationModel"/>
  102. </el-form-item>
  103. <el-form-item label="计算单位">
  104. <el-input v-model="addEditFormModel.calculationUnit"/>
  105. </el-form-item>
  106. </div>
  107. <div class="hc-form-item">
  108. <el-form-item label="材料编号" prop="materialNumber">
  109. <el-input v-model="addEditFormModel.materialNumber"/>
  110. </el-form-item>
  111. <el-form-item label="生产批号">
  112. <el-input v-model="addEditFormModel.batchNumber"/>
  113. </el-form-item>
  114. </div>
  115. <div class="hc-form-item">
  116. <el-form-item label="进场日期">
  117. <el-date-picker type="date" v-model="addEditFormModel.mobilizationDate" class="block" value-format="YYYY-MM-DD" :clearable="false"/>
  118. </el-form-item>
  119. <el-form-item label="拟用部位">
  120. <el-input v-model="addEditFormModel.proposedPosition"/>
  121. </el-form-item>
  122. </div>
  123. <div class="hc-form-item">
  124. <el-form-item label="供应商单位">
  125. <el-input v-model="addEditFormModel.supplierUnit"/>
  126. </el-form-item>
  127. <el-form-item label="生产地/厂家">
  128. <el-input v-model="addEditFormModel.placeOfProduction"/>
  129. </el-form-item>
  130. </div>
  131. <el-form-item label="生产合格证">
  132. <FormItemUpload v-model="addEditFormModel.productionCertificate"/>
  133. </el-form-item>
  134. <el-form-item label="厂家质检报告">
  135. <FormItemUpload v-model="addEditFormModel.qualityInspectionReport"/>
  136. </el-form-item>
  137. <el-form-item label="其他附件">
  138. <FormItemUpload v-model="addEditFormModel.otherAccessories"/>
  139. </el-form-item>
  140. </el-form>
  141. </HcDialog>
  142. <!--复制材料登记信息-->
  143. <HcDialog :show="copyTableModal" title="复制材料登记信息" widths="60rem" isTable :loading="copyTableLoading" @close="copyTableModalClose" @save="copyTableClick">
  144. <HcTable :column="copyTableColumn" :datas="copyTableData">
  145. <template #materialNumber="{row}">
  146. <el-input v-model="row.materialNumber" :class="row.isMaterialNumber?'is-error':''" placeholder="请输入材料编号" @blur="materialNumberBlur(row)"/>
  147. </template>
  148. <template #action="{index}">
  149. <el-button type="danger" size="small" plain @click="materialNumberDel(index)">删除</el-button>
  150. </template>
  151. </HcTable>
  152. </HcDialog>
  153. <!--导入-->
  154. <HcDialog :show="importModal" title="导入" widths="38rem" isRowFooter @close="importModalClose">
  155. <HcDragUpload ref="uploadRef" action="mobilization/import" :datas="uploadData" @progress="uploadprogress" @finished="uploadFinished"/>
  156. <template #leftRowFooter>
  157. <el-button size="large" @click="downloadImportClick">
  158. <HcIcon name="download-2"/>
  159. <span>下载模板</span>
  160. </el-button>
  161. </template>
  162. <template #rightRowFooter>
  163. <el-button size="large" @click="importModalClose">
  164. <HcIcon name="close"/>
  165. <span>取消导入</span>
  166. </el-button>
  167. <el-button type="primary" hc-btn :loading="importModalLoading" @click="importModalYesClick">
  168. <HcIcon name="folder-upload"/>
  169. <span>确认导入</span>
  170. </el-button>
  171. </template>
  172. </HcDialog>
  173. <!--查看附件-->
  174. <HcDialog :show="viewAttachmentModal" title="查看附件" widths="70rem" :footer="false" isTable @close="viewAttachmentModalClose">
  175. <template #extra>
  176. <HcNewSwitch :datas="tabTypeTab" :keys="tabTypeKey" @change="tabTypeChange" :disabled="tableRowPdfDisabled"/>
  177. </template>
  178. <div class="hc-switch-tab-content">
  179. <div class="h-full w-full">
  180. <iframe allow="display-capture" width='100%' height='100%' frameborder='1' :src="tableRowData[tabTypeKey]" v-if="tableRowData[tabTypeKey]"/>
  181. <div class="hc-no-table-form" v-else>
  182. <div class="table-form-no">
  183. <img :src="notableform" alt=""/>
  184. <div class="desc">暂无 PDF 数据,请上传</div>
  185. <HcDragUpload autoUpload @progress="tableRowPdfProgress" @finished="tableRowPdfFinished"/>
  186. </div>
  187. </div>
  188. </div>
  189. </div>
  190. </HcDialog>
  191. <!--取样记录-->
  192. <HcDialog :show="samplingRecordModal" title="取样记录" widths="60%" :footer="false" isTable @close="samplingRecordModalClose">
  193. <HcTable :column="samplingTableColumn" :datas="samplingTableData" :loading="samplingTableLoading" :isIndex="false">
  194. <template #isOutsourcing="{row}">
  195. <span>{{row.isOutsourcing === 1 ? '是':'否'}}</span>
  196. </template>
  197. </HcTable>
  198. </HcDialog>
  199. </div>
  200. </template>
  201. <script setup>
  202. import {ref, onMounted} from "vue";
  203. import {useAppStore} from "~src/store";
  204. import HcDragUpload from "./components/HcDragUpload.vue"
  205. import FormItemUpload from "./components/FormItemUpload.vue"
  206. import notableform from '~src/assets/view/notableform.svg';
  207. import approachApi from "~api/tentative/material/approach"
  208. import {formValidate, getArrValue, getIndex, deepClone} from "vue-utils-plus"
  209. import {getDictionary} from "~api/other";
  210. //初始变量
  211. const useAppState = useAppStore()
  212. //全局变量
  213. const projectId = ref(useAppState.getProjectId);
  214. const contractId = ref(useAppState.getContractId);
  215. //渲染完成
  216. onMounted(() => {
  217. getMaterialType()
  218. getTableData()
  219. })
  220. //获取材料类型
  221. const typeData = ref([])
  222. const getMaterialType = async () => {
  223. const { data } = await getDictionary({
  224. code: 'material_type'
  225. })
  226. typeData.value = getArrValue(data)
  227. //dictValue, dictKey
  228. }
  229. //获取材料类型
  230. const getRowTableMaterialType = (type) => {
  231. if (type > 0) {
  232. const nodeData = typeData.value
  233. const index = getIndex(nodeData, 'dictKey', type)
  234. return nodeData[index]?.dictValue ?? type
  235. } else {
  236. return ''
  237. }
  238. }
  239. //搜索表单
  240. const searchForm = ref({
  241. materialType: null, startTime: null, endTime: null, queryValue: null,
  242. current: 1, size: 20, total: 0
  243. })
  244. //日期时间被选择
  245. const betweenTime = ref(null)
  246. const betweenTimeUpdate = ({arr}) => {
  247. betweenTime.value = arr
  248. if (arr.length > 0) {
  249. searchForm.value.startTime = arr[0]
  250. searchForm.value.endTime = arr[1]
  251. }else{
  252. searchForm.value.startTime = ''
  253. searchForm.value.endTime =''
  254. }
  255. }
  256. //回车搜索
  257. const keyUpEvent = (e) => {
  258. if (e.key === "Enter") {
  259. searchForm.value.current = 1;
  260. getTableData()
  261. }
  262. }
  263. //搜索
  264. const searchClick = () => {
  265. searchForm.value.current = 1;
  266. getTableData()
  267. }
  268. //分页被点击
  269. const pageChange = ({current, size}) => {
  270. searchForm.value.current = current
  271. searchForm.value.size = size
  272. getTableData()
  273. }
  274. //表格数据
  275. const tableRef = ref(null)
  276. const tableColumn = ref([
  277. {key:'materialNumber', name: '材料编号'},
  278. {key:'mobilizationDate', name: '进场日期'},
  279. {key:'materialName', name: '材料名称'},
  280. {key:'materialType', name: '材料类型'},
  281. {key:'specificationModel', name: '规格型号'},
  282. {key:'supplierUnit', name: '供应商单位'},
  283. {key:'materialPrice', name: '材料单价'},
  284. {key:'materialCount', name: '材料数量'},
  285. {key:'calculationUnit', name: '计算单位'},
  286. {key:'batchNumber', name: '生产批号'},
  287. {key:'placeOfProduction', name: '生产地/厂家'},
  288. {key:'proposedPosition', name: '拟用部位'},
  289. {key:'userName', name: '记录人'},
  290. {key:'action', name: '操作', width: 150, fixed: 'right', align: 'center'},
  291. ])
  292. const tableRowData = ref({})
  293. //获取数据
  294. const tableLoading = ref(false)
  295. const tableData = ref([])
  296. const getTableData = async () => {
  297. tableLoading.value = true
  298. const { error, code, data } = await approachApi.queryPage({
  299. projectId: projectId.value,
  300. contractId: contractId.value,
  301. ...searchForm.value,
  302. })
  303. //处理数据
  304. tableLoading.value = false
  305. if (!error && code === 200) {
  306. tableData.value = getArrValue(data['records'])
  307. searchForm.value.total = data.total || 0
  308. } else {
  309. tableData.value = []
  310. searchForm.value.total = 0
  311. }
  312. }
  313. //多选
  314. const tableCheckedKeys = ref([]);
  315. const tableSelection = (rows) => {
  316. tableCheckedKeys.value = rows.filter((item) => {
  317. return (item??'') !== '';
  318. })
  319. }
  320. //新增 材料进场
  321. const addEditFormModal = ref(false)
  322. const addFormModalClick = () => {
  323. addEditFormModel.value = {}
  324. addEditFormModal.value = true
  325. }
  326. //编辑 材料进场
  327. const editFormModalClick = () => {
  328. const keys = tableCheckedKeys.value
  329. if (keys.length === 1) {
  330. addEditFormModel.value = keys[0]
  331. addEditFormModel.value.materialType= addEditFormModel.value.materialType+''
  332. addEditFormModel.value.materialCount=addEditFormModel.value.materialCount===-1?'':addEditFormModel.value.materialCount
  333. addEditFormModel.value.materialPrice=addEditFormModel.value.materialPrice===-1?'':addEditFormModel.value.materialPrice
  334. addEditFormModal.value = true
  335. } else if (keys.length > 1) {
  336. window?.$message?.warning('只能选择一条数据编辑')
  337. }
  338. }
  339. const addEditFormModalClose = () => {
  340. addEditFormModal.value = false
  341. addEditFormModel.value = {}
  342. }
  343. //新增/编辑 表单
  344. const addEditFormRef = ref(null)
  345. const addEditFormModel = ref({})
  346. const addEditFormRules = {
  347. materialType: {
  348. required: true,
  349. trigger: 'change',
  350. message: "请选择材料类型"
  351. },
  352. materialName: {
  353. required: true,
  354. trigger: 'blur',
  355. message: "请输入材料名称"
  356. },
  357. specificationModel: {
  358. required: true,
  359. trigger: 'blur',
  360. message: "请输入规格型号"
  361. },
  362. materialNumber: {
  363. required: true,
  364. validator: async (rule, value, callback) => {
  365. if (!value) {
  366. callback(new Error('请输入材料编号'))
  367. } else {
  368. const ver = await verification(value)
  369. if (!ver) {
  370. callback(new Error('材料编号必须是惟一的'))
  371. } else {
  372. callback()
  373. }
  374. }
  375. },
  376. trigger: 'blur'
  377. },
  378. }
  379. //校验材料编号是否唯一
  380. const verification = async (val) => {
  381. const { error, code, data } = await approachApi.verification({
  382. projectId: projectId.value,
  383. contractId: contractId.value,
  384. materialNumber: val,
  385. id: addEditFormModel.value.id ?? ''
  386. })
  387. if (!error && code === 200) {
  388. return !data
  389. } else {
  390. return false
  391. }
  392. }
  393. //新增/编辑 保存
  394. const addEditFormLoading = ref(false)
  395. const addEditFormClick = async () => {
  396. const validate = await formValidate(addEditFormRef.value)
  397. if (validate) {
  398. addEditFormLoading.value = true
  399. const { error, code } = await approachApi.submitForm({
  400. ...addEditFormModel.value,
  401. projectId: projectId.value,
  402. contractId: contractId.value
  403. })
  404. //处理数据
  405. if (!error && code === 200) {
  406. window?.$message?.success('操作成功')
  407. addEditFormModal.value = false
  408. setTimeout(() => {
  409. addEditFormLoading.value = false
  410. }, 1000);
  411. await getTableData()
  412. }
  413. }
  414. }
  415. //复制表格
  416. const copyTableColumn = ref([
  417. {key:'materialName', name: '材料名称'},
  418. {key:'materialNumber', name: '材料编号'},
  419. {key:'action', name: '操作', width: 100},
  420. ])
  421. const copyTableData = ref([])
  422. //复制
  423. const copyTableModal = ref(false)
  424. const copyTableModalClick = () => {
  425. copyTableModal.value = true
  426. copyTableData.value = deepClone(tableCheckedKeys.value)
  427. }
  428. //效验材料编号
  429. const materialNumberBlur = async (row) => {
  430. const number = row?.materialNumber ?? ''
  431. if (number) {
  432. const ver = await verification(number)
  433. row.isMaterialNumber = !ver
  434. } else {
  435. row.isMaterialNumber = true
  436. }
  437. }
  438. //删除
  439. const materialNumberDel = (index) => {
  440. copyTableData.value.splice(index, 1);
  441. const rows = copyTableData.value
  442. if (rows.length <= 0) {
  443. copyTableModal.value = false
  444. }
  445. }
  446. const copyTableModalClose = () => {
  447. copyTableModal.value = false
  448. }
  449. //复制 保存
  450. const copyTableLoading = ref(false)
  451. const copyTableClick = () => {
  452. const rows = copyTableData.value
  453. if (rows.length > 0) {
  454. //判断是否满足条件
  455. const result = rows.every(({isMaterialNumber})=> {
  456. return isMaterialNumber === false
  457. })
  458. //判断状态
  459. if (result) {
  460. for (let i = 0; i < rows.length; i++) {
  461. rows[i].dataNumber = i
  462. }
  463. tableCopyData(rows)
  464. } else {
  465. window.$message?.warning('请先完善材料编号')
  466. }
  467. } else {
  468. window.$message?.warning('请先在列表勾选要复制的数据')
  469. copyTableModal.value = false
  470. }
  471. }
  472. //复制数据请求
  473. const tableCopyData = async (rows) => {
  474. copyTableLoading.value = true
  475. const { error, code } = await approachApi.copyData(rows)
  476. //处理数据
  477. copyTableLoading.value = false
  478. if (!error && code === 200) {
  479. window?.$message?.success('操作成功')
  480. copyTableModal.value = false
  481. await getTableData()
  482. }
  483. }
  484. //删除
  485. const delModalClick = () => {
  486. window?.$messageBox?.alert('请谨慎考虑后,确认是否需要删除?', '删除提醒', {
  487. showCancelButton: true,
  488. confirmButtonText: '确认删除',
  489. cancelButtonText: '取消',
  490. type: 'warning',
  491. callback: (action) => {
  492. if (action === 'confirm') {
  493. tableRemoveData()
  494. }
  495. }
  496. })
  497. }
  498. //批量删除
  499. const tableRemoveData = async () => {
  500. const rows = tableCheckedKeys.value
  501. if (rows.length > 0 ) {
  502. const ids = rowsToId(rows)
  503. //删除请求
  504. const { error, code } = await approachApi.removeData({
  505. projectId: projectId.value,
  506. contractId: contractId.value,
  507. ids: ids,
  508. })
  509. //处理数据
  510. if (!error && code === 200) {
  511. window?.$message?.success('操作成功')
  512. searchClick()
  513. }
  514. }
  515. }
  516. //打印
  517. const printerLoading = ref(false)
  518. const printerClick = async () => {
  519. const rows = tableCheckedKeys.value
  520. if (rows.length > 0 ) {
  521. printerLoading.value = true
  522. const ids = rowsToId(rows)
  523. //删除请求
  524. const { error, code, data } = await approachApi.exportPdf({
  525. projectId: projectId.value,
  526. contractId: contractId.value,
  527. ids: ids,
  528. })
  529. //处理数据
  530. printerLoading.value = false
  531. if (!error && code === 200) {
  532. window.open(data,'_blank')
  533. }
  534. }
  535. }
  536. //导入
  537. const uploadRef = ref(null)
  538. const uploadData = ref({})
  539. //导入弹窗
  540. const importModal = ref(false)
  541. const importModalClick = () => {
  542. importModal.value = true
  543. uploadData.value = {
  544. contractId: contractId.value,
  545. isCovered: 1
  546. }
  547. }
  548. //上传进度
  549. const uploadprogress = (res) => {
  550. importModalLoading.value = res
  551. }
  552. //确认导入
  553. const importModalLoading = ref(false)
  554. const importModalYesClick = () => {
  555. uploadRef.value?.submit()
  556. }
  557. //上传完成
  558. const uploadFinished = () => {
  559. importModal.value = false
  560. getTableData()
  561. }
  562. //关闭导入
  563. const importModalClose = () => {
  564. importModal.value = false
  565. }
  566. //查看附件
  567. const viewAttachmentModal = ref(false)
  568. const viewAttachmentModalClick = (row) => {
  569. tableRowData.value = row
  570. viewAttachmentModal.value = true
  571. }
  572. //类型tab数据和相关处理
  573. const tabTypeKey = ref('productionCertificate')
  574. const tabTypeTab = ref([
  575. {key:'productionCertificate', name: '生产合格证'},
  576. {key:'qualityInspectionReport', name: '厂家质检报告'},
  577. {key:'otherAccessories', name: '其他文件'},
  578. ]);
  579. const tabTypeChange = (item) => {
  580. tabTypeKey.value = item?.key
  581. }
  582. //上传进度
  583. const tableRowPdfDisabled = ref(false)
  584. const tableRowPdfProgress = (res) => {
  585. tableRowPdfDisabled.value = res
  586. }
  587. //上传完成
  588. const tableRowPdfFinished = async (data) => {
  589. tableRowPdfDisabled.value = true
  590. const row = tableRowData.value, key = tabTypeKey.value
  591. row[key] = data?.pdfUrl
  592. //保存请求
  593. const { error, code } = await approachApi.submitForm({
  594. ...row,
  595. projectId: projectId.value,
  596. contractId: contractId.value
  597. })
  598. //处理数据
  599. tableRowData.value = row
  600. tableRowPdfDisabled.value = false
  601. if (!error && code === 200) {
  602. window?.$message?.success('操作成功')
  603. await getTableData()
  604. }
  605. }
  606. //关闭查看附件
  607. const viewAttachmentModalClose = () => {
  608. viewAttachmentModal.value = false
  609. }
  610. //取样记录
  611. const samplingRecordModal = ref(false)
  612. const samplingRecordModalClick = async (row) => {
  613. samplingRecordModal.value = true
  614. samplingTableLoading.value = true
  615. const { data } = await approachApi.samplingRecord({
  616. projectId: projectId.value,
  617. contractId: contractId.value,
  618. id: row.id,
  619. })
  620. samplingTableLoading.value = false
  621. samplingTableData.value = getArrValue(data)
  622. }
  623. //取样记录数据
  624. const samplingTableColumn = ref([
  625. {key:'specificationNumber', name: '样品编号'},
  626. {key:'materialName', name: '样品名称'},
  627. {key:'samplingDate', name: '取样日期'},
  628. {key:'userName', name: '取样人'},
  629. {key:'materialCount', name: '试样数量'},
  630. {key:'isOutsourcing', name: '是否外委'},
  631. ])
  632. const samplingTableData = ref([])
  633. const samplingTableLoading = ref(false)
  634. //关闭取样记录
  635. const samplingRecordModalClose = () => {
  636. samplingRecordModal.value = false
  637. }
  638. //下载导入模板
  639. const downloadImportClick = () => {
  640. window.open('https://bladex-test-info.oss-cn-chengdu.aliyuncs.com//upload/20221109/fea12aaee9d964d2d9f894cc6bf4a2f6.xlsx','_blank')
  641. }
  642. //拼接ID
  643. const rowsToId = (rows) => {
  644. return rows.map((obj) => {
  645. return obj.id;
  646. }).join(",")
  647. }
  648. </script>
  649. <style lang="scss" scoped>
  650. @import "../../../styles/tentative/material/approach.scss";
  651. </style>