index.vue 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889
  1. <template>
  2. <div class="work-detail">
  3. <custom-header name="农事详情" :showClose="false" isGoBack @goback="handleBack" />
  4. <div class="work-detail-content">
  5. <!-- 顶部状态 -->
  6. <div class="content-status" :class="'status-' + detail?.flowStatus">
  7. <div class="status-l" v-if="userInfo?.appType === 2">
  8. <div class="status-title">{{ statusText }}</div>
  9. <div class="status-sub" v-if="triggerDateText && detail?.flowStatus === 0">
  10. 预计触发时间 {{ triggerDateText }}
  11. </div>
  12. <div class="status-sub" v-if="detail?.flowStatus === 1">
  13. 任务进度:1/2
  14. </div>
  15. </div>
  16. <div class="status-l" v-else>
  17. <div class="status-title">{{ statusText }}</div>
  18. <div class="status-sub" v-if="triggerDateText && detail?.flowStatus === 0">
  19. 预计触发时间 {{ triggerDateText }}
  20. </div>
  21. <div class="status-sub" v-if="detail?.flowStatus === 1">
  22. 距离执行时间还差 {{ daysDiff }} 天
  23. </div>
  24. </div>
  25. </div>
  26. <div class="work-wrap">
  27. <!-- 农事组信息 -->
  28. <!-- <div class="box-wrap group-info group-box">
  29. <div class="group-name">
  30. 农事组:
  31. <span class="group-name-text">{{ detail.farmWorkName || detail.farmWorkLibName || "--" }}</span>
  32. </div>
  33. </div> -->
  34. <!-- 每一段农事 -->
  35. <div v-for="(prescription, index) in stageList" :key="index" class="box-wrap stage-card"
  36. :class="'status-' + prescription.tagType">
  37. <div class="stage-header">
  38. <div class="stage-title">{{ detail.farmWorkName }}</div>
  39. <div class="title-tag" :class="'tag-' + prescription.tagType">{{ prescription.tagType === 0 ?
  40. "待完成" : "已完成" }}</div>
  41. </div>
  42. <div class="stage-info">
  43. <div class="form-item">
  44. <div class="item-name">农事目的</div>
  45. <div class="item-text">
  46. {{ detail.purpose || prescription.name || "--" }}
  47. </div>
  48. </div>
  49. <div class="form-item">
  50. <div class="item-name">农事时间</div>
  51. <div class="item-text">
  52. {{ detail.intervelTime ? `间隔 ${detail.intervelTime} 天后 执行` : "--" }}
  53. </div>
  54. </div>
  55. <div class="form-item">
  56. <div class="item-name">执行区域</div>
  57. <div class="item-text light-text">
  58. 桂味种植区域
  59. </div>
  60. </div>
  61. <div class="form-item">
  62. <div class="item-name">注意事项</div>
  63. <div class="item-text">
  64. {{ detail.remark || "--" }}
  65. </div>
  66. </div>
  67. <div class="form-item">
  68. <div class="item-name">药肥处方</div>
  69. </div>
  70. </div>
  71. <!-- 执行方式 -->
  72. <div class="stage-tabs">
  73. <div v-for="tab in executionTabs" :key="tab.value" class="tab-pill"
  74. :class="{ active: getStageExecutionMethod(index) === tab.value }"
  75. @click="changeExecutionMethod(index, tab.value)">
  76. {{ tab.label }}
  77. </div>
  78. </div>
  79. <!-- 药物处方表 -->
  80. <div class="prescription-wrap"
  81. v-if="prescription.pesticideList && prescription.pesticideList.length">
  82. <div class="prescription-table">
  83. <div class="table-header">
  84. <div class="col col-type">使用功效</div>
  85. <div class="col col-name">药肥名称</div>
  86. <div class="col col-ratio">药肥配比</div>
  87. </div>
  88. <div v-for="(item, i) in prescription.pesticideList" :key="i" class="table-row">
  89. <div class="col col-type">
  90. {{ item.typeName || "--" }}
  91. </div>
  92. <div class="col col-name">
  93. {{ item.name || item.pesticideFertilizerName || "--" }}
  94. </div>
  95. <div class="col col-ratio">
  96. {{ getPesticideParam(item, index)?.ratio || "--" }}倍
  97. </div>
  98. </div>
  99. </div>
  100. <div v-if="hasRemark(prescription, index)" class="prescription-remark">
  101. <span v-for="(item, idx) in [prescription.pesticideList[0]]" :key="idx">
  102. <template v-if="getParamRemark(item, index)">
  103. {{ getParamRemark(item, index) }}
  104. <br />
  105. </template>
  106. </span>
  107. </div>
  108. </div>
  109. <!-- 执行照片 -->
  110. <div class="photo-box" v-if="prescription.cropAlbum && prescription.cropAlbum.length">
  111. <div class="photo-title">执行照片</div>
  112. <div class="photo-img-wrap">
  113. <photo-provider :photo-closable="true">
  114. <photo-consumer v-for="(src, index) in prescription.cropAlbum" intro="执行照片" :key="index"
  115. :src="base_img_url2 + src.filename">
  116. <div class="photo-img">
  117. <img :src="base_img_url2 + src.filename" />
  118. </div>
  119. </photo-consumer>
  120. </photo-provider>
  121. </div>
  122. </div>
  123. <!-- 执行操作 -->
  124. <div class="execute-action" v-if="info?.appType === 1 && prescription.tagType === 0">
  125. <div class="action-item second" @click="handleRemind">稍后执行</div>
  126. <div class="action-item primary" @click="handleExecute">我已完成</div>
  127. </div>
  128. </div>
  129. <!-- 底部按钮 -->
  130. <div class="fixed-btn-wrap" v-if="info?.appType === 2">
  131. <div class="fixed-btn" @click="handleConvert">
  132. 转发农事
  133. </div>
  134. </div>
  135. </div>
  136. </div>
  137. <ExecutePopup ref="executePopupRef" />
  138. </div>
  139. </template>
  140. <script setup>
  141. import wx from "weixin-js-sdk";
  142. import customHeader from "@/components/customHeader.vue";
  143. import { ref, computed, onActivated } from "vue";
  144. import { useRoute, useRouter } from "vue-router";
  145. import { formatDate } from "@/common/commonFun";
  146. import ExecutePopup from "./components/executePopup.vue";
  147. import { base_img_url2, resize_300 } from "@/api/config";
  148. const route = useRoute();
  149. const router = useRouter();
  150. // const info = JSON.parse(localStorage.getItem("localUserInfo") || "{}");
  151. const info = { appType: 1 };
  152. const detail = ref({
  153. "consequenceText": "",
  154. "id": null,
  155. "reCheckText": "",
  156. "orderId": null,
  157. "farmWorkArrangeId": null,
  158. "farmName": "",
  159. "farmPoint": "",
  160. "area": null,
  161. "expert": null,
  162. "orderStatus": null,
  163. "activeStatus": null,
  164. "flowStatus": 1,
  165. "farmId": null,
  166. "regionId": null,
  167. "farmMiniUserId": null,
  168. "farmMiniUserName": "",
  169. "speciesId": "1",
  170. "speciesName": "",
  171. "agriculturalId": null,
  172. "agriculturalIcon": "",
  173. "farmWorkId": "793434539249635329",
  174. "farmWorkLibId": "793434539249635329",
  175. "farmWorkLibName": "第一段蒂蛀虫防治",
  176. "farmWorkName": "第一段蒂蛀虫防治",
  177. "expertName": "",
  178. "expertUserName": "",
  179. "expertIcon": "",
  180. "expertUserIcon": "",
  181. "icon": null,
  182. "indexName": "",
  183. "indexChart": [],
  184. "executeDate": "2026-03-15",
  185. "intervelTime": 10,
  186. "executeDeadlineDate": null,
  187. "expectedExecuteDate": null,
  188. "finishDate": null,
  189. "checkDate": null,
  190. "beforeExecuteDate": null,
  191. "indexJson": "",
  192. "expertPrescription": "",
  193. "code": "793434539249635328",
  194. "condition": "",
  195. "solarName": "",
  196. "reCheck": null,
  197. "remark": "严禁低温寒潮、霜冻、倒春寒前24小时内追肥,避免根系、叶片受刺激引发冻害、肥害。",
  198. "menu": null,
  199. "num": null,
  200. "purpose": "营养",
  201. "type": 1,
  202. "farmWorkType": 2,
  203. "farmWorkTypeName": "",
  204. "execute": null,
  205. "updateDate0": null,
  206. "updateDate1": null,
  207. "updateDate2": null,
  208. "updateDate3": null,
  209. "updateDate4": null,
  210. "updateDate5": null,
  211. "updateDate6": null,
  212. "confirmPicture": [],
  213. "executeEvidence": [],
  214. "reviewImage": [],
  215. "reviewImage2": [],
  216. "reviewDate": null,
  217. "reviewDate2": null,
  218. "serviceRegion": "",
  219. "usageMode": "",
  220. "serviceMain": "",
  221. "executeMain": "",
  222. "storeShortName": "",
  223. "weatherWarningMsg": "",
  224. "userEvaluation": null,
  225. "executeBlueZones": [],
  226. "isMaster": null,
  227. "isEdit": null,
  228. "selfExec": null,
  229. "defaultFarmWork": null,
  230. "isPublic": null,
  231. "users": [],
  232. "groupList": [
  233. {
  234. "name": "蒂蛀虫防治",
  235. "tagType": 1,
  236. "cropAlbum": [
  237. {
  238. "filename": "6e707c1f-7095-409e-8b3a-2633e7b36bd5/1e2dc0e7-6f8b-4952-a574-8e8e0713529c/DJI_202601251415_001_1e2dc0e7-6f8b-4952-a574-8e8e0713529c/DJI_20260125141713_0003_V_code-ws0gefwtn5n4.jpeg"
  239. },
  240. {
  241. "filename": "dfb387fa-e7d3-4f49-a40c-fcbb9be2baf9/c727d4e9-f5bb-4e40-be2d-efdec3b91702/DJI_202511270800_001_c727d4e9-f5bb-4e40-be2d-efdec3b91702/DJI_20251127080720_0056_V_code-ws0gefyb37kp.jpeg"
  242. }
  243. ],
  244. "pesticideList": [
  245. {
  246. "code": "1009",
  247. "name": "化学水溶肥",
  248. "typeName": "氮肥",
  249. "params": [
  250. {
  251. "dosage": "50",
  252. "executionMethod": 1,
  253. "ratio": "30000",
  254. "remark": "飞行参数设置为***,飞行速度设置为飞行参数设置为***,飞行速度设置为"
  255. },
  256. {
  257. "dosage": "21",
  258. "executionMethod": 2,
  259. "ratio": "221",
  260. "remark": "rengong"
  261. },
  262. {
  263. "dosage": "11",
  264. "executionMethod": 3,
  265. "ratio": "111",
  266. "remark": "dimian"
  267. }
  268. ]
  269. },
  270. {
  271. "code": "1010",
  272. "name": "化学水溶肥2",
  273. "typeName": "营养",
  274. "params": [
  275. {
  276. "dosage": "0.5",
  277. "executionMethod": 1,
  278. "ratio": "30000",
  279. "remark": "zhibaoji"
  280. },
  281. {
  282. "dosage": "22",
  283. "executionMethod": 2,
  284. "ratio": "222",
  285. "remark": "rengong"
  286. },
  287. {
  288. "dosage": "12",
  289. "executionMethod": 3,
  290. "ratio": "112",
  291. "remark": "dimian"
  292. }
  293. ]
  294. },
  295. {
  296. "code": "1011",
  297. "name": "化学水溶肥3",
  298. "typeName": "营养",
  299. "params": [
  300. {
  301. "dosage": "60",
  302. "executionMethod": 1,
  303. "ratio": "30000",
  304. "remark": "zhibaoji"
  305. },
  306. {
  307. "dosage": "23",
  308. "executionMethod": 2,
  309. "ratio": "223",
  310. "remark": "rengong"
  311. },
  312. {
  313. "dosage": "13",
  314. "executionMethod": 3,
  315. "ratio": "113",
  316. "remark": "dimian"
  317. }
  318. ]
  319. }
  320. ],
  321. },
  322. {
  323. "name": "蒂蛀虫防治",
  324. "tagType": 0,
  325. "pesticideList": [
  326. {
  327. "code": "1009",
  328. "name": "化学水溶肥22",
  329. "typeName": "氮肥",
  330. "params": [
  331. {
  332. "dosage": "50",
  333. "executionMethod": 1,
  334. "ratio": "30000",
  335. "remark": "zhibaoji"
  336. },
  337. {
  338. "dosage": "21",
  339. "executionMethod": 2,
  340. "ratio": "221",
  341. "remark": "rengong"
  342. },
  343. {
  344. "dosage": "11",
  345. "executionMethod": 3,
  346. "ratio": "111",
  347. "remark": "dimian"
  348. }
  349. ]
  350. },
  351. {
  352. "code": "1010",
  353. "name": "化学水溶肥222",
  354. "typeName": "营养",
  355. "params": [
  356. {
  357. "dosage": "0.5",
  358. "executionMethod": 1,
  359. "ratio": "30000",
  360. "remark": "zhibaoji"
  361. },
  362. {
  363. "dosage": "22",
  364. "executionMethod": 2,
  365. "ratio": "222",
  366. "remark": "rengong"
  367. },
  368. {
  369. "dosage": "12",
  370. "executionMethod": 3,
  371. "ratio": "112",
  372. "remark": "dimian"
  373. }
  374. ]
  375. },
  376. {
  377. "code": "1011",
  378. "name": "化学水溶肥223",
  379. "typeName": "营养",
  380. "params": [
  381. {
  382. "dosage": "60",
  383. "executionMethod": 1,
  384. "ratio": "30000",
  385. "remark": "zhibaoji"
  386. },
  387. {
  388. "dosage": "23",
  389. "executionMethod": 2,
  390. "ratio": "223",
  391. "remark": "rengong"
  392. },
  393. {
  394. "dosage": "13",
  395. "executionMethod": 3,
  396. "ratio": "113",
  397. "remark": "dimian"
  398. }
  399. ]
  400. }
  401. ],
  402. },
  403. ],
  404. "needReview": null,
  405. "conditionList": [],
  406. "actualAgriculturalInput": null,
  407. "actualFarmServiceInput": null,
  408. "actualTotalInput": null,
  409. "executeName": "",
  410. "executorIcon": "",
  411. "executorUserId": null,
  412. "postId": "806490699515039744"
  413. });
  414. // 计算距离执行时间的天数差
  415. const daysDiff = computed(() => {
  416. if (!detail.value?.executeDate) {
  417. return 0;
  418. }
  419. const executeDate = new Date(detail.value.executeDate);
  420. const today = new Date();
  421. // 将时间设置为 00:00:00,只比较日期
  422. executeDate.setHours(0, 0, 0, 0);
  423. today.setHours(0, 0, 0, 0);
  424. // 计算天数差(毫秒转天数)
  425. const diffTime = executeDate.getTime() - today.getTime();
  426. const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24));
  427. return diffDays;
  428. });
  429. // 执行方式 Tab 配置
  430. const executionTabs = [
  431. { label: "植保机", value: 1 },
  432. { label: "人工手持", value: 2 },
  433. { label: "地面机械", value: 3 }
  434. ];
  435. // 每一段农事的当前执行方式(索引 -> 执行方式),默认 1:植保机
  436. const stageExecutionMethods = ref({});
  437. const executePopupRef = ref(null);
  438. const statusText = computed(() => {
  439. // 简单根据 flowStatus 判断,默认“待触发”
  440. if (detail.value.flowStatus === 1) return "待完成";
  441. if (detail.value.flowStatus === 2) return "已完成";
  442. return "待触发";
  443. });
  444. const triggerDateText = computed(() => {
  445. if (!detail.value.executeDate) return "";
  446. const d = formatDate(detail.value.executeDate);
  447. return d.replace(/-/g, ".");
  448. });
  449. const stageList = computed(() => detail.value.groupList || []);
  450. const hasRemark = (prescription, stageIndex) => {
  451. if (!prescription?.pesticideList || !Array.isArray(prescription.pesticideList)) return false;
  452. const currentMethod = getStageExecutionMethod(stageIndex);
  453. return prescription.pesticideList.some((item) => {
  454. if (!item.params || !Array.isArray(item.params)) return false;
  455. const p = item.params.find((param) => param.executionMethod === currentMethod);
  456. return !!(p && p.remark);
  457. });
  458. };
  459. const handleExecute = () => {
  460. executePopupRef.value.openPopup();
  461. };
  462. const handleRemind = () => {
  463. executePopupRef.value.showRemindPopup();
  464. };
  465. const handleBack = () => {
  466. router.back();
  467. };
  468. const handleConvert = () => {
  469. const query = {
  470. askInfo: { title: "农情互动", content: "是否分享该互动给好友" },
  471. shareText: '邀请您农情互动,精准匹配种植方案',
  472. targetUrl: `interaction`,
  473. paramsPage: JSON.stringify({ id: detail.value.id }),
  474. imageUrl: 'https://birdseye-img.sysuimars.com/birdseye-look-mini/work_cover.png',
  475. };
  476. wx.miniProgram.navigateTo({
  477. url: `/pages/subPages/share_page/index?pageParams=${JSON.stringify(query)}&type=sharePage`,
  478. });
  479. };
  480. // 获取当前段的执行方式
  481. const getStageExecutionMethod = (stageIndex) => {
  482. const val = stageExecutionMethods.value[stageIndex];
  483. return val || 1;
  484. };
  485. // 根据当前执行方式,获取对应的参数(配比、单亩用量、备注)
  486. const getPesticideParam = (item, stageIndex) => {
  487. if (!item?.params || !Array.isArray(item.params)) return null;
  488. const currentMethod = getStageExecutionMethod(stageIndex);
  489. return (
  490. item.params.find((param) => param.executionMethod === currentMethod) || null
  491. );
  492. };
  493. const getParamRemark = (item, stageIndex) => {
  494. const param = getPesticideParam(item, stageIndex);
  495. return param?.remark || item.remark || "";
  496. };
  497. const changeExecutionMethod = (stageIndex, value) => {
  498. stageExecutionMethods.value = {
  499. ...stageExecutionMethods.value,
  500. [stageIndex]: value
  501. };
  502. };
  503. </script>
  504. <style scoped lang="scss">
  505. .work-detail {
  506. height: 100vh;
  507. background: #f2f3f5;
  508. display: flex;
  509. flex-direction: column;
  510. .work-detail-content {
  511. flex: 1;
  512. overflow: auto;
  513. }
  514. }
  515. .content-status {
  516. position: relative;
  517. padding: 21px 12px 0 12px;
  518. color: #fff;
  519. z-index: 1;
  520. height: 100px;
  521. box-sizing: border-box;
  522. &::after {
  523. content: "";
  524. z-index: -1;
  525. position: absolute;
  526. left: 0;
  527. top: 0;
  528. height: 100px;
  529. background: #C7C7C7;
  530. // background: #FF953D;
  531. width: 100%;
  532. }
  533. &.status-1 {
  534. &::after {
  535. background: #FF953D;
  536. }
  537. }
  538. .status-l {
  539. .status-title {
  540. font-size: 22px;
  541. }
  542. .status-sub {
  543. font-size: 14px;
  544. }
  545. }
  546. }
  547. .work-wrap {
  548. position: relative;
  549. top: -16px;
  550. padding: 0 12px 12px;
  551. z-index: 2;
  552. margin-bottom: 60px;
  553. }
  554. .box-wrap {
  555. background: #ffffff;
  556. border-radius: 8px;
  557. padding: 14px 10px 10px 10px;
  558. box-shadow: 0 2px 8px rgba(15, 35, 52, 0.06);
  559. border: 1px solid transparent;
  560. &.status-0 {
  561. border: 1px solid #FF953D;
  562. }
  563. }
  564. .photo-box {
  565. margin-top: 10px;
  566. border: 0.5px dashed #2199F8;
  567. border-radius: 5px;
  568. padding: 11px 10px;
  569. .photo-title {
  570. font-size: 14px;
  571. color: #000;
  572. padding-bottom: 8px;
  573. }
  574. }
  575. .group-info {
  576. margin-bottom: 10px;
  577. &.group-box {
  578. padding: 16px 10px;
  579. .group-name {
  580. font-size: 16px;
  581. color: #000;
  582. .group-name-text {
  583. color: #000;
  584. }
  585. }
  586. }
  587. .group-name {
  588. font-size: 14px;
  589. color: rgba(0, 0, 0, 0.2);
  590. .group-name-text {
  591. color: #767676;
  592. }
  593. }
  594. .group-sub {
  595. margin-top: 6px;
  596. font-size: 12px;
  597. color: rgba(0, 0, 0, 0.45);
  598. line-height: 1.5;
  599. }
  600. }
  601. .stage-card+.stage-card {
  602. margin-top: 10px;
  603. }
  604. .stage-card {
  605. .stage-header {
  606. padding-bottom: 12px;
  607. display: flex;
  608. align-items: center;
  609. gap: 5px;
  610. .stage-title {
  611. font-size: 16px;
  612. color: #000;
  613. }
  614. .title-tag {
  615. width: fit-content;
  616. font-size: 12px;
  617. height: 26px;
  618. line-height: 26px;
  619. color: #2199F8;
  620. background: rgba(33, 153, 248, 0.1);
  621. border-radius: 20px;
  622. padding: 0 8px;
  623. }
  624. .tag-0 {
  625. color: #FF953D;
  626. background: rgba(255, 149, 61, 0.1);
  627. }
  628. }
  629. .stage-info {
  630. padding: 8px 0 2px;
  631. border-top: 1px solid #f5f5f5;
  632. }
  633. }
  634. .form-item {
  635. display: flex;
  636. font-size: 14px;
  637. color: #767676;
  638. margin-top: 4px;
  639. .item-name {
  640. padding-right: 26px;
  641. color: rgba(0, 0, 0, 0.2);
  642. }
  643. .item-text {
  644. flex: 1;
  645. line-height: 21px;
  646. &.light-text {
  647. color: #2199F8;
  648. }
  649. }
  650. }
  651. .stage-tabs {
  652. display: inline-flex;
  653. gap: 8px;
  654. margin-top: 8px;
  655. .tab-pill {
  656. padding: 0 8px;
  657. font-size: 14px;
  658. text-align: center;
  659. border-radius: 2px;
  660. height: 28px;
  661. line-height: 28px;
  662. color: #767676;
  663. background: rgba(171, 171, 171, 0.1);
  664. &.active {
  665. background: rgba(33, 153, 248, 0.1);
  666. color: #2199F8;
  667. }
  668. }
  669. }
  670. .prescription-wrap {
  671. margin-top: 10px;
  672. overflow: hidden;
  673. .prescription-title {
  674. padding: 8px 10px;
  675. font-size: 13px;
  676. font-weight: 500;
  677. border-bottom: 1px solid rgba(225, 225, 225, 0.6);
  678. }
  679. }
  680. .prescription-table {
  681. font-size: 12px;
  682. text-align: center;
  683. border-radius: 6px;
  684. border: 1px solid rgba(225, 225, 225, 0.6);
  685. .table-header {
  686. display: flex;
  687. background: rgba(171, 171, 171, 0.1);
  688. padding: 9px 6px;
  689. color: #767676;
  690. }
  691. .table-row {
  692. display: flex;
  693. padding: 12px 6px;
  694. border-bottom: 1px solid rgba(0, 0, 0, 0.08);
  695. color: rgba(0, 0, 0, 0.76);
  696. &:last-child {
  697. border-bottom: none;
  698. }
  699. }
  700. .col {
  701. display: flex;
  702. align-items: center;
  703. justify-content: center;
  704. padding: 0 2px;
  705. }
  706. .col-type {
  707. width: 56px;
  708. }
  709. .col-name {
  710. flex: 1;
  711. }
  712. .col-ratio {
  713. width: 64px;
  714. }
  715. .col-dose {
  716. width: 64px;
  717. }
  718. }
  719. .prescription-remark {
  720. margin-top: 8px;
  721. padding: 7px 10px;
  722. border-radius: 6px;
  723. color: #767676;
  724. background: rgba(171, 171, 171, 0.1);
  725. line-height: 21px;
  726. }
  727. .photo-img-wrap {
  728. display: flex;
  729. flex-wrap: wrap;
  730. gap: 10px;
  731. ::v-deep {
  732. .PhotoConsumer {
  733. width: 31%;
  734. height: 92px;
  735. }
  736. }
  737. .photo-img {
  738. width: 100%;
  739. height: 100%;
  740. position: relative;
  741. box-sizing: border-box;
  742. border: 2px solid transparent;
  743. border-radius: 8px;
  744. overflow: hidden;
  745. img {
  746. width: 100%;
  747. height: 100%;
  748. border-radius: 8px;
  749. object-fit: cover;
  750. }
  751. }
  752. }
  753. .execute-action {
  754. margin-top: 8px;
  755. display: flex;
  756. align-items: center;
  757. justify-content: center;
  758. gap: 16px;
  759. .action-item {
  760. padding: 0 16px;
  761. height: 32px;
  762. line-height: 32px;
  763. border-radius: 16px;
  764. box-sizing: border-box;
  765. font-size: 14px;
  766. &.second {
  767. background: #ffffff;
  768. border: 0.5px solid rgba(153, 153, 153, 0.5);
  769. color: #999999;
  770. }
  771. &.primary {
  772. background: linear-gradient(180deg, #8ACBFF 0%, #2199F8 100%);
  773. color: #ffffff;
  774. }
  775. }
  776. }
  777. .fixed-btn-wrap {
  778. display: flex;
  779. justify-content: center;
  780. position: fixed;
  781. bottom: 0px;
  782. left: 0;
  783. right: 0;
  784. background: #fff;
  785. padding: 10px 12px;
  786. box-sizing: border-box;
  787. // box-shadow: 0 -2px 8px rgba(15, 35, 52, 0.06);
  788. box-shadow: 2px 2px 4.5px 0px #00000066;
  789. .fixed-btn {
  790. min-width: 110px;
  791. height: 40px;
  792. line-height: 40px;
  793. text-align: center;
  794. border-radius: 20px;
  795. background: linear-gradient(180deg, #70bffe, #2199f8);
  796. color: #ffffff;
  797. font-size: 14px;
  798. }
  799. }
  800. </style>