approach.vue 30 KB

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