You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1333 lines
46 KiB

1 month ago
1 month ago
  1. <!-- 询价单新增 -->
  2. <template>
  3. <div class="customer-css">
  4. <!-- 查询条件 -->
  5. <el-form :inline="true" label-position="top" class="pi-search-form">
  6. <el-form-item :label="'询价单号'">
  7. <el-input v-model="searchData.orderNo" placeholder="询价单号" style="width:160px" @keyup.enter.native="getList" clearable />
  8. </el-form-item>
  9. <el-form-item :label="'供应商编码'">
  10. <el-input v-model="searchData.supplierId" placeholder="供应商编码" style="width:160px" @keyup.enter.native="getList" clearable />
  11. </el-form-item>
  12. <el-form-item :label="'供应商名称'">
  13. <el-input v-model="searchData.supplierName" placeholder="供应商名称" style="width:200px" @keyup.enter.native="getList" clearable />
  14. </el-form-item>
  15. <el-form-item :label="'状态'">
  16. <el-select v-model="searchData.status" placeholder="请选择" style="width:100px" clearable>
  17. <el-option label="全部" value=""></el-option>
  18. <el-option label="待提交" value="待提交"></el-option>
  19. <el-option label="待报价" value="待报价"></el-option>
  20. <el-option label="已报价" value="已报价"></el-option>
  21. <el-option label="已关闭" value="已关闭"></el-option>
  22. </el-select>
  23. </el-form-item>
  24. <el-form-item label=" ">
  25. <el-button type="primary" class="customer-bun-min" @click="getList">查询</el-button>
  26. <el-button type="primary" class="customer-bun-min" @click="openDialog()">新增</el-button>
  27. </el-form-item>
  28. </el-form>
  29. <!-- 主表询价单列表 -->
  30. <el-table :data="dataList" :height="tableHeight" border highlight-current-row @row-click="selectInquiry" v-loading="loading" style="width:100%">
  31. <el-table-column fixed="right" label="操作" header-align="center" align="center" width="140">
  32. <template slot-scope="scope" >
  33. <a class="customer-a" v-if="scope.row.status === '待提交'" @click.stop="openDialog(scope.row)">编辑 |</a>
  34. <a class="customer-a" v-if="scope.row.status === '待提交'" @click.stop="handleDelete(scope.row)">删除</a>
  35. <a class="customer-a" v-if="scope.row.status === '待提交'" @click="updateQuoDetail(scope.row)">提交</a>
  36. <a class="customer-a" v-if="scope.row.status != '已关闭'" @click="closePurHeader(scope.row)">关闭</a>
  37. </template>
  38. </el-table-column>
  39. <el-table-column prop="status" label="状态" min-width="80" header-align="center" align="center" show-overflow-tooltip />
  40. <el-table-column prop="orderNo" label="询价单号" min-width="140" header-align="center" align="left" show-overflow-tooltip />
  41. <el-table-column prop="supplierId" label="供应商编码" min-width="120" header-align="center" align="center" show-overflow-tooltip />
  42. <el-table-column prop="supplierName" label="供应商名称" min-width="180" header-align="center" align="left" show-overflow-tooltip />
  43. <el-table-column prop="orderDate" label="询价日期" min-width="120" header-align="center" align="center" show-overflow-tooltip />
  44. <el-table-column prop="wantReplyDate" label="要求报价日期" min-width="120" header-align="center" align="center" show-overflow-tooltip />
  45. <el-table-column prop="userName" label="录入人" min-width="100" header-align="center" align="center" show-overflow-tooltip />
  46. <el-table-column prop="buyer" label="采购员" min-width="100" header-align="center" align="center" show-overflow-tooltip />
  47. <el-table-column prop="paymentTermDesc" label="付款方式" min-width="120" header-align="center" align="center" show-overflow-tooltip />
  48. <el-table-column prop="deliveryTermDesc" label="交易条款" min-width="120" header-align="center" align="center" show-overflow-tooltip />
  49. <el-table-column prop="currencyDesc" label="货币" min-width="80" header-align="center" align="center" show-overflow-tooltip />
  50. <el-table-column prop="currencyRate" label="货币汇率" min-width="100" header-align="center" align="center" show-overflow-tooltip />
  51. <el-table-column prop="taxRate" label="税率" min-width="80" header-align="center" align="center" show-overflow-tooltip />
  52. <el-table-column prop="otherCondition" label="其他要求" min-width="180" header-align="center" align="left" show-overflow-tooltip />
  53. <el-table-column prop="phoneNo" label="电话号码" min-width="120" header-align="center" align="center" show-overflow-tooltip />
  54. <el-table-column prop="faxNo" label="传真" min-width="120" header-align="center" align="center" show-overflow-tooltip />
  55. <el-table-column prop="contact" label="联系人" min-width="100" header-align="center" align="center" show-overflow-tooltip />
  56. <el-table-column prop="remark" label="备注" min-width="180" header-align="center" align="left" show-overflow-tooltip />
  57. </el-table>
  58. <!-- 分页 -->
  59. <el-pagination
  60. style="margin-top:5px"
  61. @size-change="sizeChangeHandle"
  62. @current-change="currentChangeHandle"
  63. :current-page="pageIndex"
  64. :page-sizes="[20,50,100,200]"
  65. :page-size="pageSize"
  66. :total="totalPage"
  67. layout="total, sizes, prev, pager, next, jumper" />
  68. <!-- 子表物料明细列表 - 始终显示表头 -->
  69. <div class="sub-title">
  70. 物料明细列表
  71. <el-button type="primary" class="customer-bun-min" @click="openMaterialDialog()" style="margin-left: 10px;">新增物料</el-button>
  72. </div>
  73. <el-table
  74. :data="materialList"
  75. :height="subTableHeight"
  76. border
  77. v-loading="materialLoading"
  78. style="width:100%">
  79. <el-table-column fixed="right" label="操作" header-align="center" align="center" width="120">
  80. <template slot-scope="scope">
  81. <a class="material-action-btn" @click="openMaterialDialog(scope.row)">编辑</a>
  82. <a class="material-action-btn" @click="deleteMaterial(scope.row)">删除</a>
  83. <a class="material-action-btn" @click="openUploadDialog(scope.row)">附件</a>
  84. </template>
  85. </el-table-column>
  86. <el-table-column prop="partNo" label="物料编码" min-width="130" header-align="center" align="center" show-overflow-tooltip />
  87. <el-table-column prop="partDesc" label="物料名称" min-width="150" header-align="center" align="left" show-overflow-tooltip />
  88. <el-table-column prop="umid" label="计量单位" min-width="80" header-align="center" align="center" />
  89. <el-table-column prop="spec" label="规格型号" min-width="150" header-align="center" align="left" show-overflow-tooltip />
  90. <el-table-column prop="qty" label="询价数量" min-width="100" header-align="center" align="right">
  91. <template slot-scope="scope">{{ scope.row.qty || 0 }}</template>
  92. </el-table-column>
  93. <el-table-column prop="remark2" label="特殊要求" min-width="150" header-align="center" align="left" show-overflow-tooltip>
  94. <template slot-scope="scope">{{ scope.row.remark2 || '-' }}</template>
  95. </el-table-column>
  96. <el-table-column prop="status" label="状态" min-width="80" header-align="center" align="center">
  97. <template slot-scope="scope">{{ scope.row.status }}
  98. <!-- <span :class="'status-badge ' + (scope.row.status === 'Y' ? 'status-sent' : 'status-closed')">{{ scope.row.status === 'Y' ? '启用' : '停用' }}</span> -->
  99. </template>
  100. </el-table-column>
  101. </el-table>
  102. <!-- 空数据提示 -->
  103. <div v-if="materialList.length === 0 && !materialLoading" style="margin-top: 8px; color: #909399; font-size: 12px; text-align: center;">
  104. {{ currentInquiry ? '暂无物料数据' : '请点击左侧询价单查看物料明细' }}
  105. </div>
  106. <!-- 新增/编辑 询价单弹窗 -->
  107. <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="700px" :close-on-click-modal="false" append-to-body>
  108. <el-form label-position="top" class="pi-form" :model="form" label-width="120px">
  109. <el-row :gutter="20">
  110. <el-col :span="12">
  111. <el-form-item>
  112. <span style="cursor: pointer" slot="label" @click="getBaseList(520)"><a href="javascript:void(0)">供应商编码</a></span>
  113. <el-input v-model="form.supplierId" @change="handleSupplierIdChange" />
  114. </el-form-item>
  115. </el-col>
  116. <el-col :span="12">
  117. <el-form-item label="供应商名称" :required="true">
  118. <el-input v-model="form.supplierName"/>
  119. </el-form-item>
  120. </el-col>
  121. </el-row>
  122. <el-row :gutter="20">
  123. <el-col :span="12">
  124. <el-form-item label="询价日期">
  125. <el-date-picker v-model="form.orderDate" type="date" value-format="yyyy-MM-dd" placeholder="选择日期" style="width:100%" />
  126. </el-form-item>
  127. </el-col>
  128. <el-col :span="12">
  129. <el-form-item label="要求报价日期">
  130. <el-date-picker v-model="form.wantReplyDate" type="date" value-format="yyyy-MM-dd" placeholder="选择日期" style="width:100%" />
  131. </el-form-item>
  132. </el-col>
  133. </el-row>
  134. <el-row :gutter="20">
  135. <el-col :span="12">
  136. <el-form-item label="货币汇率">
  137. <el-input-number v-model="form.currencyRate" :precision="4" :step="0.1" style="width:100%" />
  138. </el-form-item>
  139. </el-col>
  140. <el-col :span="6">
  141. <el-form-item label="税率(%)">
  142. <!-- <el-input-number v-model="form.taxRate" :precision="2" :step="1" style="width:100%" /> -->
  143. <el-select v-model="form.taxCode" placeholder="请选择" clearable >
  144. <el-option
  145. v-for = "t in taxList"
  146. :key = "t.taxCode"
  147. :label = "t.taxRate"
  148. :value = "t.taxCode">
  149. </el-option>
  150. </el-select>
  151. </el-form-item>
  152. </el-col>
  153. <el-col :span="6">
  154. <el-form-item label="货币">
  155. <!-- <el-input-number v-model="form.taxRate" :precision="2" :step="1" style="width:100%" /> -->
  156. <el-select v-model="form.currency" placeholder="请选择" clearable>
  157. <el-option
  158. v-for = "t in currencyList"
  159. :key = "t.currency"
  160. :label = "t.currencyDesc"
  161. :value = "t.currency">
  162. </el-option>
  163. </el-select>
  164. </el-form-item>
  165. </el-col>
  166. </el-row>
  167. <el-row :gutter="20">
  168. <el-col :span="6">
  169. <el-form-item>
  170. <span style="cursor: pointer" slot="label" @click="getBaseList(529)"><a href="javascript:void(0)">采购员</a></span>
  171. <el-input v-model="form.buyer" style="width: 130px" />
  172. </el-form-item>
  173. </el-col>
  174. <el-col :span="6">
  175. <el-form-item label="付款方式">
  176. <!-- <el-input v-model="form.paymentTermDesc" /> -->
  177. <el-select v-model="form.paymentTerm" placeholder="请选择" clearable>
  178. <el-option
  179. v-for = "t in paymentList"
  180. :key = "t.paymentTermId"
  181. :label = "t.paymentTerm"
  182. :value = "t.paymentTermId">
  183. </el-option>
  184. </el-select>
  185. </el-form-item>
  186. </el-col>
  187. <el-col :span="12">
  188. <el-form-item label="交易条款">
  189. <!-- <el-input v-model="form.deliveryTermDesc" /> -->
  190. <el-select v-model="form.deliveryTerm" placeholder="请选择" clearable style="width: 100%">
  191. <el-option
  192. v-for = "t in deliveryList"
  193. :key = "t.deliveryTermId"
  194. :label = "t.deliveryTerm"
  195. :value = "t.deliveryTermId">
  196. </el-option>
  197. </el-select>
  198. </el-form-item>
  199. </el-col>
  200. </el-row>
  201. <el-row :gutter="20">
  202. <el-col :span="6">
  203. <el-form-item label="电话号码">
  204. <el-input v-model="form.phoneNo" />
  205. </el-form-item>
  206. </el-col>
  207. <el-col :span="6">
  208. <el-form-item label="传真">
  209. <el-input v-model="form.faxNo" />
  210. </el-form-item>
  211. </el-col>
  212. <el-col :span="6">
  213. <el-form-item label="联系人">
  214. <el-input v-model="form.contact" />
  215. </el-form-item>
  216. </el-col>
  217. </el-row>
  218. <el-row :gutter="20">
  219. <el-col :span="24">
  220. <el-form-item label="其他要求">
  221. <el-input v-model="form.otherCondition" />
  222. </el-form-item>
  223. </el-col>
  224. </el-row>
  225. <el-row :gutter="20">
  226. <el-col :span="24">
  227. <el-form-item label="备注">
  228. <el-input type="textarea" v-model="form.remark" :rows="2" />
  229. </el-form-item>
  230. </el-col>
  231. </el-row>
  232. </el-form>
  233. <div slot="footer" class="dialog-footer" style="margin-top: 20px">
  234. <el-button type="primary" @click="submitForm" :loading="submitLoading">保存</el-button>
  235. <el-button @click="dialogVisible=false">取消</el-button>
  236. </div>
  237. </el-dialog>
  238. <!-- 物料明细新增/编辑弹窗 -->
  239. <el-dialog :title="materialDialogTitle" :visible.sync="materialDialogVisible" width="700px" :close-on-click-modal="false" append-to-body>
  240. <el-form label-position="top" class="pi-form" :model="materialForm">
  241. <el-row :gutter="20">
  242. <el-col :span="12">
  243. <el-form-item >
  244. <span style="cursor: pointer" slot="label" @click="getBaseList(507)"><a href="#">物料编码</a></span>
  245. <el-input v-model="materialForm.partNo" placeholder="请输入物料编码" @change="handlePartNoChange" :readonly="true"/>
  246. </el-form-item>
  247. </el-col>
  248. <el-col :span="12">
  249. <el-form-item label="物料名称" required>
  250. <el-input v-model="materialForm.partDesc" placeholder="请输入物料名称" disabled/>
  251. </el-form-item>
  252. </el-col>
  253. </el-row>
  254. <el-row :gutter="20">
  255. <el-col :span="12">
  256. <el-form-item label="规格型号">
  257. <el-input v-model="materialForm.spec" placeholder="规格型号" disabled/>
  258. </el-form-item>
  259. </el-col>
  260. <el-col :span="6">
  261. <el-form-item label="计量单位">
  262. <!-- <span style="cursor: pointer" slot="label" @click="getBaseList(510)"><a href="#">计量单位</a></span> -->
  263. <el-input v-model="materialForm.umid" placeholder="计量单位" disabled/>
  264. </el-form-item>
  265. </el-col>
  266. <el-col :span="6">
  267. <el-form-item label="询价数量">
  268. <el-input-number v-model="materialForm.qty" :min="0" :precision="0" style="width:100%" />
  269. </el-form-item>
  270. </el-col>
  271. </el-row>
  272. <el-row :gutter="20">
  273. <el-col :span="24">
  274. <el-form-item label="特殊要求">
  275. <el-input type="textarea" v-model="materialForm.remark2" :rows="2" placeholder="特殊要求" />
  276. </el-form-item>
  277. </el-col>
  278. </el-row>
  279. </el-form>
  280. <div slot="footer" class="dialog-footer" style="margin-top: 20px">
  281. <el-button type="primary" @click="saveMaterial" :loading="materialSubmitLoading">保存</el-button>
  282. <el-button @click="materialDialogVisible=false">取消</el-button>
  283. </div>
  284. </el-dialog>
  285. <el-dialog
  286. :title="dialogTitle"
  287. :visible.sync="uploadDialogVisible"
  288. width="800px"
  289. :close-on-click-modal="false"
  290. append-to-body
  291. @close="handleClose">
  292. <div class="customer-css">
  293. <!-- 上传按钮 -->
  294. <el-form label-position="top" style="margin-top: -5px;">
  295. <el-row style="margin-top: 10px">
  296. <el-col :span="4">
  297. <el-button class="customer-bun-min" type="primary" @click="handleUpload">Upload</el-button>
  298. </el-col>
  299. </el-row>
  300. <!-- 文件列表表格 -->
  301. <el-table
  302. :height="240"
  303. :data="fileList"
  304. ref="fileTableRef"
  305. style="width: 100%; margin-top: 10px;">
  306. <el-table-column
  307. prop="fileName"
  308. header-align="center"
  309. align="left"
  310. min-width="200"
  311. label="File">
  312. </el-table-column>
  313. <el-table-column
  314. prop="createdBy"
  315. header-align="center"
  316. align="center"
  317. min-width="100"
  318. label="Upload By">
  319. </el-table-column>
  320. <el-table-column
  321. prop="createDate"
  322. header-align="center"
  323. align="center"
  324. min-width="100"
  325. label="Upload Time">
  326. </el-table-column>
  327. <el-table-column
  328. header-align="center"
  329. align="center"
  330. width="100"
  331. fixed="right"
  332. label="Actions">
  333. <template slot-scope="scope">
  334. <a type="text" size="small" v-if="scope.row.id" @click="handleDownload(scope.row)">View |</a>
  335. <a type="text" size="small" v-if="scope.row.id" @click="deleteFileReal(scope.row)"> delete</a>
  336. <a type="text" size="small" v-else @click="deleteFile(scope.$index)"> delete</a>
  337. </template>
  338. </el-table-column>
  339. </el-table>
  340. </el-form>
  341. </div>
  342. <!-- File Upload Dialog -->
  343. <el-dialog
  344. title="UpLoad"
  345. :visible.sync="ossVisible"
  346. v-drag
  347. width="400px"
  348. append-to-body
  349. :close-on-click-modal="false"
  350. @close="handleUploadClose">
  351. <el-form ref="form" class="rq" label-width="80px" label-position="top">
  352. <el-row :gutter="10">
  353. <slot></slot>
  354. <el-col :span="24">
  355. <el-form-item label=" " class="auto">
  356. <el-upload
  357. drag
  358. :file-list="fileList2"
  359. action="#"
  360. ref="upload"
  361. :on-remove="onRemoveFile"
  362. :on-change="onChangeFile"
  363. multiple
  364. :auto-upload="false">
  365. <i class="el-icon-upload"></i>
  366. <div class="el-upload__text">Drag files here, or<em> click to upload</em></div>
  367. </el-upload>
  368. </el-form-item>
  369. </el-col>
  370. <!-- <el-col :span="24">
  371. <el-form-item label="Remark" class="auto">
  372. <el-input type="textarea" v-model="ossForm.remark" resize="none" :autosize="{minRows: 3, maxRows: 3}"></el-input>
  373. </el-form-item>
  374. </el-col> -->
  375. </el-row>
  376. </el-form>
  377. <span slot="footer" class="dialog-footer">
  378. <el-button type="primary" :loading="uploadLoading" @click="submitData">Confirm</el-button>
  379. <el-button @click="ossVisible = false">Close</el-button>
  380. </span>
  381. </el-dialog>
  382. <div slot="footer" class="dialog-footer">
  383. <el-button @click="uploadDialogVisible = false">关闭</el-button>
  384. </div>
  385. </el-dialog>
  386. <Chooselist ref="baseList" @getBaseData="getBaseData" />
  387. </div>
  388. </template>
  389. <script>
  390. import Chooselist from '@/views/modules/common/Chooselist_eam'
  391. import {
  392. searchPurHeaderList,
  393. createPurHeader,
  394. updatePurHeader,
  395. deletePurHeader,
  396. updatePurHeaderStatus,
  397. searchMaterialList,
  398. createMaterial,
  399. updateMaterial,
  400. deleteMaterial,
  401. updatePurDetailStatus
  402. } from '@/api/supplier/purQuotation.js'
  403. import {
  404. getSupplierInfo
  405. } from '@/api/srm/srmSupplier.js'
  406. import {
  407. ossUploadNoSaveOSSForYJY,
  408. queryOssFilePlus,
  409. removeOss,
  410. downLoadObjectFile
  411. } from "../../../api/oss/oss";
  412. import {
  413. searchTaxList
  414. } from "@/api/base/tax.js";
  415. import {
  416. searchCurrencyList
  417. } from "@/api/base/currency.js";
  418. import {
  419. searchPaymentList
  420. } from "@/api/base/paymentTerm.js";
  421. import {
  422. searchDeliveryList
  423. } from "@/api/base/deliveryTerm.js";
  424. // 添加物料信息查询接口
  425. import {
  426. searchPartInfo
  427. } from '@/api/part/partInfo.js'
  428. export default {
  429. components: {
  430. Chooselist
  431. },
  432. name: 'InquiryList',
  433. data() {
  434. return {
  435. tableHeight: 200,
  436. subTableHeight: 200,
  437. loading: false,
  438. submitLoading: false,
  439. materialLoading: false,
  440. materialSubmitLoading: false,
  441. taxLoading: false,
  442. currencyLoading: false,
  443. pamentLoading: false,
  444. deliveryLoading: false,
  445. dataList: [],
  446. pageIndex: 1,
  447. pageSize: 20,
  448. totalPage: 0,
  449. searchData: {
  450. site: this.$store.state.user.site,
  451. orderNo: '',
  452. supplierId: '',
  453. supplierName: '',
  454. status: ''
  455. },
  456. taxList: [],
  457. taxForm: {
  458. taxRate: '',
  459. taxCode: null,
  460. taxDesc: ''
  461. },
  462. currencyList: [],
  463. currencyForm: {
  464. currency: '',
  465. currencyDesc: ''
  466. },
  467. paymentList: [],
  468. paymentForm: {
  469. paymentTermId: '',
  470. paymentTerm: ''
  471. },
  472. deliveryList: [],
  473. deliveryForm: {
  474. deliveryTermId:'',
  475. deliveryTerm:''
  476. },
  477. dialogVisible: false,
  478. dialogTitle: '新增询价单',
  479. editMode: false,
  480. form: {
  481. id: '',
  482. taxRate: '',
  483. paymentTerm: '',
  484. paymentTermDesc: '',
  485. deliveryTerm: '',
  486. deliveryTermDesc: '',
  487. currency: '',
  488. currencyDesc: '',
  489. orderNo: '',
  490. supplierId: '',
  491. supplierName: '',
  492. orderDate: '',
  493. wantReplyDate: '',
  494. userName: '',
  495. buyer: '',
  496. currencyRate: 1,
  497. taxRate: 0,
  498. taxCode:'',
  499. otherCondition: '',
  500. phoneNo: '',
  501. faxNo: '',
  502. contact: '',
  503. remark: '',
  504. printed : "N",
  505. status: '待提交'
  506. },
  507. // 物料子表相关
  508. currentInquiry: null,
  509. materialList: [],
  510. materialDialogVisible: false,
  511. materialDialogTitle: '新增物料',
  512. materialForm: {
  513. id: null,
  514. site: this.$store.state.user.site,
  515. partNo: '',
  516. partDesc: '',
  517. umid: '',
  518. spec: '',
  519. qty: 0,
  520. remark2: '',
  521. status: '待提交'
  522. },
  523. searchParams: {
  524. orderRef1: '',
  525. orderRef2: '',
  526. orderRef3: '',
  527. orderReftype: ''
  528. },
  529. fileList: [],
  530. fileList2: [],
  531. ossVisible: false,
  532. ossForm: {
  533. remark: '',
  534. },
  535. uploadLoading: false,
  536. // staged files selected in upload dialog but not yet persisted
  537. stagedFiles: [],
  538. stagedFileRemark: '',
  539. uploadDialogTitle: '上传附件',
  540. uploadDialogVisible: false,
  541. tagNo: null,
  542. tagNo1: null
  543. }
  544. },
  545. mounted() {
  546. this.$nextTick(() => {
  547. this.tableHeight = (window.innerHeight - 250) / 2
  548. this.subTableHeight = (window.innerHeight - 250) / 2
  549. })
  550. // this.calcHeight()
  551. // window.addEventListener('resize', this.calcHeight)
  552. this.getList()
  553. this.getTaxList()
  554. this.getCurrencyList()
  555. this.getPamentList()
  556. this.getDeliveryList()
  557. },
  558. beforeDestroy() {
  559. // window.removeEventListener('resize', this.calcHeight)
  560. },
  561. methods: {
  562. // calcHeight() {
  563. // this.$nextTick(() => {
  564. // this.tableHeight = window.innerHeight - 360
  565. // this.subTableHeight = 220
  566. // })
  567. // },
  568. getBaseList(val, type) {
  569. this.tagNo = val
  570. this.tagNo1 = type
  571. this.$nextTick(() => {
  572. let strVal = ''
  573. if (val === 520) {
  574. if(type == 1) {
  575. strVal = this.form.supplierId
  576. }
  577. }
  578. if (val === 529) {
  579. strVal = this.form.buyer
  580. }
  581. if(val === 507) {
  582. strVal = this.form.part_spec
  583. }
  584. if (val === 510) {
  585. strVal = this.form.unit
  586. }
  587. this.$refs.baseList.init(val, strVal?strVal:'')
  588. })
  589. },
  590. getBaseData(val) {
  591. if (this.tagNo === 520) {
  592. this.form.supplierId = val.supplier_no
  593. this.form.supplierName = val.supplier_name
  594. this.searchSupplierInfo()
  595. }
  596. if (this.tagNo === 529) {
  597. this.form.buyer = val.UserName
  598. }
  599. if(this.tagNo === 507) {
  600. this.materialForm.partNo = val.part_no
  601. this.materialForm.partDesc = val.part_desc
  602. this.materialForm.spec = val.part_spec
  603. this.materialForm.umid = val.unit
  604. this.getPartInfo()
  605. }
  606. if (this.tagNo === 510) {
  607. this.materialForm.umid = val.UMID
  608. }
  609. },
  610. // 供应商编码变化时触发,自动带出供应商信息
  611. handleSupplierIdChange(val) {
  612. if (!val || val.trim() === '') {
  613. return
  614. }
  615. // 调用查询供应商信息接口
  616. const params = {
  617. site: this.$store.state.user.site,
  618. supplierNo: val.trim()
  619. }
  620. this.searchSupplierInfo()
  621. },
  622. searchSupplierInfo() {
  623. const params = {
  624. site: this.$store.state.user.site,
  625. supplierNo: this.form.supplierId
  626. }
  627. getSupplierInfo(params).then(({data}) => {
  628. if (data.code === 0) {
  629. this.form.supplierId = data.row.supplierId || this.form.supplierId
  630. this.form.supplierName = data.row.supplierName || this.form.supplierName
  631. this.form.phoneNo = data.row.phoneNo || this.form.phoneNo
  632. this.form.faxNo = data.row.faxNo || this.form.faxNo
  633. this.form.contact = data.row.contact || this.form.contact
  634. this.form.taxRate = data.row.taxRate || this.taxForm.taxRate
  635. this.form.taxCode = data.row.taxCode || this.taxForm.taxCode
  636. this.form.paymentTerm = data.row.paymentTerm || this.paymentForm.paymentTermId
  637. this.form.paymentTermDesc = data.row.paymentTermDesc || this.paymentForm.paymentTerm
  638. this.form.deliveryTerm = data.row.deliveryTerm || this.deliveryForm.deliveryTermId
  639. this.form.deliveryTermDesc = data.row.deliveryTermDesc || this.deliveryForm.deliveryTerm
  640. this.form.currency = data.row.currency || this.currencyForm.currency
  641. } else {
  642. this.$message.error((data && data.msg) || '获取列表失败')
  643. }
  644. }).catch(() => {
  645. this.$message.error('请求失败')
  646. })
  647. },
  648. getList() {
  649. this.loading = true
  650. const params = {
  651. ...this.searchData,
  652. limit: this.pageSize,
  653. page: this.pageIndex
  654. }
  655. searchPurHeaderList(params).then(({data}) => {
  656. if (data.code === 0) {
  657. this.dataList = data.page.list
  658. this.totalPage = data.page.totalCount
  659. // 保留选中状态
  660. if (this.currentInquiry) {
  661. const exists = this.dataList.some(item => item.orderNo === this.currentInquiry.orderNo)
  662. if (exists) {
  663. this.selectInquiry(this.currentInquiry)
  664. } else {
  665. this.materialList = []
  666. this.currentInquiry = null
  667. }
  668. } else if (this.dataList.length > 0 && !this.currentInquiry) {
  669. this.selectInquiry(this.dataList[0])
  670. }
  671. } else {
  672. this.$message.error((data && data.msg) || '获取列表失败')
  673. }
  674. this.loading = false
  675. }).catch(() => {
  676. this.loading = false
  677. this.$message.error('请求失败')
  678. })
  679. },
  680. sizeChangeHandle(val) {
  681. this.pageSize = val
  682. this.pageIndex = 1
  683. this.getList()
  684. },
  685. currentChangeHandle(val) {
  686. this.pageIndex = val
  687. this.getList()
  688. },
  689. selectInquiry(row) {
  690. this.currentInquiry = row
  691. this.loadMaterialList(row.orderNo)
  692. },
  693. //加载税率列表
  694. getTaxList() {
  695. this.taxLoading = true
  696. searchTaxList({
  697. site: this.$store.state.user.site
  698. }).then(({data}) => {
  699. if (data.code === 0) {
  700. this.taxList = data.rows || []
  701. } else {
  702. this.taxList = []
  703. }
  704. this.taxLoading = false
  705. }).catch(() => {
  706. this.taxList = []
  707. this.taxLoading = false
  708. this.$message.error('获取税率列表失败')
  709. })
  710. },
  711. //加载货币列表
  712. getCurrencyList() {
  713. this.currencyLoading = true
  714. searchCurrencyList({
  715. site: this.$store.state.user.site
  716. }).then(({data}) => {
  717. if (data.code === 0) {
  718. this.currencyList = data.rows || []
  719. } else {
  720. this.currencyList = []
  721. }
  722. this.currencyLoading = false
  723. }).catch(() => {
  724. this.currencyList = []
  725. this.currencyLoading = false
  726. this.$message.error('获取货币列表失败')
  727. })
  728. },
  729. //加载付款方式列表
  730. getPamentList() {
  731. this.pamentLoading = true
  732. searchPaymentList({
  733. site: this.$store.state.user.site
  734. }).then(({data}) => {
  735. if (data.code === 0) {
  736. this.paymentList = data.rows || []
  737. } else {
  738. this.paymentList = []
  739. }
  740. this.pamentLoading = false
  741. }).catch(() => {
  742. this.paymentList = []
  743. this.pamentLoading = false
  744. this.$message.error('获取付款方式列表失败')
  745. })
  746. },
  747. //加载交易条款列表
  748. getDeliveryList() {
  749. this.deliveryLoading = true
  750. searchDeliveryList({
  751. site: this.$store.state.user.site
  752. }).then(({data}) => {
  753. if (data.code === 0) {
  754. this.deliveryList = data.rows || []
  755. } else {
  756. this.deliveryList = []
  757. }
  758. this.deliveryLoading = false
  759. }).catch(() => {
  760. this.deliveryList = []
  761. this.deliveryLoading = false
  762. this.$message.error('获取交易条款列表失败')
  763. })
  764. },
  765. // 加载物料列表
  766. loadMaterialList(orderNo) {
  767. this.materialLoading = true
  768. searchMaterialList({ orderNo: orderNo }).then(({data}) => {
  769. if (data.code === 0) {
  770. this.materialList = data.rows || []
  771. } else {
  772. this.materialList = []
  773. }
  774. this.materialLoading = false
  775. }).catch(() => {
  776. this.materialList = []
  777. this.materialLoading = false
  778. this.$message.error('获取物料列表失败')
  779. })
  780. },
  781. openDialog(row) {
  782. if (row) {
  783. this.dialogTitle = '编辑询价单'
  784. this.editMode = true
  785. this.form = { ...row }
  786. } else {
  787. this.dialogTitle = '新增询价单'
  788. this.editMode = false
  789. const today = this.getTodayDate()
  790. this.form = {
  791. id: '',
  792. site: this.$store.state.user.site,
  793. orderNo: '',
  794. supplierId: '',
  795. supplierName: '',
  796. orderDate: today,
  797. wantReplyDate: today,
  798. userName: this.$store.state.user.name,
  799. buyer: '',
  800. paymentTerm: '',
  801. paymentTermDesc: '',
  802. deliveryTerm: '',
  803. deliveryTermDesc: '',
  804. currency: '',
  805. currencyRate: 1,
  806. taxRate: 0,
  807. taxCode:'',
  808. otherCondition: '',
  809. phoneNo: '',
  810. faxNo: '',
  811. contact: '',
  812. remark: '',
  813. printed : "N",
  814. status: '待提交'
  815. }
  816. }
  817. this.dialogVisible = true
  818. },
  819. validateForm() {
  820. if (!this.form.supplierId) { this.$message.warning('供应商编码不能为空'); return false }
  821. if (!this.form.supplierName) { this.$message.warning('供应商名称不能为空'); return false }
  822. //付款方式不能为空
  823. if(!this.form.paymentTerm) { this.$message.warning('付款方式不能为空');return false}
  824. //交易条款不能为空
  825. if(!this.form.deliveryTerm) { this.$message.warning('交易条款不能为空');return false}
  826. //货币不能为空
  827. if(!this.form.currency) { this.$message.warning('货币不能为空');return false}
  828. //货币汇率不能为空
  829. if(!this.form.currencyRate) { this.$message.warning('货币汇率不能为空');return false}
  830. //税率不能为空
  831. if(!this.form.taxCode) { this.$message.warning('税率不能为空');return false}
  832. return true
  833. },
  834. getTodayDate() {
  835. const today = new Date()
  836. const year = today.getFullYear()
  837. const month = String(today.getMonth() + 1).padStart(2, '0')
  838. const day = String(today.getDate()).padStart(2, '0')
  839. return `${year}-${month}-${day}`
  840. },
  841. submitForm() {
  842. if (!this.validateForm()) return
  843. this.submitLoading = true
  844. const api = this.editMode ? updatePurHeader : createPurHeader
  845. api(this.form).then(({data}) => {
  846. if (data && data.code === 0) {
  847. this.$message.success('保存成功')
  848. this.dialogVisible = false
  849. this.getList()
  850. } else {
  851. this.$message.error((data && data.msg) || '保存失败')
  852. }
  853. }).catch(err => {
  854. this.$message.error('请求失败: ' + err.message)
  855. }).finally(() => {
  856. this.submitLoading = false
  857. })
  858. },
  859. handleDelete(row) {
  860. this.$confirm('确定删除询价单: ' + row.orderNo + ' ?', '提示', { type: 'warning' }).then(() => {
  861. deletePurHeader({ id: row.id }).then(({data}) => {
  862. if (data && data.code === 0) {
  863. this.$message.success('删除成功')
  864. this.getList()
  865. } else {
  866. this.$message.error((data && data.msg) || '删除失败')
  867. }
  868. }).catch(err => {
  869. this.$message.error('删除失败: ' + err.message)
  870. })
  871. }).catch(() => {})
  872. },
  873. updateQuoDetail(row) {
  874. this.$confirm('确定提交询价单: ' + row.orderNo + ' ?', '提示', { type: 'warning' }).then(() => {
  875. updatePurDetailStatus({
  876. orderNo: row.orderNo,
  877. site: row.site,
  878. status : "待报价",
  879. submitFlag : "Y"
  880. }).then(({data}) => {
  881. if (data && data.code === 0) {
  882. this.$message.success('提交成功')
  883. this.getList()
  884. } else {
  885. this.$message.error((data && data.msg) || '提交失败')
  886. }
  887. }).catch(err => {
  888. this.$message.error('提交失败: ' + err.message)
  889. })
  890. }).catch(() => {})
  891. },
  892. closePurHeader(row) {
  893. this.$confirm('确定关闭询价单: ' + row.orderNo + ' ?', '提示', { type: 'warning' }).then(() => {
  894. updatePurHeaderStatus({ id: row.id,status: '已关闭' }).then(({data}) => {
  895. if (data && data.code === 0) {
  896. this.$message.success('操作成功')
  897. this.getList()
  898. } else {
  899. this.$message.error((data && data.msg) || '操作失败')
  900. }
  901. }).catch(err => {
  902. this.$message.error('操作失败: ' + err.message)
  903. })
  904. }).catch(() => {})
  905. },
  906. // 物料操作
  907. openMaterialDialog(row) {
  908. if (!this.currentInquiry) {
  909. this.$message.warning('请先选择一个询价单')
  910. return
  911. }
  912. if (row) {
  913. this.materialDialogTitle = '编辑物料'
  914. this.materialForm = { ...row }
  915. } else {
  916. this.materialDialogTitle = '新增物料'
  917. this.materialForm = {
  918. id: null,
  919. site: this.$store.state.user.site,
  920. partNo: '',
  921. partDesc: '',
  922. umid: '',
  923. spec: '',
  924. qty: 0,
  925. remark2: '',
  926. status: '待提交'
  927. }
  928. }
  929. this.materialDialogVisible = true
  930. },
  931. // 物料编码变化时触发,自动带出物料信息
  932. handlePartNoChange(val) {
  933. if (!val || val.trim() === '') {
  934. return
  935. }
  936. // 假设有一个 getPartInfo 接口
  937. this.getPartInfo()
  938. },
  939. getPartInfo(){
  940. // 调用物料信息查询接口
  941. const params = {
  942. site: this.$store.state.user.site,
  943. partNo: this.materialForm.partNo
  944. }
  945. searchPartInfo(params).then(({data}) => {
  946. console.log(data)
  947. if (data.code === 0) {
  948. // 自动填充物料相关信息
  949. this.materialForm.partNo = data.data.partNo || val
  950. this.materialForm.partDesc = data.data.partDesc || this.materialForm.partDesc
  951. this.materialForm.spec = data.data.partSpec || this.materialForm.spec
  952. this.materialForm.umid = data.data.unit || this.materialForm.umid
  953. // this.$message.success('已自动获取物料信息')
  954. } else {
  955. this.$message.warning('未找到该物料信息,请手动填写')
  956. }
  957. }).catch(() => {
  958. this.$message.error('获取物料信息失败')
  959. })
  960. },
  961. saveMaterial() {
  962. if (!this.materialForm.partNo) {
  963. this.$message.warning('物料编码不能为空')
  964. return
  965. }
  966. if (!this.materialForm.partDesc) {
  967. this.$message.warning('物料名称不能为空')
  968. return
  969. }
  970. if(!this.materialForm.umid){
  971. this.$message.warning('请选择计量单位')
  972. return
  973. }
  974. if(this.materialForm.qty <= 0){
  975. this.$message.warning('请选择询价数量')
  976. return
  977. }
  978. this.materialSubmitLoading = true
  979. const submitData = {
  980. ...this.materialForm,
  981. orderNo: this.currentInquiry.orderNo
  982. }
  983. const api = this.materialForm.id ? updateMaterial : createMaterial
  984. api(submitData).then(({data}) => {
  985. if (data && data.code === 0) {
  986. this.$message.success('保存成功')
  987. this.materialDialogVisible = false
  988. this.loadMaterialList(this.currentInquiry.orderNo)
  989. } else {
  990. this.$message.error((data && data.msg) || '保存失败')
  991. }
  992. }).catch(err => {
  993. this.$message.error('保存失败: ' + err.message)
  994. }).finally(() => {
  995. this.materialSubmitLoading = false
  996. })
  997. },
  998. deleteMaterial(row) {
  999. this.$confirm('确定删除物料: ' + row.partNo + ' ?', '提示', { type: 'warning' }).then(() => {
  1000. deleteMaterial({ id: row.id }).then(({data}) => {
  1001. if (data && data.code === 0) {
  1002. this.$message.success('删除成功')
  1003. this.loadMaterialList(this.currentInquiry.orderNo)
  1004. } else {
  1005. this.$message.error((data && data.msg) || '删除失败')
  1006. }
  1007. }).catch(err => {
  1008. this.$message.error('删除失败: ' + err.message)
  1009. })
  1010. }).catch(() => {})
  1011. },
  1012. openUploadDialog(row) {
  1013. if (!row) {
  1014. this.$message.warning('请先选择一个物料')
  1015. return
  1016. }
  1017. if (row) {
  1018. this.uploadDialogTitle = '上传附件'
  1019. this.searchParams = {
  1020. orderRef1: this.$store.state.user.site,
  1021. orderRef2: row.orderNo,
  1022. orderRef3: row.partNo,
  1023. orderReftype: 'purQuotationDetail'
  1024. }
  1025. }
  1026. this.uploadDialogVisible = true
  1027. this.searchTable()
  1028. },
  1029. // 关闭弹窗
  1030. handleClose() {
  1031. this.$emit('update:visible', false);
  1032. this.$emit('close');
  1033. },
  1034. // 关闭上传弹窗
  1035. handleUploadClose() {
  1036. this.fileList2 = [];
  1037. this.ossForm.remark = '';
  1038. },
  1039. // 查询文件列表
  1040. searchTable() {
  1041. queryOssFilePlus(this.searchParams).then(({ data }) => {
  1042. if (data && data.code == 0) {
  1043. this.fileList = data.rows || [];
  1044. } else {
  1045. this.fileList = [];
  1046. }
  1047. }).catch(() => {
  1048. this.fileList = [];
  1049. });
  1050. },
  1051. // 打开上传弹窗
  1052. handleUpload() {
  1053. this.$nextTick(() => {
  1054. if (this.$refs.upload) {
  1055. this.$refs.upload.clearFiles();
  1056. }
  1057. })
  1058. this.fileList2 = [];
  1059. this.ossForm.remark = '';
  1060. this.ossVisible = true;
  1061. },
  1062. onRemoveFile(file, fileList) {
  1063. this.fileList2 = fileList;
  1064. },
  1065. onChangeFile(file, fileList) {
  1066. this.fileList2 = fileList;
  1067. },
  1068. // 提交上传
  1069. submitData() {
  1070. if (this.fileList2.length === 0) {
  1071. this.$message.error('请选择文件');
  1072. return;
  1073. }
  1074. this.stagedFileRemark = this.ossForm.remark || '';
  1075. this.uploadLoading = true;
  1076. // 准备要上传的文件
  1077. const stagedFiles = [];
  1078. for (let i = 0; i < this.fileList2.length; i++) {
  1079. stagedFiles.push(this.fileList2[i].raw);
  1080. }
  1081. // 立即关闭弹窗
  1082. this.ossVisible = false;
  1083. this.fileList2 = [];
  1084. this.ossForm.remark = '';
  1085. // 上传文件
  1086. const formData = new FormData();
  1087. for (let i = 0; i < stagedFiles.length; i++) {
  1088. formData.append('file', stagedFiles[i]);
  1089. }
  1090. formData.append('orderRef1', this.searchParams.orderRef1 || '');
  1091. formData.append('orderRef2', this.searchParams.orderRef2 || '');
  1092. formData.append('orderRef3', this.searchParams.orderRef3 || '');
  1093. formData.append('createdBy', this.$store.state.user.name);
  1094. formData.append('fileRemark', this.stagedFileRemark || '');
  1095. formData.append('orderReftype', this.searchParams.orderReftype || 'purQuotationDetail');
  1096. ossUploadNoSaveOSSForYJY(formData)
  1097. .then(({ data }) => {
  1098. if (data && data.code === 0) {
  1099. // 移除临时文件,添加上传成功的文件
  1100. this.fileList = this.fileList.filter(f => !f._staged);
  1101. for (let i = 0; i < data.rows.length; i++) {
  1102. this.fileList.push(data.rows[i]);
  1103. }
  1104. // 清除暂存数据
  1105. this.stagedFiles = [];
  1106. this.stagedFileRemark = '';
  1107. this.uploadLoading = false;
  1108. this.$message.success('上传成功');
  1109. this.$emit('upload-success', data.rows);
  1110. } else {
  1111. this.uploadLoading = false;
  1112. this.$message.warning(data.msg || '文件上传失败');
  1113. }
  1114. })
  1115. .catch(err => {
  1116. this.uploadLoading = false;
  1117. this.$message.error(err.message || err);
  1118. });
  1119. },
  1120. // 下载/预览文件
  1121. handleDownload(row) {
  1122. let image = ['jpg', 'jpeg', 'png', 'gif', 'bmp'];
  1123. let video = ['mp4', 'avi', 'mov', 'wmv', 'flv'];
  1124. let office = ['doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx'];
  1125. let txt = ['txt'];
  1126. let pdf = ['pdf'];
  1127. let type = '';
  1128. if (image.includes(row.fileType.toLowerCase())) {
  1129. type = 'image/' + row.fileType;
  1130. downLoadObjectFile(row).then(({ data }) => {
  1131. const blob = new Blob([data], { type: type });
  1132. const fileURL = URL.createObjectURL(blob);
  1133. window.open(fileURL, '_blank');
  1134. });
  1135. } else if (video.includes(row.fileType.toLowerCase())) {
  1136. type = 'video/' + row.fileType;
  1137. downLoadObjectFile(row).then(({ data }) => {
  1138. const blob = new Blob([data], { type: type });
  1139. const fileURL = URL.createObjectURL(blob);
  1140. window.open(fileURL, '_blank');
  1141. });
  1142. } else if (txt.includes(row.fileType.toLowerCase())) {
  1143. type = 'text/plain';
  1144. downLoadObjectFile(row).then(({ data }) => {
  1145. const blob = new Blob([data], { type: type });
  1146. const fileURL = URL.createObjectURL(blob);
  1147. window.open(fileURL, '_blank');
  1148. });
  1149. } else if (office.includes(row.fileType.toLowerCase())) {
  1150. if (row.fileType.toLowerCase() === 'doc' || row.fileType.toLowerCase() === 'docx') {
  1151. type = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document';
  1152. } else if (row.fileType.toLowerCase() === 'ppt' || row.fileType.toLowerCase() === 'pptx') {
  1153. type = 'application/vnd.openxmlformats-officedocument.presentationml.presentation';
  1154. } else {
  1155. type = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';
  1156. }
  1157. downLoadObjectFile(row).then(({ data }) => {
  1158. const blob = new Blob([data], { type: 'application/octet-stream;charset=utf-8' });
  1159. const fileName = row.fileName;
  1160. const linkNode = document.createElement('a');
  1161. linkNode.download = fileName;
  1162. linkNode.style.display = 'none';
  1163. linkNode.href = URL.createObjectURL(blob);
  1164. document.body.appendChild(linkNode);
  1165. linkNode.click();
  1166. URL.revokeObjectURL(linkNode.href);
  1167. document.body.removeChild(linkNode);
  1168. });
  1169. } else if (pdf.includes(row.fileType.toLowerCase())) {
  1170. type = 'application/pdf';
  1171. downLoadObjectFile(row).then(({ data }) => {
  1172. const blob = new Blob([data], { type: type });
  1173. const fileURL = URL.createObjectURL(blob);
  1174. window.open(fileURL, '_blank');
  1175. });
  1176. } else {
  1177. this.$message({
  1178. message: '不支持的文件类型',
  1179. type: 'warning'
  1180. });
  1181. }
  1182. },
  1183. // 删除已保存的文件
  1184. deleteFileReal(row) {
  1185. if (!row || !row.id) return;
  1186. this.$confirm('确定要删除该文件吗?', '删除确认', {
  1187. confirmButtonText: '确定',
  1188. cancelButtonText: '取消',
  1189. type: 'warning'
  1190. }).then(() => {
  1191. removeOss([row.id]).then(({ data }) => {
  1192. if (data && data.code === 0) {
  1193. const idx = this.fileList.findIndex(f => f.id === row.id);
  1194. if (idx !== -1) this.fileList.splice(idx, 1);
  1195. this.$message.success(data.msg || '文件已删除');
  1196. this.$emit('delete-success', row);
  1197. } else {
  1198. this.$message.warning(data.msg || '删除失败');
  1199. }
  1200. }).catch(err => {
  1201. this.$message.error('删除失败:' + (err.message || err));
  1202. });
  1203. }).catch(() => { });
  1204. },
  1205. // 删除临时文件
  1206. deleteFile(index) {
  1207. const f = this.fileList[index];
  1208. if (f && f._staged && f.raw) {
  1209. const idx = this.stagedFiles.findIndex(sf => sf.name === f.raw.name && sf.size === f.raw.size);
  1210. if (idx !== -1) this.stagedFiles.splice(idx, 1);
  1211. }
  1212. this.fileList.splice(index, 1);
  1213. },
  1214. // 刷新列表
  1215. refresh() {
  1216. this.searchTable();
  1217. }
  1218. }
  1219. }
  1220. </script>
  1221. <style scoped>
  1222. .pi-search-form { margin-top:0; }
  1223. .pi-form { margin-top:-5px; }
  1224. .customer-a {
  1225. color: #409EFF;
  1226. cursor: pointer;
  1227. text-decoration: none;
  1228. }
  1229. .customer-a:hover {
  1230. text-decoration: underline;
  1231. }
  1232. .customer-bun-min {
  1233. margin-right: 8px;
  1234. }
  1235. .sub-title {
  1236. font-weight: 600;
  1237. margin: 16px 0 8px 0;
  1238. padding-left: 4px;
  1239. border-left: 4px solid #409eff;
  1240. line-height: 1.2;
  1241. color: #303133;
  1242. }
  1243. .status-badge {
  1244. display: inline-block;
  1245. padding: 2px 8px;
  1246. border-radius: 4px;
  1247. font-size: 12px;
  1248. }
  1249. .status-sent { background-color: #e6f7ff; color: #409eff; }
  1250. .status-closed { background-color: #fef0e6; color: #e6a23c; }
  1251. .material-action-btn {
  1252. color: #409EFF;
  1253. cursor: pointer;
  1254. margin: 0 4px;
  1255. }
  1256. .material-action-btn:hover {
  1257. text-decoration: underline;
  1258. }
  1259. .dialog-footer {
  1260. text-align: center;
  1261. }
  1262. .rq .auto /deep/ .el-form-item__content {
  1263. height: auto;
  1264. line-height: 1.5;
  1265. }
  1266. </style>