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.

1308 lines
46 KiB

  1. <template>
  2. <div class="app-container">
  3. <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
  4. <el-form-item label="产品名称" prop="name">
  5. <el-input
  6. v-model="queryParams.name"
  7. placeholder="请输入产品名称"
  8. clearable
  9. @keyup.enter.native="handleQuery"
  10. />
  11. </el-form-item>
  12. <el-form-item label="产品类型" prop="type">
  13. <el-select
  14. v-model="queryParams.type"
  15. placeholder="请输入产品类型"
  16. clearable
  17. >
  18. <el-option
  19. v-for="dict in dict.type.medicine_type"
  20. :key="dict.value"
  21. :label="dict.label"
  22. :value="dict.value"
  23. @keyup.enter.native="handleQuery"
  24. />
  25. </el-select>
  26. </el-form-item>
  27. <el-form-item label="产品分类" prop="category">
  28. <el-select
  29. v-model="queryParams.category"
  30. placeholder="请输入产品分类"
  31. clearable
  32. >
  33. <el-option
  34. v-for="dict in dict.type.vet_product_category"
  35. :key="dict.value"
  36. :label="dict.label"
  37. :value="dict.value"
  38. @keyup.enter.native="handleQuery"
  39. />
  40. </el-select>
  41. </el-form-item>
  42. <el-form-item label="生产厂家" prop="manufacturer">
  43. <el-input
  44. v-model="queryParams.manufacturer"
  45. placeholder="请输入生产厂家"
  46. clearable
  47. @keyup.enter.native="handleQuery"
  48. />
  49. </el-form-item>
  50. <el-form-item label="状态" prop="status">
  51. <el-select
  52. v-model="queryParams.status"
  53. placeholder="请选择状态"
  54. clearable
  55. >
  56. <el-option
  57. v-for="dict in dict.type.sys_publish_status"
  58. :key="dict.value"
  59. :label="dict.label"
  60. :value="dict.value"
  61. @keyup.enter.native="handleQuery"
  62. />
  63. </el-select>
  64. </el-form-item>
  65. <el-form-item label="审核状态" prop="auditStatus">
  66. <el-select
  67. v-model="queryParams.auditStatus"
  68. placeholder="请选择审核状态"
  69. clearable
  70. >
  71. <el-option
  72. v-for="dict in dict.type.audit_status.filter(item => item.value < 4)"
  73. :key="dict.value"
  74. :label="dict.label"
  75. :value="dict.value"
  76. @keyup.enter.native="handleQuery"
  77. />
  78. </el-select>
  79. </el-form-item>
  80. <!-- <el-form-item label="规格" prop="specification">-->
  81. <!-- <el-input-->
  82. <!-- v-model="queryParams.specification"-->
  83. <!-- placeholder="请输入规格"-->
  84. <!-- clearable-->
  85. <!-- @keyup.enter.native="handleQuery"-->
  86. <!-- />-->
  87. <!-- </el-form-item>-->
  88. <!-- <el-form-item label="单位" prop="unit">-->
  89. <!-- <el-input-->
  90. <!-- v-model="queryParams.unit"-->
  91. <!-- placeholder="请输入单位"-->
  92. <!-- clearable-->
  93. <!-- @keyup.enter.native="handleQuery"-->
  94. <!-- />-->
  95. <!-- </el-form-item>-->
  96. <!-- <el-form-item label="批准文号" prop="approvalNumber">-->
  97. <!-- <el-input-->
  98. <!-- v-model="queryParams.approvalNumber"-->
  99. <!-- placeholder="请输入批准文号"-->
  100. <!-- clearable-->
  101. <!-- @keyup.enter.native="handleQuery"-->
  102. <!-- />-->
  103. <!-- </el-form-item>-->
  104. <!-- <el-form-item label="销售价格" prop="price">-->
  105. <!-- <el-input-->
  106. <!-- v-model="queryParams.price"-->
  107. <!-- placeholder="请输入销售价格"-->
  108. <!-- clearable-->
  109. <!-- @keyup.enter.native="handleQuery"-->
  110. <!-- />-->
  111. <!-- </el-form-item>-->
  112. <!-- <el-form-item label="成本价" prop="costPrice">-->
  113. <!-- <el-input-->
  114. <!-- v-model="queryParams.costPrice"-->
  115. <!-- placeholder="请输入成本价"-->
  116. <!-- clearable-->
  117. <!-- @keyup.enter.native="handleQuery"-->
  118. <!-- />-->
  119. <!-- </el-form-item>-->
  120. <!-- <el-form-item label="库存数量" prop="stock">-->
  121. <!-- <el-input-->
  122. <!-- v-model="queryParams.stock"-->
  123. <!-- placeholder="请输入库存数量"-->
  124. <!-- clearable-->
  125. <!-- @keyup.enter.native="handleQuery"-->
  126. <!-- />-->
  127. <!-- </el-form-item>-->
  128. <!-- <el-form-item label="最低库存预警" prop="minStock">-->
  129. <!-- <el-input-->
  130. <!-- v-model="queryParams.minStock"-->
  131. <!-- placeholder="请输入最低库存预警"-->
  132. <!-- clearable-->
  133. <!-- @keyup.enter.native="handleQuery"-->
  134. <!-- />-->
  135. <!-- </el-form-item>-->
  136. <!-- <el-form-item label="治疗周期" prop="treatmentDuration">-->
  137. <!-- <el-input-->
  138. <!-- v-model="queryParams.treatmentDuration"-->
  139. <!-- placeholder="请输入治疗周期"-->
  140. <!-- clearable-->
  141. <!-- @keyup.enter.native="handleQuery"-->
  142. <!-- />-->
  143. <!-- </el-form-item>-->
  144. <!-- <el-form-item label="删除标识:0-正常/1-删除" prop="isDeleted">-->
  145. <!-- <el-input-->
  146. <!-- v-model="queryParams.isDeleted"-->
  147. <!-- placeholder="请输入删除标识:0-正常/1-删除"-->
  148. <!-- clearable-->
  149. <!-- @keyup.enter.native="handleQuery"-->
  150. <!-- />-->
  151. <!-- </el-form-item>-->
  152. <!-- <el-form-item label="诊所ID" prop="clinicId">-->
  153. <!-- <el-input-->
  154. <!-- v-model="queryParams.clinicId"-->
  155. <!-- placeholder="请输入诊所ID"-->
  156. <!-- clearable-->
  157. <!-- @keyup.enter.native="handleQuery"-->
  158. <!-- />-->
  159. <!-- </el-form-item>-->
  160. <!-- <el-form-item label="兽医ID" prop="vetId">-->
  161. <!-- <el-input-->
  162. <!-- v-model="queryParams.vetId"-->
  163. <!-- placeholder="请输入兽医ID"-->
  164. <!-- clearable-->
  165. <!-- @keyup.enter.native="handleQuery"-->
  166. <!-- />-->
  167. <!-- </el-form-item>-->
  168. <!-- <el-form-item label="创建时间" prop="createdAt">-->
  169. <!-- <el-date-picker clearable-->
  170. <!-- v-model="queryParams.createdAt"-->
  171. <!-- type="date"-->
  172. <!-- value-format="yyyy-MM-dd"-->
  173. <!-- placeholder="请选择创建时间">-->
  174. <!-- </el-date-picker>-->
  175. <!-- </el-form-item>-->
  176. <!-- <el-form-item label="更新时间" prop="updatedAt">-->
  177. <!-- <el-date-picker clearable-->
  178. <!-- v-model="queryParams.updatedAt"-->
  179. <!-- type="date"-->
  180. <!-- value-format="yyyy-MM-dd"-->
  181. <!-- placeholder="请选择更新时间">-->
  182. <!-- </el-date-picker>-->
  183. <!-- </el-form-item>-->
  184. <el-form-item>
  185. <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
  186. <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
  187. </el-form-item>
  188. </el-form>
  189. <el-row :gutter="10" class="mb8">
  190. <el-col :span="1.5">
  191. <el-button
  192. type="primary"
  193. plain
  194. icon="el-icon-plus"
  195. size="mini"
  196. @click="handleAdd"
  197. v-hasPermi="['vet:product:add']"
  198. >新增</el-button>
  199. </el-col>
  200. <el-col :span="1.5">
  201. <el-button
  202. type="success"
  203. plain
  204. icon="el-icon-edit"
  205. size="mini"
  206. :disabled="single"
  207. @click="handleUpdate"
  208. v-hasPermi="['vet:product:edit']"
  209. >修改</el-button>
  210. </el-col>
  211. <el-col :span="1.5">
  212. <el-button
  213. type="danger"
  214. plain
  215. icon="el-icon-delete"
  216. size="mini"
  217. :disabled="multiple"
  218. @click="handleDelete"
  219. v-hasPermi="['vet:product:remove']"
  220. >删除</el-button>
  221. </el-col>
  222. <!-- <el-col :span="1.5">-->
  223. <!-- <el-button-->
  224. <!-- type="warning"-->
  225. <!-- plain-->
  226. <!-- icon="el-icon-download"-->
  227. <!-- size="mini"-->
  228. <!-- @click="handleExport"-->
  229. <!-- v-hasPermi="['vet:product:export']"-->
  230. <!-- >导出</el-button>-->
  231. <!-- </el-col>-->
  232. <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
  233. </el-row>
  234. <!-- 表格部分 -->
  235. <el-table v-loading="loading" :data="productList" @selection-change="handleSelectionChange">
  236. <el-table-column type="selection" width="55" align="center"/>
  237. <!-- <el-table-column label="主键ID" align="center" prop="id" />-->
  238. <el-table-column label="产品名称" align="center" prop="name" min-width="220" show-overflow-tooltip/>
  239. <el-table-column label="相关图片" align="center" prop="mainImage" width="100">
  240. <template slot-scope="scope">
  241. <image-preview :src="scope.row.mainImage" :width="50" :height="50"/>
  242. </template>
  243. </el-table-column>
  244. <el-table-column label="产品类型" align="center" prop="type" width="100">
  245. <template slot-scope="scope">
  246. <el-tag
  247. :type="getTypeTagType(scope.row.type)"
  248. size="small"
  249. >
  250. {{ scope.row.type }}
  251. </el-tag>
  252. </template>
  253. </el-table-column>
  254. <el-table-column label="产品分类" align="center" prop="category" width="120">
  255. <template slot-scope="scope">
  256. <el-tag
  257. :type="getCategoryTagType(scope.row.category)"
  258. size="small"
  259. >
  260. {{ scope.row.category }}
  261. </el-tag>
  262. </template>
  263. </el-table-column>
  264. <el-table-column label="规格" align="center" prop="specification" width="120"/>
  265. <!-- <el-table-column label="单位" align="center" prop="unit" />-->
  266. <el-table-column label="价格" align="center" prop="price" width="120" sortable>
  267. <template slot-scope="scope">
  268. <div class="price-cell">
  269. <div class="price-text" >¥{{ scope.row.price }}</div>
  270. <div class="cost-price">成本: ¥{{ scope.row.costPrice }}</div>
  271. </div>
  272. </template>
  273. </el-table-column>
  274. <el-table-column label="库存" align="center" prop='stock' width="120" sortable>
  275. <template slot-scope="scope">
  276. <div class="stock-cell">
  277. <div class='stock-text'>
  278. <i class="el-icon-box"></i>
  279. {{ scope.row.stock }}
  280. </div>
  281. <div class="min-stock">预警: {{ scope.row.minStock }}</div>
  282. </div>
  283. </template>
  284. </el-table-column>
  285. <el-table-column label="生产厂家" align="center" prop="manufacturer" width="150" show-overflow-tooltip/>
  286. <el-table-column label="产品状态" prop="status" width="100" align="center">
  287. <template slot-scope="scope">
  288. <el-tag :type="getStatusTagType(scope.row.status)" size="small">
  289. {{ getStatusText(scope.row.status) }}
  290. </el-tag>
  291. </template>
  292. </el-table-column>
  293. <el-table-column label="审核状态" prop="auditStatus" width="120" align="center">
  294. <template slot-scope="scope">
  295. <el-tag :type="getAuditStatusTagType(scope.row.auditStatus)" size="small">
  296. {{ getAuditStatusText(scope.row.auditStatus) }}
  297. </el-tag>
  298. </template>
  299. </el-table-column>
  300. <!-- <el-table-column label="批准文号" align="center" prop="approvalNumber" />-->
  301. <!-- <el-table-column label="主要成分" align="center" prop="ingredients" />-->
  302. <!-- <el-table-column label="适应症" align="center" prop="indications" />-->
  303. <!-- <el-table-column label="用法用量" align="center" prop="usageDosage" />-->
  304. <!-- <el-table-column label="销售价格" align="center" prop="price" />-->
  305. <!-- <el-table-column label="成本价" align="center" prop="costPrice" />-->
  306. <!-- <el-table-column label="库存数量" align="center" prop="stock" />-->
  307. <!-- <el-table-column label="最低库存预警" align="center" prop="minStock" />-->
  308. <!-- <el-table-column label="多张图片URL,JSON格式" align="center" prop="images" />-->
  309. <!-- <el-table-column label="适用动物:如犬、猫、猪等" align="center" prop="treatAnimals" />-->
  310. <!-- <el-table-column label="治疗疾病" align="center" prop="treatDiseases" />-->
  311. <!-- <el-table-column label="治疗方案/内容" align="center" prop="treatmentContent" />-->
  312. <!-- <el-table-column label="治疗周期" align="center" prop="treatmentDuration" />-->
  313. <!-- <el-table-column label="注意事项" align="center" prop="precautions" />-->
  314. <!-- <el-table-column label="状态:0-草稿/1-上架/2-下架" align="center" prop="status" />-->
  315. <!-- <el-table-column label="删除标识:0-正常/1-删除" align="center" prop="isDeleted" />-->
  316. <!-- <el-table-column label="诊所ID" align="center" prop="clinicId" />-->
  317. <!-- <el-table-column label="兽医ID" align="center" prop="vetId" />-->
  318. <!-- <el-table-column label="创建时间" align="center" prop="createdAt" width="180">-->
  319. <!-- <template slot-scope="scope">-->
  320. <!-- <span>{{ parseTime(scope.row.createdAt, '{y}-{m}-{d}') }}</span>-->
  321. <!-- </template>-->
  322. <!-- </el-table-column>-->
  323. <!-- <el-table-column label="更新时间" align="center" prop="updatedAt" width="180">-->
  324. <!-- <template slot-scope="scope">-->
  325. <!-- <span>{{ parseTime(scope.row.updatedAt, '{y}-{m}-{d}') }}</span>-->
  326. <!-- </template>-->
  327. <!-- </el-table-column>-->
  328. <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="300">
  329. <!-- <template slot-scope="scope">-->
  330. <!-- <el-button-->
  331. <!-- size="mini"-->
  332. <!-- type="text"-->
  333. <!-- icon="el-icon-edit"-->
  334. <!-- @click="handleUpdate(scope.row)"-->
  335. <!-- v-hasPermi="['vet:product:edit']"-->
  336. <!-- >修改</el-button>-->
  337. <!-- <el-button-->
  338. <!-- size="mini"-->
  339. <!-- type="text"-->
  340. <!-- icon="el-icon-delete"-->
  341. <!-- @click="handleDelete(scope.row)"-->
  342. <!-- v-hasPermi="['vet:product:remove']"-->
  343. <!-- >删除</el-button>-->
  344. <!-- </template>-->
  345. <template slot-scope="scope">
  346. <el-button
  347. size="mini"
  348. type="text"
  349. icon="el-icon-view"
  350. @click="handleDetail(scope.row)"
  351. class="info-btn view-btn"
  352. >
  353. 详情
  354. </el-button>
  355. <el-button
  356. size="mini"
  357. type="text"
  358. icon="el-icon-edit"
  359. style="color: #42B983"
  360. @click="handleUpdate(scope.row)"
  361. class="info-btn alter-btn"
  362. v-hasPermi="['vet:product:edit']"
  363. v-if="scope.row.status === '0' && (scope.row.auditStatus === '0' || scope.row.auditStatus === '3')"
  364. >
  365. 编辑
  366. </el-button>
  367. <el-button
  368. size="mini"
  369. type="text"
  370. icon="el-icon-delete"
  371. style="color: #f56c6c"
  372. @click="handleDelete(scope.row)"
  373. class="info-btn delete-btn"
  374. v-hasPermi="['vet:product:remove']"
  375. >
  376. 删除
  377. </el-button>
  378. <el-button
  379. size="mini"
  380. type="text"
  381. icon="el-icon-s-promotion"
  382. style="color: #dab708"
  383. @click="handleSubmitAudit(scope.row)"
  384. class="info-btn submit-btn"
  385. v-hasPermi="['vet:product:submit']"
  386. v-if="scope.row.status === '0' && scope.row.auditStatus === '0'"
  387. >
  388. 提交审核
  389. </el-button>
  390. <el-button
  391. size="mini"
  392. type="text"
  393. icon="el-icon-top"
  394. style="color: #f46a0c"
  395. @click="handlePublish(scope.row)"
  396. class="info-btn publish-btn"
  397. v-hasPermi="['vet:product:publish']"
  398. v-if="scope.row.auditStatus === '2' && scope.row.status === '0'"
  399. >
  400. 上架
  401. </el-button>
  402. <el-button
  403. size="mini"
  404. type="text"
  405. icon="el-icon-bottom"
  406. style="color: #636361"
  407. @click="handleOffline(scope.row)"
  408. class="info-btn offline-btn"
  409. v-hasPermi="['vet:product:offline']"
  410. v-if="scope.row.status === '1'"
  411. >
  412. 下架
  413. </el-button>
  414. <el-button
  415. size="mini"
  416. type="text"
  417. icon="el-icon-close"
  418. style="color: #5607b3"
  419. @click="handleCancelAudit(scope.row)"
  420. class="info-btn cancel-btn"
  421. v-hasPermi="['vet:product:edit']"
  422. v-if="scope.row.status === '0' && scope.row.auditStatus === '1'"
  423. >
  424. 取消审核
  425. </el-button>
  426. <el-button
  427. size="mini"
  428. type="text"
  429. icon="el-icon-s-promotion"
  430. style="color: #c108af"
  431. @click="handleResubmitAudit(scope.row)"
  432. class="info-btn resubmit-btn"
  433. v-hasPermi="['vet:product:submit']"
  434. v-if="scope.row.status === '0' && scope.row.auditStatus === '3'"
  435. >
  436. 重新提交
  437. </el-button>
  438. </template>
  439. </el-table-column>
  440. </el-table>
  441. <!-- 分页 -->
  442. <div class="pagestyle">
  443. <pagination
  444. v-show="total>0"
  445. :total="total"
  446. :page.sync="queryParams.pageNum"
  447. :limit.sync="queryParams.pageSize"
  448. @pagination="getList"
  449. />
  450. </div>
  451. <!-- 新增/修改弹窗 -->
  452. <el-dialog :title="title" :visible.sync="open" width="80%" append-to-body>
  453. <el-form ref="form" :model="form" :rules="rules" label-width="80px">
  454. <el-tabs v-model="activeName" type="card">
  455. <el-tab-pane label="基本信息" name="first">
  456. <el-row>
  457. <el-col :span="24">
  458. <el-form-item label="产品名称" prop="name">
  459. <el-input v-model="form.name" placeholder="请输入产品名称" />
  460. </el-form-item>
  461. </el-col>
  462. </el-row>
  463. <el-row>
  464. <el-col :span="12">
  465. <el-form-item label="产品类型" prop="type">
  466. <el-select v-model="form.type" placeholder="请选择产品类型" clearable>
  467. <el-option v-for="dict in dict.type.medicine_type" :key="dict.value" :label="dict.label" :value="dict.value" />
  468. </el-select>
  469. </el-form-item>
  470. </el-col>
  471. <el-col :span="12">
  472. <el-form-item label="产品分类" prop="category">
  473. <el-select v-model="form.category" placeholder="请选择产品分类" clearable>
  474. <el-option v-for="dict in dict.type.vet_product_category" :key="dict.value" :label="dict.label" :value="dict.value" />
  475. </el-select>
  476. </el-form-item>
  477. </el-col>
  478. </el-row>
  479. <el-row>
  480. <el-col :span="12">
  481. <el-form-item label="生产厂家" prop="manufacturer">
  482. <el-input v-model="form.manufacturer" placeholder="请输入生产厂家" />
  483. </el-form-item>
  484. </el-col>
  485. <el-col :span="12">
  486. <el-form-item label="批准文号" prop="approvalNumber">
  487. <el-input v-model="form.approvalNumber" placeholder="请输入批准文号" />
  488. </el-form-item>
  489. </el-col>
  490. </el-row>
  491. <el-form-item label="相关图片" prop="mainImage">
  492. <image-upload v-model="form.mainImage"/>
  493. </el-form-item>
  494. </el-tab-pane>
  495. <el-tab-pane label="价格库存" name="second">
  496. <el-row>
  497. <el-col :span="12">
  498. <el-form-item label="销售价格" prop="price">
  499. <el-input v-model="form.price" placeholder="请输入销售价格" />
  500. </el-form-item>
  501. </el-col>
  502. <el-col :span="12">
  503. <el-form-item label="成本价" prop="costPrice">
  504. <el-input v-model="form.costPrice" placeholder="请输入成本价" />
  505. </el-form-item>
  506. </el-col>
  507. </el-row>
  508. <el-row>
  509. <el-col :span="12">
  510. <el-form-item label="库存数量" prop="stock">
  511. <el-input v-model="form.stock" placeholder="请输入库存数量" />
  512. </el-form-item>
  513. </el-col>
  514. <el-col :span="12">
  515. <el-form-item label="库存预警" prop="minStock">
  516. <el-input v-model="form.minStock" placeholder="请输入最低库存预警" />
  517. </el-form-item>
  518. </el-col>
  519. </el-row>
  520. </el-tab-pane>
  521. <el-tab-pane label="产品详情" name="third">
  522. <el-row>
  523. <el-col :span="24">
  524. <el-form-item label="适用动物(如犬、猫)" prop="treatAnimals">
  525. <el-input v-model="form.treatAnimals" type="textarea" placeholder="请输入内容" />
  526. </el-form-item>
  527. </el-col>
  528. </el-row>
  529. <el-row>
  530. <el-col :span="24">
  531. <el-form-item label="治疗疾病" prop="treatDiseases">
  532. <el-input v-model="form.treatDiseases" type="textarea" placeholder="请输入内容" />
  533. </el-form-item>
  534. </el-col>
  535. </el-row>
  536. <el-row>
  537. <el-col :span="24">
  538. <el-form-item label="治疗方案/内容">
  539. <editor v-model="form.treatmentContent" :min-height="192"/>
  540. </el-form-item>
  541. </el-col>
  542. </el-row>
  543. <el-row>
  544. <el-col :span="24">
  545. <el-form-item label="治疗周期" prop="treatmentDuration">
  546. <el-input v-model="form.treatmentDuration" placeholder="请输入治疗周期" />
  547. </el-form-item>
  548. </el-col>
  549. </el-row>
  550. <el-row>
  551. <el-col :span="24">
  552. <el-form-item label="注意事项" prop="precautions">
  553. <el-input v-model="form.precautions" type="textarea" placeholder="请输入内容" />
  554. </el-form-item>
  555. </el-col>
  556. </el-row>
  557. </el-tab-pane>
  558. </el-tabs>
  559. <!-- <el-dialog :title="title" :visible.sync="open" width="80%" append-to-body>-->
  560. <!-- <el-form ref="form" :model="form" :rules="rules" label-width="80px">-->
  561. <!-- <el-form-item label="产品名称" prop="name">-->
  562. <!-- <el-input v-model="form.name" placeholder="请输入产品名称" />-->
  563. <!-- </el-form-item>-->
  564. <!-- <el-form-item label="产品类型" prop="type">-->
  565. <!-- <el-select v-model="form.type" placeholder="请选择产品类型" clearable>-->
  566. <!-- <el-option v-for="dict in dict.type.medicine_type" :key="dict.value" :label="dict.label" :value="dict.value" />-->
  567. <!-- </el-select>-->
  568. <!-- </el-form-item>-->
  569. <!-- <el-form-item label="产品分类" prop="category">-->
  570. <!-- <el-select v-model="form.category" placeholder="请选择产品分类" clearable>-->
  571. <!-- <el-option v-for="dict in dict.type.vet_product_category" :key="dict.value" :label="dict.label" :value="dict.value" />-->
  572. <!-- </el-select>-->
  573. <!-- </el-form-item>-->
  574. <!-- <el-form-item label="规格" prop="specification">-->
  575. <!-- <el-input v-model="form.specification" placeholder="请输入规格" />-->
  576. <!-- </el-form-item>-->
  577. <!-- <el-form-item label="单位" prop="unit">-->
  578. <!-- <el-input v-model="form.unit" placeholder="请输入单位" />-->
  579. <!-- </el-form-item>-->
  580. <!-- <el-form-item label="生产厂家" prop="manufacturer">-->
  581. <!-- <el-input v-model="form.manufacturer" placeholder="请输入生产厂家" />-->
  582. <!-- </el-form-item>-->
  583. <!-- <el-form-item label="批准文号" prop="approvalNumber">-->
  584. <!-- <el-input v-model="form.approvalNumber" placeholder="请输入批准文号" />-->
  585. <!-- </el-form-item>-->
  586. <!-- <el-form-item label="主要成分" prop="ingredients">-->
  587. <!-- <el-input v-model="form.ingredients" type="textarea" placeholder="请输入内容" />-->
  588. <!-- </el-form-item>-->
  589. <!-- <el-form-item label="适应症" prop="indications">-->
  590. <!-- <el-input v-model="form.indications" type="textarea" placeholder="请输入内容" />-->
  591. <!-- </el-form-item>-->
  592. <!-- <el-form-item label="用法用量" prop="usageDosage">-->
  593. <!-- <el-input v-model="form.usageDosage" type="textarea" placeholder="请输入内容" />-->
  594. <!-- </el-form-item>-->
  595. <!-- <el-form-item label="销售价格" prop="price">-->
  596. <!-- <el-input v-model="form.price" placeholder="请输入销售价格" />-->
  597. <!-- </el-form-item>-->
  598. <!-- <el-form-item label="成本价" prop="costPrice">-->
  599. <!-- <el-input v-model="form.costPrice" placeholder="请输入成本价" />-->
  600. <!-- </el-form-item>-->
  601. <!-- <el-form-item label="库存数量" prop="stock">-->
  602. <!-- <el-input v-model="form.stock" placeholder="请输入库存数量" />-->
  603. <!-- </el-form-item>-->
  604. <!-- <el-form-item label="最低库存预警" prop="minStock">-->
  605. <!-- <el-input v-model="form.minStock" placeholder="请输入最低库存预警" />-->
  606. <!-- </el-form-item>-->
  607. <!-- <el-form-item label="相关图片" prop="mainImage">-->
  608. <!-- <image-upload v-model="form.mainImage"/>-->
  609. <!-- </el-form-item>-->
  610. <!--&lt;!&ndash; <el-form-item label="多张图片URL,JSON格式" prop="images">&ndash;&gt;-->
  611. <!--&lt;!&ndash; <el-input v-model="form.images" type="textarea" placeholder="请输入内容" />&ndash;&gt;-->
  612. <!--&lt;!&ndash; </el-form-item>&ndash;&gt;-->
  613. <!-- <el-form-item label="适用动物:如犬、猫、猪等" prop="treatAnimals">-->
  614. <!-- <el-input v-model="form.treatAnimals" type="textarea" placeholder="请输入内容" />-->
  615. <!-- </el-form-item>-->
  616. <!-- <el-form-item label="治疗疾病" prop="treatDiseases">-->
  617. <!-- <el-input v-model="form.treatDiseases" type="textarea" placeholder="请输入内容" />-->
  618. <!-- </el-form-item>-->
  619. <!-- <el-form-item label="治疗方案/内容">-->
  620. <!-- <editor v-model="form.treatmentContent" :min-height="192"/>-->
  621. <!-- </el-form-item>-->
  622. <!-- <el-form-item label="治疗周期" prop="treatmentDuration">-->
  623. <!-- <el-input v-model="form.treatmentDuration" placeholder="请输入治疗周期" />-->
  624. <!-- </el-form-item>-->
  625. <!-- <el-form-item label="注意事项" prop="precautions">-->
  626. <!-- <el-input v-model="form.precautions" type="textarea" placeholder="请输入内容" />-->
  627. <!-- </el-form-item>-->
  628. <!--&lt;!&ndash; <el-form-item label="删除标识:0-正常/1-删除" prop="isDeleted">&ndash;&gt;-->
  629. <!--&lt;!&ndash; <el-input v-model="form.isDeleted" placeholder="请输入删除标识:0-正常/1-删除" />&ndash;&gt;-->
  630. <!--&lt;!&ndash; </el-form-item>&ndash;&gt;-->
  631. <!--&lt;!&ndash; <el-form-item label="诊所ID" prop="clinicId">&ndash;&gt;-->
  632. <!--&lt;!&ndash; <el-input v-model="form.clinicId" placeholder="请输入诊所ID" />&ndash;&gt;-->
  633. <!--&lt;!&ndash; </el-form-item>&ndash;&gt;-->
  634. <!--&lt;!&ndash; <el-form-item label="兽医ID" prop="vetId">&ndash;&gt;-->
  635. <!--&lt;!&ndash; <el-input v-model="form.vetId" placeholder="请输入兽医ID" />&ndash;&gt;-->
  636. <!--&lt;!&ndash; </el-form-item>&ndash;&gt;-->
  637. <!--&lt;!&ndash; <el-form-item label="创建时间" prop="createdAt">&ndash;&gt;-->
  638. <!--&lt;!&ndash; <el-date-picker clearable&ndash;&gt;-->
  639. <!--&lt;!&ndash; v-model="form.createdAt"&ndash;&gt;-->
  640. <!--&lt;!&ndash; type="date"&ndash;&gt;-->
  641. <!--&lt;!&ndash; value-format="yyyy-MM-dd"&ndash;&gt;-->
  642. <!--&lt;!&ndash; placeholder="请选择创建时间">&ndash;&gt;-->
  643. <!--&lt;!&ndash; </el-date-picker>&ndash;&gt;-->
  644. <!--&lt;!&ndash; </el-form-item>&ndash;&gt;-->
  645. <!--&lt;!&ndash; <el-form-item label="更新时间" prop="updatedAt">&ndash;&gt;-->
  646. <!--&lt;!&ndash; <el-date-picker clearable&ndash;&gt;-->
  647. <!--&lt;!&ndash; v-model="form.updatedAt"&ndash;&gt;-->
  648. <!--&lt;!&ndash; type="date"&ndash;&gt;-->
  649. <!--&lt;!&ndash; value-format="yyyy-MM-dd"&ndash;&gt;-->
  650. <!--&lt;!&ndash; placeholder="请选择更新时间">&ndash;&gt;-->
  651. <!--&lt;!&ndash; </el-date-picker>&ndash;&gt;-->
  652. <!--&lt;!&ndash; </el-form-item>&ndash;&gt;-->
  653. </el-form>
  654. <div slot="footer" class="dialog-footer">
  655. <el-button type="primary" @click="submitForm"> </el-button>
  656. <el-button @click="cancel"> </el-button>
  657. </div>
  658. </el-dialog>
  659. <!-- 详情弹窗 -->
  660. <el-dialog title="产品详情" :visible.sync="detailViews" width="80%" append-to-body>
  661. <el-descriptions :column="4" border v-loading="detailLoading" >
  662. <el-descriptions-item label="产品名称" :span="4">
  663. {{ currentDetail.name || '--' }}
  664. </el-descriptions-item>
  665. <el-descriptions-item label="产品类型">
  666. {{ currentDetail.type || '--' }}
  667. </el-descriptions-item>
  668. <el-descriptions-item label="产品分类">
  669. {{ currentDetail.category || '--' }}
  670. </el-descriptions-item>
  671. <el-descriptions-item label="规格">
  672. {{ currentDetail.specification || '--' }}
  673. </el-descriptions-item>
  674. <el-descriptions-item label="单位">
  675. {{ currentDetail.unit || '--' }}
  676. </el-descriptions-item>
  677. <el-descriptions-item label="生产厂家" :span="2">
  678. {{ currentDetail.manufacturer || '--' }}
  679. </el-descriptions-item>
  680. <el-descriptions-item label="批准文号" :span="2">
  681. {{ currentDetail.approvalNumber || '--' }}
  682. </el-descriptions-item>
  683. <el-descriptions-item label="销售价格">
  684. {{ currentDetail.price || '--' }}
  685. </el-descriptions-item>
  686. <el-descriptions-item label="成本价">
  687. {{ currentDetail.costPrice || '--' }}
  688. </el-descriptions-item>
  689. <el-descriptions-item label="库存数量">
  690. {{ currentDetail.stock || '--' }}
  691. </el-descriptions-item>
  692. <el-descriptions-item label="最低库存预警">
  693. {{ currentDetail.minStock || '--' }}
  694. </el-descriptions-item>
  695. <el-descriptions-item label="适用动物" :span="2">
  696. {{ currentDetail.treatAnimals || '--' }}
  697. </el-descriptions-item>
  698. <el-descriptions-item label="治疗疾病" :span="2">
  699. {{ currentDetail.treatDiseases || '--' }}
  700. </el-descriptions-item>
  701. <el-descriptions-item label="主要成分" :span="4">
  702. {{ currentDetail.ingredients || '--' }}
  703. </el-descriptions-item>
  704. <el-descriptions-item label="适应症" :span="4">
  705. {{ currentDetail.indications || '--' }}
  706. </el-descriptions-item>
  707. <el-descriptions-item label="用法用量" :span="4">
  708. {{ currentDetail.usageDosage || '--' }}
  709. </el-descriptions-item>
  710. <el-descriptions-item label="治疗方案/内容" :span="4">
  711. <div v-html="currentDetail.treatmentContent || '--'"></div>
  712. </el-descriptions-item>
  713. <el-descriptions-item label="治疗周期" :span="4" >
  714. {{ currentDetail.treatmentDuration || '--' }}
  715. </el-descriptions-item>
  716. <el-descriptions-item label="注意事项" :span="4">
  717. {{ currentDetail.precautions || '--' }}
  718. </el-descriptions-item>
  719. <el-descriptions-item label="创建时间" :span="2">
  720. {{ currentDetail.createdAt || '--' }}
  721. </el-descriptions-item>
  722. <el-descriptions-item label="更新时间" :span="2">
  723. {{ currentDetail.updatedAt || '--' }}
  724. </el-descriptions-item>
  725. </el-descriptions>
  726. <div slot="footer" class="dialog-footer">
  727. <el-button @click="detailViews = false"> </el-button>
  728. </div>
  729. </el-dialog>
  730. </div>
  731. </template>
  732. <script>
  733. import { listProduct, getProduct, delProduct, addProduct, updateProduct, offlineProduct, publishProduct, submitAuditProduct, cancelAuditProduct, resubmitAuditProduct } from "@/api/vet/product"
  734. export default {
  735. name: "Product",
  736. props: {
  737. shopId: {
  738. type: [Number, String],
  739. required: true
  740. }
  741. },
  742. dicts: ['medicine_type', 'vet_product_category', 'sys_publish_status', 'audit_status'],
  743. data() {
  744. return {
  745. // 遮罩层
  746. loading: true,
  747. detailLoading: false,
  748. // 选中数组
  749. ids: [],
  750. // 非单个禁用
  751. single: true,
  752. // 非多个禁用
  753. multiple: true,
  754. // 显示搜索条件
  755. showSearch: true,
  756. // 总条数
  757. total: 0,
  758. // 兽医产品信息分页参数
  759. activeName: 'first',
  760. // 步骤
  761. activeStep: 0,
  762. // 兽医产品信息表格数据
  763. productList: [],
  764. // 弹出层标题
  765. title: "",
  766. // 是否显示弹出层
  767. open: false,
  768. detailViews: false,
  769. // 当前查看的详情
  770. currentDetail: {},
  771. // 查询参数
  772. queryParams: {
  773. pageNum: 1,
  774. pageSize: 10,
  775. name: null,
  776. type: null,
  777. category: null,
  778. specification: null,
  779. unit: null,
  780. manufacturer: null,
  781. approvalNumber: null,
  782. ingredients: null,
  783. indications: null,
  784. usageDosage: null,
  785. price: null,
  786. costPrice: null,
  787. stock: null,
  788. minStock: null,
  789. mainImage: null,
  790. images: null,
  791. treatAnimals: null,
  792. treatDiseases: null,
  793. treatmentContent: null,
  794. treatmentDuration: null,
  795. precautions: null,
  796. status: null,
  797. isDeleted: null,
  798. clinicId: null,
  799. vetId: null,
  800. createdAt: null,
  801. updatedAt: null,
  802. shopId: null
  803. },
  804. // 表单参数
  805. form: {},
  806. // 表单校验
  807. rules: {
  808. name: [
  809. { required: true, message: "产品名称不能为空", trigger: "blur" }
  810. ],
  811. type: [
  812. { required: true, message: "产品类型不能为空", trigger: "change" }
  813. ],
  814. category: [
  815. { required: true, message: "产品分类不能为空", trigger: "change" }
  816. ],
  817. price: [
  818. { required: true, message: "销售价格不能为空", trigger: "blur" },
  819. { pattern: /^\d+(\.\d{1,2})?$/, message: '请输入正确的价格格式' }
  820. ],
  821. costPrice: [
  822. { required: true, message: "成本价不能为空", trigger: "blur" },
  823. { pattern: /^\d+(\.\d{1,2})?$/, message: '请输入正确的价格格式' }
  824. ],
  825. stock: [
  826. { required: true, message: "库存数量不能为空", trigger: "blur" },
  827. { pattern: /^[0-9]*$/, message: '请输入正确的数字格式' }
  828. ],
  829. minStock: [
  830. { required: true, message: "最低库存预警不能为空", trigger: "blur" },
  831. { pattern: /^[0-9]*$/, message: '请输入正确的数字格式' }
  832. ]
  833. }
  834. }
  835. },
  836. created() {
  837. this.getList()
  838. },
  839. methods: {
  840. /** 查询兽医产品信息列表 */
  841. getList() {
  842. this.loading = true
  843. listProduct(this.queryParams).then(response => {
  844. this.productList = response.rows
  845. this.total = response.total
  846. this.loading = false
  847. })
  848. },
  849. // 取消按钮
  850. cancel() {
  851. this.open = false
  852. this.reset()
  853. },
  854. // 表单重置
  855. reset() {
  856. this.activeStep = 0;
  857. this.form = {
  858. id: null,
  859. name: null,
  860. type: null,
  861. category: null,
  862. specification: null,
  863. unit: null,
  864. manufacturer: null,
  865. approvalNumber: null,
  866. ingredients: null,
  867. indications: null,
  868. usageDosage: null,
  869. price: null,
  870. costPrice: null,
  871. stock: null,
  872. minStock: null,
  873. mainImage: null,
  874. images: null,
  875. treatAnimals: null,
  876. treatDiseases: null,
  877. treatmentContent: null,
  878. treatmentDuration: null,
  879. precautions: null,
  880. status: null,
  881. isDeleted: null,
  882. clinicId: null,
  883. vetId: null,
  884. createdAt: null,
  885. updatedAt: null
  886. }
  887. this.resetForm("form")
  888. },
  889. /** 搜索按钮操作 */
  890. handleQuery() {
  891. this.queryParams.pageNum = 1
  892. this.getList()
  893. },
  894. /** 重置按钮操作 */
  895. resetQuery() {
  896. this.resetForm("queryForm")
  897. this.handleQuery()
  898. },
  899. // 多选框选中数据
  900. handleSelectionChange(selection) {
  901. this.ids = selection.map(item => item.id)
  902. this.single = selection.length!==1
  903. this.multiple = !selection.length
  904. },
  905. /** 详情按钮操作 */
  906. handleDetail(row) {
  907. this.detailViews = true;
  908. this.detailLoading = true;
  909. this.currentDetail = {};
  910. const id = row.id;
  911. getProduct(id).then(response => {
  912. if (response.code === 200) {
  913. this.currentDetail = response.data;
  914. } else {
  915. this.$modal.msgError("获取详情失败");
  916. }
  917. this.detailLoading = false;
  918. });
  919. },
  920. /** 新增按钮操作 */
  921. handleAdd() {
  922. this.reset()
  923. this.open = true
  924. this.title = "添加兽医产品信息"
  925. },
  926. /** 修改按钮操作 */
  927. handleUpdate(row) {
  928. this.reset()
  929. const id = row.id || this.ids
  930. getProduct(id).then(response => {
  931. this.form = response.data
  932. this.open = true
  933. this.title = "修改兽医产品信息"
  934. })
  935. },
  936. // // 上一步
  937. // prevStep() {
  938. // this.activeStep--;
  939. // },
  940. // // 下一步
  941. // nextStep() {
  942. // if (this.activeStep === 0) {
  943. // this.$refs.form.validate(valid => {
  944. // if (valid) this.activeStep++;
  945. // });
  946. // return;
  947. // }
  948. // },
  949. // 提交表单
  950. // submitForm() {
  951. // this.$refs.productForm.validate((valid) => {
  952. // if (valid) {
  953. // // 表单验证通过,提交数据
  954. // this.$message.success("提交成功");
  955. // // 这里写接口提交逻辑
  956. // // this.$api.product.add(this.form).then(res => { ... })
  957. // this.dialogVisible = false;
  958. // } else {
  959. // this.$message.error("请完善必填信息");
  960. // return false;
  961. // }
  962. // });
  963. // },
  964. /** 提交按钮 */
  965. submitForm() {
  966. this.$refs["form"].validate(valid => {
  967. if (valid) {
  968. if (this.form.id != null) {
  969. updateProduct(this.form).then(response => {
  970. this.$modal.msgSuccess("修改成功")
  971. this.open = false
  972. this.getList()
  973. })
  974. } else {
  975. addProduct(this.form).then(response => {
  976. this.$modal.msgSuccess("新增成功")
  977. this.open = false
  978. this.getList()
  979. })
  980. }
  981. }
  982. })
  983. },
  984. /** 删除按钮操作 */
  985. handleDelete(row) {
  986. const ids = row.id || this.ids
  987. this.$modal.confirm('是否确认删除兽医产品信息编号为"' + ids + '"的数据项?').then(function() {
  988. return delProduct(ids)
  989. }).then(() => {
  990. this.getList()
  991. this.$modal.msgSuccess("删除成功")
  992. }).catch(() => {})
  993. },
  994. /** 导出按钮操作 */
  995. handleExport() {
  996. this.download('vet/product/export', {
  997. ...this.queryParams
  998. }, `product_${new Date().getTime()}.xlsx`)
  999. },
  1000. /** 获取产品类型标签类型 */
  1001. getTypeTagType(type) {
  1002. const map = {
  1003. "处方药": 'danger',
  1004. "非处方药": 'warning',
  1005. "中成药": 'success',
  1006. "保健品": 'primary'
  1007. }
  1008. return map[type] || ''
  1009. },
  1010. /** 获取产品分类标签类型 */
  1011. getCategoryTagType(category) {
  1012. const map = {
  1013. "抗生素类": 'danger',
  1014. "抗寄生虫类": 'warning',
  1015. "疫苗类": 'success',
  1016. "消毒剂类": 'primary',
  1017. "营养补充类": 'info',
  1018. "外科用药": 'success',
  1019. "诊断试剂": 'warning',
  1020. "中药制剂": 'danger'
  1021. }
  1022. return map[category] || ''
  1023. },
  1024. /** 获取状态文本 */
  1025. getStatusText(status) {
  1026. const map = {
  1027. "0": '未上架',
  1028. "1": '已上架'
  1029. }
  1030. return map[status] || status
  1031. },
  1032. /** 获取状态标签类型 */
  1033. getStatusTagType(status) {
  1034. const map = {
  1035. "0": 'danger',
  1036. "1": 'success'
  1037. }
  1038. return map[status] || ''
  1039. },
  1040. /** 获取审核状态文本 */
  1041. getAuditStatusText(auditStatus) {
  1042. const map = {
  1043. "0": '待审核',
  1044. "1": '审核中',
  1045. "2": '审核通过',
  1046. "3": '审核拒绝'
  1047. }
  1048. return map[auditStatus] || auditStatus
  1049. },
  1050. /** 获取审核状态标签类型 */
  1051. getAuditStatusTagType(auditStatus) {
  1052. const map = {
  1053. "0": 'warning',
  1054. "1": 'primary',
  1055. "2": 'success',
  1056. "3": 'danger'
  1057. }
  1058. return map[auditStatus] || ''
  1059. },
  1060. // 上架
  1061. handlePublish(row) {
  1062. publishProduct(row.id).then(response => {
  1063. this.$modal.msgSuccess("上架成功")
  1064. this.getList()
  1065. }).catch(() => {
  1066. this.$modal.msgError("上架失败")
  1067. })
  1068. },
  1069. // 下架
  1070. handleOffline(row) {
  1071. offlineProduct(row.id).then(response => {
  1072. this.$modal.msgSuccess("下架成功")
  1073. this.getList()
  1074. }).catch(() => {
  1075. this.$modal.msgError("下架失败")
  1076. })
  1077. },
  1078. // 提交审核
  1079. handleSubmitAudit(row) {
  1080. submitAuditProduct(row.id).then(response => {
  1081. this.$modal.msgSuccess("提交审核成功")
  1082. this.getList()
  1083. }).catch(() => {
  1084. this.$modal.msgError("提交审核失败")
  1085. })
  1086. },
  1087. // 取消审核
  1088. handleCancelAudit(row){
  1089. cancelAuditProduct(row.id).then(response => {
  1090. this.$modal.msgSuccess("取消审核成功")
  1091. this.getList()
  1092. }).catch(() => {
  1093. this.$modal.msgError("取消审核失败")
  1094. })
  1095. },
  1096. // 重新提交审核
  1097. handleResubmitAudit(row){
  1098. resubmitAuditProduct(row.id).then(response => {
  1099. this.$modal.msgSuccess("重新提交审核成功")
  1100. this.getList()
  1101. }).catch(() => {
  1102. this.$modal.msgError("重新提交审核失败")
  1103. })
  1104. }
  1105. }
  1106. }
  1107. </script>
  1108. <style scoped>
  1109. ::v-deep .el-descriptions-item__cell{
  1110. width: 90px;
  1111. }
  1112. ::v-deep .el-descriptions-row th{
  1113. text-align: center !important;
  1114. }
  1115. ::v-deep .pagestyle .el-input{
  1116. width: auto !important;
  1117. }
  1118. ::v-deep .pagestyle .pagination-container{
  1119. background-color: #f8fafc;
  1120. }
  1121. </style>
  1122. <style lang="scss" scoped>
  1123. //表格价格、库存样式
  1124. .price-cell {
  1125. .price-text {
  1126. font-weight: bold;
  1127. color: #f56c6c;
  1128. }
  1129. .cost-price {
  1130. font-size: 12px;
  1131. color: #999;
  1132. margin-top: 2px;
  1133. }
  1134. }
  1135. .stock-cell {
  1136. .stock-text {
  1137. font-weight: bold;
  1138. }
  1139. .min-stock {
  1140. font-size: 12px;
  1141. color: #f88080;
  1142. margin-top: 2px;
  1143. }
  1144. }
  1145. // 操作按钮样式
  1146. .info-btn {
  1147. padding: 6px 10px;
  1148. border-radius: 4px;
  1149. margin: 0 10px;
  1150. transition: all 0.3s ease;
  1151. }
  1152. .view-btn:hover {
  1153. background-color: rgb(216, 238, 248);
  1154. transform: translateY(-1px);
  1155. }
  1156. .chat-btn:hover {
  1157. background-color: rgb(225, 233, 246);
  1158. transform: translateY(-1px);
  1159. }
  1160. .alter-btn:hover{
  1161. background-color: rgb(230, 255, 238);
  1162. transform: translateY(-1px);
  1163. }
  1164. .delete-btn:hover {
  1165. background-color: rgba(245, 108, 108, 0.1);
  1166. transform: translateY(-1px);
  1167. }
  1168. .submit-btn:hover {
  1169. background-color: rgb(253, 250, 232);
  1170. transform: translateY(-1px);
  1171. }
  1172. .publish-btn:hover {
  1173. background-color: rgb(253, 238, 228);
  1174. transform: translateY(-1px);
  1175. }
  1176. .offline-btn:hover {
  1177. background-color: rgb(237, 237, 235);
  1178. transform: translateY(-1px);
  1179. }
  1180. .cancel-btn:hover {
  1181. background-color: rgb(244, 237, 251);
  1182. transform: translateY(-1px);
  1183. }
  1184. .resubmit-btn:hover {
  1185. background-color: rgb(248, 232, 250);
  1186. transform: translateY(-1px);
  1187. }
  1188. // 新增/修改的弹窗
  1189. ::v-deep .el-dialog {
  1190. border-radius: 12px;
  1191. overflow: hidden;
  1192. box-shadow: 0 10px 40px rgba(0, 0, 0, 0.12);
  1193. animation: dialogFadeIn 0.3s ease;
  1194. }
  1195. ::v-deep .el-dialog__header {
  1196. background: linear-gradient(135deg, #42b983 0%, #83df92 100%);
  1197. padding: 18px 24px;
  1198. border-bottom: none;
  1199. position: relative;
  1200. }
  1201. ::v-deep .el-dialog__title {
  1202. font-size: 17px;
  1203. font-weight: 600;
  1204. color: white;
  1205. letter-spacing: 0.5px;
  1206. }
  1207. ::v-deep .el-dialog__headerbtn:hover .el-dialog__close {
  1208. color: #ffd04b;
  1209. transform: rotate(90deg);
  1210. }
  1211. ::v-deep .el-dialog__body {
  1212. padding: 28px 24px 20px;
  1213. background-color: #f8fafc;
  1214. max-height: 70vh;
  1215. overflow-y: auto;
  1216. }
  1217. ::v-deep .el-form-item {
  1218. margin-bottom: 20px;
  1219. transition: all 0.3s;
  1220. }
  1221. ::v-deep .el-form-item__label {
  1222. font-weight: 500;
  1223. color: #2d3748;
  1224. font-size: 14px;
  1225. transition: color 0.3s;
  1226. }
  1227. ::v-deep .el-input,
  1228. ::v-deep .el-textarea,
  1229. ::v-deep .el-select {
  1230. width: 100%;
  1231. }
  1232. ::v-deep .el-input__inner,
  1233. ::v-deep .el-textarea__inner {
  1234. border-radius: 8px;
  1235. border: 1px solid #dcdfe6;
  1236. font-size: 14px;
  1237. transition: all 0.3s;
  1238. background-color: #fcfdfe;
  1239. }
  1240. ::v-deep .el-input__inner:focus,
  1241. ::v-deep .el-textarea__inner:focus {
  1242. border-color: #42B983;
  1243. box-shadow: 0 0 0 3px rgb(230, 255, 238);
  1244. background-color: white;
  1245. }
  1246. ::v-deep .el-select .el-input__inner {
  1247. padding-right: 35px;
  1248. }
  1249. ::v-deep .el-dialog__footer {
  1250. padding: 20px 24px;
  1251. background-color: #f8fafc;
  1252. border-top: 1px solid #eef2f7;
  1253. border-radius: 0 0 12px 12px;
  1254. }
  1255. </style>