approvalTaskDetail.vue 46 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627
  1. <template>
  2. <view class="container">
  3. <Watermark />
  4. <view class="status-bar" :style="{ height: statusBarHeight + 'px' }"></view>
  5. <view class="top">
  6. <image class="return" @click="goBack"
  7. src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/back_white.png"></image>
  8. <text>任务详情</text>
  9. </view>
  10. <scroll-view class="content" scroll-y>
  11. <!-- 任务卡片 -->
  12. <view class="task-card" v-if="auditData">
  13. <view class="card-header">
  14. <view class="card-title">
  15. {{ auditData.audit && auditData.audit.auditName ? auditData.audit.auditName : '-' }}</view>
  16. <view class="card-lable" :class="'pending'" v-if="auditData.audit && auditData.audit.status==1">待审核
  17. </view>
  18. <view class="card-lable" :class="'pass'" v-if="auditData.audit && auditData.audit.status==2">审核通过
  19. </view>
  20. <view class="card-lable" :class="'reject'" v-if="auditData.audit && auditData.audit.status==3">已驳回
  21. </view>
  22. </view>
  23. <view class="card-meta">
  24. <view class="item">
  25. <image src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_user.png"></image>
  26. {{ auditData.audit.initiatorId||'-' }}
  27. </view>
  28. <view class="item">
  29. <image src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_time.png"></image>
  30. {{ auditData.audit.createTime||'-' }}
  31. </view>
  32. </view>
  33. </view>
  34. <!-- 讲者审核详情 -->
  35. <view class="info-section" v-if="auditData.audit && auditData.audit.auditType=='ADUIT_JZSH'">
  36. <view class="section-header">
  37. <view class="section-indicator"></view>
  38. <text class="section-title">基础信息</text>
  39. </view>
  40. <view class="info-list">
  41. <view class="info-item">
  42. <text class="info-label">账户身份(医生/药剂师)</text>
  43. <text class="info-value">{{ auditData.businessData.doctorName||'-' }}</text>
  44. </view>
  45. <view class="info-item">
  46. <text class="info-label">账户身份</text>
  47. <text class="info-value">{{ auditData.businessData.accountType=='0'?'医生':'药剂师' }}</text>
  48. </view>
  49. <view class="info-item">
  50. <text class="info-label">手机号码</text>
  51. <text class="info-value">{{ utils.parseIdCard(auditData.businessData.mobile)||'-' }}</text>
  52. </view>
  53. <view class="info-item">
  54. <text class="info-label">身份证号</text>
  55. <text class="info-value">{{ utils.parseIdCard(auditData.businessData.idCard)||'-'}}</text>
  56. </view>
  57. <view class="info-item">
  58. <text class="info-label">机构名称</text>
  59. <text class="info-value">{{ auditData.businessData.institution||'-'}}</text>
  60. </view>
  61. <view class="info-item">
  62. <text class="info-label">注册时间</text>
  63. <text class="info-value">{{ auditData.businessData. registerTime||'-'}}</text>
  64. </view>
  65. </view>
  66. </view>
  67. <view class="info-section" v-if="auditData.audit && auditData.audit.auditType=='ADUIT_JZSH'">
  68. <view class="section-header">
  69. <view class="section-indicator"></view>
  70. <text class="section-title">执业信息</text>
  71. </view>
  72. <view class="info-list">
  73. <view class="info-item">
  74. <text class="info-label">地址(省市区)</text>
  75. <text class="info-value">{{ auditData.businessData.provinceName||'-' }}
  76. {{ auditData.businessData.cityName||'-' }}
  77. {{ auditData.businessData.districtName||'-' }}</text>
  78. </view>
  79. <view class="info-item">
  80. <text class="info-label">公司名称</text>
  81. <text class="info-value">{{ auditData.businessData.companyName||'-'}}</text>
  82. </view>
  83. <view class="info-item">
  84. <text class="info-label">科室</text>
  85. <text class="info-value">{{ auditData.businessData.department||'-'}}</text>
  86. </view>
  87. <view class="info-item">
  88. <text class="info-label">职称</text>
  89. <text class="info-value">{{ getHospitalTitle(auditData.businessData.jobTitle)||'-'}}</text>
  90. </view>
  91. <view class="info-item">
  92. <text class="info-label">第三方业务编码</text>
  93. <text class="info-value">{{ auditData.businessData.thirdPartyCode||'-'}}</text>
  94. </view>
  95. <view class="info-item">
  96. <text class="info-label">签约协议状态</text>
  97. <text class="info-value">{{ auditData.businessData.contractStatus=='0'?'未签约':'已签约'}}</text>
  98. </view>
  99. </view>
  100. </view>
  101. <view class="info-section" v-if="auditData.audit && auditData.audit.auditType=='ADUIT_JZSH'">
  102. <view class="section-header">
  103. <view class="section-indicator"></view>
  104. <text class="section-title">资质信息</text>
  105. </view>
  106. <view class="qualification-list">
  107. <view class="qualification-item">
  108. <text class="qualification-label">执业证图片</text>
  109. <view class="image-grid" v-if="imageList('licenseImage').length">
  110. <image v-for="(url, idx) in imageList('licenseImage')" :key="idx"
  111. class="qualification-image" :src="url" @click="showImagePreview(url)"></image>
  112. </view>
  113. </view>
  114. <view class="qualification-item">
  115. <text class="qualification-label">职称证/工牌图片</text>
  116. <view class="image-grid" v-if="imageList('titleCertImage').length">
  117. <image v-for="(url, idx) in imageList('titleCertImage')" :key="idx"
  118. class="qualification-image" :src="url" @click="showImagePreview(url)"></image>
  119. </view>
  120. </view>
  121. </view>
  122. </view>
  123. <!-- 提现审核详情 -->
  124. <view class="info-section" v-if="auditData.audit && auditData.audit.auditType=='ADUIT_TXSH'">
  125. <view class="section-header">
  126. <view class="section-indicator"></view>
  127. <text class="section-title">基础信息</text>
  128. </view>
  129. <view class="info-list">
  130. <view class="info-item">
  131. <text class="info-label">公司名称</text>
  132. <text class="info-value">{{ auditData.businessData.companyName ||'-'}}</text>
  133. </view>
  134. <view class="info-item">
  135. <text class="info-label">医生姓名</text>
  136. <text class="info-value">{{auditData.businessData.doctorName||'-'}}</text>
  137. </view>
  138. </view>
  139. </view>
  140. <view class="info-section" v-if="auditData.audit && auditData.audit.auditType=='ADUIT_TXSH'">
  141. <view class="section-header">
  142. <view class="section-indicator"></view>
  143. <text class="section-title">提现信息</text>
  144. </view>
  145. <view class="info-list">
  146. <view class="info-item">
  147. <text class="info-label">提现积分数量</text>
  148. <text class="info-value">{{ auditData.businessData.pointsAmount||'-'}}</text>
  149. </view>
  150. <view class="info-item">
  151. <text class="info-label">提现金额(积分折算)</text>
  152. <text class="info-value">{{ auditData.businessData.readConverterExp||'-'}}</text>
  153. </view>
  154. <view class="info-item">
  155. <text class="info-label">提现申请时间</text>
  156. <text class="info-value">{{ auditData.businessData.applyTime||'-'}}</text>
  157. </view>
  158. <view class="info-item">
  159. <text class="info-label">审核状态</text>
  160. <text class="info-value">
  161. {{auditData.businessData.auditStatus == '0' ? '待审核' :
  162. auditData.businessData.auditStatus == '1' ? '审核通过' :
  163. auditData.businessData.auditStatus == '2' ? '审核驳回' : ''
  164. }}
  165. </text>
  166. </view>
  167. <view class="info-item">
  168. <text class="info-label"> 审核时间</text>
  169. <text class="info-value">{{ auditData.businessData.auditTime||'-'}}</text>
  170. </view>
  171. <view class="info-item">
  172. <text class="info-label"> 审核备注(驳回原因等)</text>
  173. <text class="info-value">{{ auditData.businessData.auditRemark||'-'}}</text>
  174. </view>
  175. <view class="info-item">
  176. <text class="info-label"> 打款状态</text>
  177. <text class="info-value">{{ auditData.businessData.paymentStatus=='0'?'待打款':'已打款'}}</text>
  178. </view>
  179. <view class="info-item">
  180. <text class="info-label"> 打款时间</text>
  181. <text class="info-value">{{ auditData.businessData.paymentTime||'-'}}</text>
  182. </view>
  183. <view class="info-item">
  184. <text class="info-label"> 银行回执编号</text>
  185. <text class="info-value">{{ auditData.businessData.bankReceiptNo||'-'}}</text>
  186. </view>
  187. <view class="qualification-list">
  188. <view class="qualification-item">
  189. <text class="qualification-label">银行回执图片URL</text>
  190. <view class="image-grid" v-if="auditData.businessData.bankReceiptUrl||''">
  191. <image class="qualification-image" :src=" auditData.businessData.bankReceiptUrl||''"
  192. @click="showImagePreview(auditData.businessData.bankReceiptUrl||'')"></image>
  193. </view>
  194. </view>
  195. </view>
  196. </view>
  197. </view>
  198. <!-- 创建任务审核详情和完成任务审核-->
  199. <view class="info-section"
  200. v-if="auditData.audit && (auditData.audit.auditType=='ADUIT_WCRWSH'||auditData.audit.auditType=='ADUIT_CJRW')">
  201. <view class="section-header">
  202. <view class="section-indicator"></view>
  203. <text class="section-title">基础信息</text>
  204. </view>
  205. <view class="info-list">
  206. <view class="info-item">
  207. <text class="info-label">公司名称</text>
  208. <text class="info-value">{{ auditData.businessData.auditTaskInfoVO.taskNo ||'-'}}</text>
  209. </view>
  210. <view class="info-item">
  211. <text class="info-label">任务名称</text>
  212. <text class="info-value">{{auditData.businessData.auditTaskInfoVO.taskName||'-'}}</text>
  213. </view>
  214. </view>
  215. </view>
  216. <view class="info-section"
  217. v-if="auditData.audit && (auditData.audit.auditType=='ADUIT_WCRWSH'||auditData.audit.auditType=='ADUIT_CJRW')">
  218. <view class="section-header">
  219. <view class="section-indicator"></view>
  220. <text class="section-title">任务信息</text>
  221. </view>
  222. <view class="info-list">
  223. <view class="info-item">
  224. <text class="info-label">费用分摊名字</text>
  225. <text class="info-value">{{ auditData.businessData.auditTaskInfoVO.costShareName||'-'}}</text>
  226. </view>
  227. <view class="info-item">
  228. <text class="info-label">任务积分</text>
  229. <text class="info-value">{{ auditData.businessData.auditTaskInfoVO.taskIntegral||'-'}}</text>
  230. </view>
  231. <view class="info-item">
  232. <text class="info-label">任务数量</text>
  233. <text class="info-value">{{ auditData.businessData.auditTaskInfoVO.taskCount||'-'}}</text>
  234. </view>
  235. <view class="info-item">
  236. <text class="info-label">任务单位名称</text>
  237. <text class="info-value">{{ auditData.businessData.auditTaskInfoVO.taskUnitName||'-'}}</text>
  238. </view>
  239. <view class="info-item">
  240. <text class="info-label">归属名字</text>
  241. <text class="info-value">{{ auditData.businessData.auditTaskInfoVO.belongTypeName||'-'}}</text>
  242. </view>
  243. <view class="info-item">
  244. <text class="info-label">计划开始时间</text>
  245. <text class="info-value">{{ auditData.businessData.auditTaskInfoVO.planStartTime||'-'}}</text>
  246. </view>
  247. <view class="info-item">
  248. <text class="info-label">计划结束时间</text>
  249. <text class="info-value">{{ auditData.businessData.auditTaskInfoVO.planEndTime||'-'}}</text>
  250. </view>
  251. <!-- <view class="info-item">
  252. <text class="info-label">归属项目ID</text>
  253. <text class="info-value">{{ auditData.businessData.auditTaskInfoVO.projectId||'-'}}</text>
  254. </view> -->
  255. <view class="info-item">
  256. <text class="info-label">项目名称</text>
  257. <text class="info-value">{{ auditData.businessData.auditTaskInfoVO.projectName||'-'}}</text>
  258. </view>
  259. <!-- <view class="info-item">
  260. <text class="info-label">医生id</text>
  261. <text class="info-value">{{ auditData.businessData.auditTaskInfoVO.doctorId||'-'}}</text>
  262. </view>
  263. <view class="info-item">
  264. <text class="info-label">归属部门ID</text>
  265. <text class="info-value">{{ auditData.businessData.auditTaskInfoVO.deptId||'-'}}</text>
  266. </view> -->
  267. <view class="info-item">
  268. <text class="info-label">部门名称</text>
  269. <text class="info-value">{{ auditData.businessData.auditTaskInfoVO.deptName||'-'}}</text>
  270. </view>
  271. <view class="info-item">
  272. <text class="info-label">交付物审核时间</text>
  273. <text
  274. class="info-value">{{ auditData.businessData.auditTaskInfoVO.deliveryAuditTime||'-'}}</text>
  275. </view>
  276. </view>
  277. </view>
  278. <!-- 长视频信息 -->
  279. <view class="info-section"
  280. v-if="auditData.audit && auditData.audit.auditType=='ADUIT_WCRWSH' && auditData.businessData && auditData.businessData.auditTaskInfoVO && auditData.businessData.auditTaskInfoVO.taskType==6">
  281. <view class="section-header">
  282. <view class="section-indicator"></view>
  283. <text class="section-title">长视频信息</text>
  284. </view>
  285. <view class="info-list">
  286. <view class="info-item">
  287. <text class="info-label">项目名称/视频标题</text>
  288. <text class="info-value">{{ auditData.businessData.ctLongVideo.title ||'-'}}</text>
  289. </view>
  290. <view class="info-item">
  291. <text class="info-label">是否原创</text>
  292. <text
  293. class="info-value">{{auditData.businessData.ctLongVideo.isOriginal==0?'否':'是'||'-'}}</text>
  294. </view>
  295. <view class="qualification-list">
  296. <view class="qualification-item">
  297. <text class="qualification-label">封面图URL</text>
  298. <view class="image-grid" v-if="auditData.businessData.ctLongVideo.coverUrl||''">
  299. <image class="qualification-image"
  300. :src="auditData.businessData.ctLongVideo.coverUrl||''"
  301. @click="showImagePreview(auditData.businessData.ctLongVideo.coverUrl||'')"></image>
  302. </view>
  303. </view>
  304. </view>
  305. <view class="info-item">
  306. <text class="info-label">摘要</text>
  307. <text class="info-value">{{ auditData.businessData.ctLongVideo.summary ||'-'}}</text>
  308. </view>
  309. <!-- <view class="info-item">
  310. <video class="info-value" :src="auditData.businessData.ctLongVideo.videoUrl||''" controls></video>
  311. </view> -->
  312. <view class="info-item">
  313. <text class="info-label">视频附件URL</text>
  314. <text class="info-value link"
  315. v-if="auditData.businessData.ctLongVideo && auditData.businessData.ctLongVideo.videoUrl"
  316. @click="openUrl(auditData.businessData.ctLongVideo.videoUrl)">{{ auditData.businessData.ctLongVideo.videoUrl }}</text>
  317. <text class="info-value" v-else>-</text>
  318. </view>
  319. <!-- <view class="qualification-list">
  320. <view class="qualification-item">
  321. <text class="qualification-label">视频附件URL</text>
  322. <view class="image-grid" v-if="auditData.businessData.ctLongVideo.videoUrl||''">
  323. <image class="qualification-image" :src=" auditData.businessData.ctLongVideo.videoUrl||''"
  324. @click="showImagePreview(auditData.businessData.ctLongVideo.videoUrl||'')"></image>
  325. </view>
  326. </view>
  327. </view> -->
  328. </view>
  329. </view>
  330. <!-- 短视频 -->
  331. <view class="info-section"
  332. v-if="auditData.audit && auditData.audit.auditType=='ADUIT_WCRWSH' && auditData.businessData && auditData.businessData.auditTaskInfoVO && auditData.businessData.auditTaskInfoVO.taskType==5">
  333. <view class="section-header">
  334. <view class="section-indicator"></view>
  335. <text class="section-title">短视频信息</text>
  336. </view>
  337. <view class="info-list">
  338. <view class="info-item">
  339. <text class="info-label">项目名称/视频标题</text>
  340. <text class="info-value">{{ auditData.businessData.ctShortVideo.title ||'-'}}</text>
  341. </view>
  342. <view class="info-item">
  343. <text class="info-label">是否原创</text>
  344. <text
  345. class="info-value">{{auditData.businessData.ctShortVideo.isOriginal==0?'否':'是'||'-'}}</text>
  346. </view>
  347. <view class="qualification-list">
  348. <view class="qualification-item">
  349. <text class="qualification-label">封面图URL</text>
  350. <view class="image-grid" v-if="auditData.businessData.ctShortVideo.coverUrl||''">
  351. <image class="qualification-image"
  352. :src=" auditData.businessData.ctShortVideo.coverUrl||''"
  353. @click="showImagePreview(auditData.businessData.ctShortVideo.coverUrl||'')"></image>
  354. </view>
  355. </view>
  356. </view>
  357. <view class="info-item">
  358. <text class="info-label">摘要</text>
  359. <text class="info-value">{{auditData.businessData.ctShortVideo.summary||'-'}}</text>
  360. </view>
  361. <view class="info-item">
  362. <text class="info-label">视频附件URL</text>
  363. <text class="info-value link"
  364. v-if="auditData.businessData.ctShortVideo && auditData.businessData.ctShortVideo.videoUrl"
  365. @click="openUrl(auditData.businessData.ctShortVideo.videoUrl)">{{ auditData.businessData.ctShortVideo.videoUrl }}</text>
  366. <text class="info-value" v-else>-</text>
  367. </view>
  368. <!-- <view class="qualification-list">
  369. <view class="qualification-item">
  370. <text class="qualification-label">视频附件URL</text>
  371. <view class="image-grid" v-if="auditData.businessData.ctShortVideo.videoUrl||''">
  372. <image class="qualification-image" :src=" auditData.businessData.ctShortVideo.videoUrl||''"
  373. @click="showImagePreview(auditData.businessData.ctShortVideo.videoUrl||'')"></image>
  374. </view>
  375. </view>
  376. </view> -->
  377. <view class="info-item">
  378. <text class="info-label">上下架状态</text>
  379. <text class="info-value">{{auditData.businessData.ctShortVideo.status==0?'上架':'下架'||'-'}}</text>
  380. </view>
  381. </view>
  382. </view>
  383. <!-- 文章 -->
  384. <view class="info-section"
  385. v-if="auditData.audit && auditData.audit.auditType=='ADUIT_WCRWSH' && auditData.businessData && auditData.businessData.auditTaskInfoVO && auditData.businessData.auditTaskInfoVO.taskType==4">
  386. <view class="section-header">
  387. <view class="section-indicator"></view>
  388. <text class="section-title">文章信息</text>
  389. </view>
  390. <view class="info-list">
  391. <view class="info-item">
  392. <text class="info-label">项目名称/视频标题</text>
  393. <text class="info-value">{{ auditData.businessData.ctArticle.title ||'-'}}</text>
  394. </view>
  395. <view class="info-item">
  396. <text class="info-label">是否原创</text>
  397. <text class="info-value">{{auditData.businessData.ctArticle.isOriginal==0?'否':'是'||'-'}}</text>
  398. </view>
  399. <view class="qualification-list">
  400. <view class="qualification-item">
  401. <text class="qualification-label">封面图URL</text>
  402. <view class="image-grid" v-if="auditData.businessData.ctArticle.coverImage||''">
  403. <image class="qualification-image"
  404. :src=" auditData.businessData.ctArticle.coverImage||''"
  405. @click="showImagePreview(auditData.businessData.ctArticle.coverImage||'')"></image>
  406. </view>
  407. </view>
  408. </view>
  409. <view class="info-item">
  410. <text class="info-label">富文本</text>
  411. <text class="info-value">{{auditData.businessData.ctArticle.content||'-'}}</text>
  412. </view>
  413. <view class="info-item">
  414. <text class="info-label">摘要</text>
  415. <text class="info-value">{{auditData.businessData.ctArticle.summary||'-'}}</text>
  416. </view>
  417. <view class="info-item">
  418. <text class="info-label">附件URL</text>
  419. <text class="info-value link"
  420. v-if="auditData.businessData.ctArticle && auditData.businessData.ctArticle.attachmentUrl"
  421. @click="openUrl(auditData.businessData.ctArticle.attachmentUrl)">{{ auditData.businessData.ctArticle.attachmentUrl }}</text>
  422. <text class="info-value" v-else>-</text>
  423. </view>
  424. <!-- <view class="qualification-list">
  425. <view class="qualification-item">
  426. <text class="qualification-label">附件URL</text>
  427. <view class="image-grid" v-if="auditData.businessData.ctArticle.attachmentUrl||''">
  428. <image class="qualification-image" :src=" auditData.businessData.ctArticle.attachmentUrl||''"
  429. @click="showImagePreview(auditData.businessData.ctArticle.attachmentUrl||'')"></image>
  430. </view>
  431. </view>
  432. </view> -->
  433. <view class="info-item">
  434. <text class="info-label">上下架状态</text>
  435. <text class="info-value">{{auditData.businessData.ctArticle.status==0?'上架':'下架'||'-'}}</text>
  436. </view>
  437. </view>
  438. </view>
  439. <!-- 定级审核-->
  440. <view class="info-section" v-if="auditData.audit && auditData.audit.auditType=='ADUIT_DJSH'">
  441. <view class="section-header">
  442. <view class="section-indicator"></view>
  443. <text class="section-title">定级信息</text>
  444. </view>
  445. <view class="info-list">
  446. <view class="info-item" v-if="getFieldDisplay('学术头衔', true)">
  447. <text class="info-label">学术头衔</text>
  448. <text class="info-value">{{ getFieldDisplay('学术头衔', true)}}</text>
  449. </view>
  450. <view class="info-item" v-if="getFieldDisplay('学位', true)">
  451. <text class="info-label">学位</text>
  452. <text class="info-value">{{ getFieldDisplay('学位', true)}}</text>
  453. </view>
  454. <view class="info-item" v-if="getFieldDisplay('学术研究', true)">
  455. <text class="info-label">学术研究</text>
  456. <text class="info-value">{{ getFieldDisplay('学术研究', true)}}</text>
  457. </view>
  458. <view class="info-item" v-if="getFieldDisplay('学术任职', true)">
  459. <text class="info-label">学术任职</text>
  460. <text class="info-value">{{ getFieldDisplay('学术任职', true)}}</text>
  461. </view>
  462. <view class="info-item">
  463. <text class="info-label">申请级别</text>
  464. <text
  465. class="info-value">{{ auditData.businessData.doctorLevelApplyVO.applyLevelName ||'-'}}</text>
  466. </view>
  467. <view class="info-item">
  468. <text class="info-label">国际性期刊论文/著作数</text>
  469. <text
  470. class="info-value">{{auditData.businessData.doctorLevelApplyVO.internationalPapers ||'-'}}</text>
  471. </view>
  472. <view class="info-item">
  473. <text class="info-label">全国性期刊论文/著作数</text>
  474. <text
  475. class="info-value">{{auditData.businessData.doctorLevelApplyVO.nationalPapers ||'-'}}</text>
  476. </view>
  477. <view class="info-item">
  478. <text class="info-label">临床工作经验年数</text>
  479. <text
  480. class="info-value">{{auditData.businessData.doctorLevelApplyVO.clinicalExperienceYears ||'-'}}</text>
  481. </view>
  482. </view>
  483. </view>
  484. <!-- 项目信息 -->
  485. <view class="info-section" v-if="auditData.projectVO">
  486. <view class="section-header">
  487. <view class="section-indicator"></view>
  488. <text class="section-title">项目信息</text>
  489. </view>
  490. <view class="info-list">
  491. <view class="info-item">
  492. <text class="info-label">项目名称</text>
  493. <text class="info-value">{{ auditData.projectVO.projectName }}</text>
  494. </view>
  495. <view class="info-item">
  496. <text class="info-label">项目活动ID</text>
  497. <text class="info-value">{{ auditData.projectVO.projectTypeId }}</text>
  498. </view>
  499. </view>
  500. </view>
  501. <!-- 客户信息 -->
  502. <view class="info-section" v-if="auditData.docterVO">
  503. <view class="section-header">
  504. <view class="section-indicator"></view>
  505. <text class="section-title">客户信息</text>
  506. </view>
  507. <view class="client-list">
  508. <view class="client-item">
  509. <view class="client-info">
  510. <image class="avatar"
  511. src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/my_heads_icon.png">
  512. </image>
  513. <view class="client-txt">
  514. <view class="client-name">
  515. {{ auditData.docterVO.doctorName }}
  516. <text class="client-level">一级</text>
  517. </view>
  518. <view class="client-hospital">
  519. <text>{{ auditData.docterVO.institution }} </text>
  520. <view class="line"></view>
  521. <text>{{ auditData.docterVO.department || '-' }}</text>
  522. </view>
  523. </view>
  524. </view>
  525. <view class="client-stats">
  526. <view class="stat-item"><text class="num">{{ auditData.auditTaskInfoVO.taskCount }}
  527. </text>任务</view>
  528. <view class="stat-item"><text class="num">{{ auditData.auditTaskInfoVO.taskIntegral }}
  529. </text>积分</view>
  530. </view>
  531. </view>
  532. </view>
  533. </view>
  534. <!-- 审批信息 -->
  535. <view class="info-section" v-if="auditData">
  536. <view class="section-header">
  537. <view class="section-indicator"></view>
  538. <text class="section-title">审批流程</text>
  539. </view>
  540. <view class="approval-list">
  541. <view class="approval-item" v-for="(item, index) in auditData.auditFlows" :key="index">
  542. <view class="left">
  543. <view class="avatar-box">
  544. <image class="avatar"
  545. src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/my_heads_icon.png">
  546. </image>
  547. <image class="icon" v-if="item.status==1"
  548. src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_wait.png">
  549. </image>
  550. <image class="icon" v-if="item.status==2|| item.status ===0"
  551. src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_pass.png">
  552. </image>
  553. <image class="icon" v-if="item.status==3"
  554. src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_refuse.png">
  555. </image>
  556. </view>
  557. <view class="approval-user">
  558. <view class="user-name">{{ item.auditUserName }}</view>
  559. <view class="user-status"
  560. :style="{ color: item.status ===2|| item.status ===0 ? '#4CAF50' : item.status === 1 ? '#FF9800' : '#F44336' }">
  561. {{ item.statusName||'-' }}
  562. </view>
  563. <view class="approval-comment" v-if="item.comment">{{item.comment||'-'}}</view>
  564. </view>
  565. </view>
  566. <text class="approval-time">{{ item.auditTime || '-' }}</text>
  567. <view class="approval-line" v-if="index < auditData.auditFlows.length - 1"></view>
  568. </view>
  569. </view>
  570. </view>
  571. </scroll-view>
  572. <!-- 自定义图片预览模态框 -->
  573. <view class="image-preview-modal" v-if="imagePreview.show" @click="closeImagePreview">
  574. <view class="image-preview-content" @click.stop>
  575. <image class="preview-image" :src="imagePreview.urls[imagePreview.current]" mode="widthFix"></image>
  576. </view>
  577. </view>
  578. <view class="bottom-bar" v-if="auditData.audit && auditData.audit.status === 1 && isUserInLatestAuditUsers()">
  579. <view class="action-buttons">
  580. <view class="btn btn-cancel" @click="openRejectPopup">
  581. <image class="icon"
  582. src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_approval_no.png"></image>
  583. <text>驳回</text>
  584. </view>
  585. <view class="btn btn-submit" @click="handleNext">
  586. <image class="icon"
  587. src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_approval_yes.png"></image>
  588. <text>通过</text>
  589. </view>
  590. </view>
  591. </view>
  592. <!-- 驳回弹窗 -->
  593. <u-popup :show="showRejectPopup" mode="bottom" round="24" z-index="9999999">
  594. <view class="reject-popup-content">
  595. <view class="popup-header">
  596. <text class="popup-title">驳回</text>
  597. <image @click="showRejectPopup = false;" class="close"
  598. src="https://ysrw-1395926010.cos.ap-chengdu.myqcloud.com/image/icon_close.png"></image>
  599. </view>
  600. <view class="input-area">
  601. <textarea v-model="rejectReason" placeholder="请输入驳回意见" class="reason-input" :auto-height="true"
  602. maxlength="200" />
  603. </view>
  604. <view class="btn-group">
  605. <view class="button reject" @click="showRejectPopup = false">取消</view>
  606. <view class="button confirm" @click="handleConfirmReject ">确认驳回</view>
  607. </view>
  608. </view>
  609. </u-popup>
  610. </view>
  611. </template>
  612. <script>
  613. import utils from '@/utils/common.js'
  614. import {
  615. doAudit,
  616. doCreateAudit,
  617. getAuditFlows,
  618. getTaskFinishAuditInfo,
  619. detail
  620. } from '@/api/audit.js'
  621. import image from 'uview-ui/libs/config/props/image';
  622. export default {
  623. data() {
  624. return {
  625. userInfo: uni.getStorageSync('userInfo'),
  626. // 弹窗默认隐藏
  627. showRejectPopup: false,
  628. // 驳回意见
  629. rejectReason: '',
  630. // 状态栏高度
  631. statusBarHeight: (uni.getWindowInfo ? uni.getWindowInfo().statusBarHeight : (typeof wx !== 'undefined' &&
  632. wx.getWindowInfo ? wx.getWindowInfo().statusBarHeight : (uni.getSystemInfoSync && uni
  633. .getSystemInfoSync().statusBarHeight) || 0)),
  634. // 任务ID
  635. taskId: '',
  636. // 接口返回的原始数据(初始化为安全空对象,避免渲染期空指针)
  637. auditData: {
  638. audit: {},
  639. businessData: {},
  640. auditFlows: [],
  641. projectVO: null,
  642. docterVO: null
  643. },
  644. // 审批信息
  645. approvalInfo: [],
  646. // 图片预览
  647. imagePreview: {
  648. show: false,
  649. urls: [],
  650. current: 0
  651. },
  652. hospitalTitle: [],
  653. }
  654. },
  655. computed: {
  656. },
  657. onLoad(options) {
  658. if (options.taskId) {
  659. this.taskId = options.taskId
  660. this.loadData()
  661. utils.getDicts("hospital_title").then(res => {
  662. this.hospitalTitle = res || [];
  663. console.log(this.hospitalTitle, 'hospitalTitle')
  664. });
  665. }
  666. },
  667. methods: {
  668. getStatusBarHeight() {
  669. if (uni.getWindowInfo) return uni.getWindowInfo().statusBarHeight || 0
  670. if (typeof wx !== 'undefined' && wx.getWindowInfo) return wx.getWindowInfo().statusBarHeight || 0
  671. const info = uni.getSystemInfoSync && uni.getSystemInfoSync()
  672. return (info && info.statusBarHeight) || 0
  673. },
  674. imageList(field) {
  675. const b = (this.auditData && this.auditData.businessData) || {}
  676. const v = b[field]
  677. if (!v) return []
  678. if (Array.isArray(v)) return v.filter(Boolean)
  679. return String(v).split(',').map(s => String(s).trim().replace(/`/g, '')).filter(Boolean)
  680. },
  681. // 打开驳回弹窗
  682. openRejectPopup() {
  683. // 直接打开驳回弹窗
  684. this.showRejectPopup = true
  685. },
  686. //动态表单
  687. getFieldDisplay(label, isMultiple = false) {
  688. const apply = this.auditData.businessData.doctorLevelApplyVO;
  689. console.log(this.auditData, 'apply')
  690. if (!apply || !apply.formJson || !apply.dynamicFormData) return '-';
  691. let formJson = apply.formJson;
  692. if (typeof formJson === 'string') {
  693. try {
  694. formJson = JSON.parse(formJson);
  695. } catch (e) {
  696. return '-';
  697. }
  698. }
  699. const fields = formJson.fields || [];
  700. const field = fields.find(f => f.__config__.label === label);
  701. if (!field) return '-';
  702. const vModel = field.__vModel__;
  703. let value = apply.dynamicFormData[vModel];
  704. if (value === null || value === undefined || value === '') return '-';
  705. const options = field.__slot__?.options || [];
  706. const optionMap = new Map(options.map(opt => [String(opt.value), opt.label]));
  707. if (isMultiple) {
  708. const values = String(value).split(',').filter(Boolean);
  709. return values.map(v => optionMap.get(v) || v).join('、');
  710. } else {
  711. return optionMap.get(String(value)) || value;
  712. }
  713. },
  714. // 确认驳回
  715. async handleConfirmReject() {
  716. if (!this.rejectReason.trim()) {
  717. uni.showToast({
  718. title: '请输入驳回意见',
  719. icon: 'none'
  720. })
  721. return
  722. }
  723. try {
  724. uni.showLoading({
  725. title: '提交中...'
  726. })
  727. // 调用审核接口,传递action=2表示驳回
  728. const res = await doAudit({
  729. auditId: this.taskId,
  730. userId: this.userInfo.userId,
  731. businessType: this.auditData.audit.businessType,
  732. userType: 0,
  733. action: 2,
  734. comment: this.rejectReason,
  735. companyId: this.userInfo.companyId,
  736. businessId: this.auditData.audit.businessId
  737. })
  738. uni.hideLoading()
  739. if (res.code === 200) {
  740. uni.showToast({
  741. title: res.msg||res.message || '操作成功',
  742. icon: 'none',
  743. duration: 2000,
  744. mask: true
  745. })
  746. // 关闭弹窗
  747. this.showRejectPopup = false
  748. // 重置输入
  749. this.rejectReason = ''
  750. // 重新加载数据
  751. setTimeout(() => {
  752. this.loadData()
  753. }, 2000)
  754. this.goBack()
  755. } else {
  756. uni.showToast({
  757. title: res.message || res.msg || '操作失败',
  758. icon: 'none'
  759. })
  760. }
  761. } catch (e) {
  762. uni.hideLoading()
  763. console.error('驳回失败', e)
  764. }
  765. },
  766. // 返回上一页
  767. goBack() {
  768. uni.navigateBack()
  769. },
  770. // 加载数据
  771. async loadData() {
  772. try {
  773. uni.showLoading({
  774. title: '加载中...'
  775. })
  776. // 获取任务完成审核信息
  777. const res = await detail({
  778. auditId: this.taskId
  779. })
  780. if (res.code === 200) {
  781. this.auditData = res.data || {
  782. audit: {},
  783. businessData: {},
  784. auditFlows: []
  785. }
  786. }
  787. uni.hideLoading()
  788. } catch (e) {
  789. uni.hideLoading()
  790. console.error('加载数据失败', e)
  791. }
  792. },
  793. // 复制到剪贴板
  794. copyToClipboard(text) {
  795. uni.setClipboardData({
  796. data: text,
  797. success() {
  798. uni.showToast({
  799. title: '复制成功',
  800. icon: 'success'
  801. })
  802. }
  803. })
  804. },
  805. // 下载附件
  806. downloadAttachment() {
  807. uni.showToast({
  808. title: '开始下载附件',
  809. icon: 'none'
  810. })
  811. // 实际项目中添加下载逻辑:uni.downloadFile + uni.saveFile
  812. },
  813. // 解析formJson数据
  814. parseFormJson(formJson) {
  815. try {
  816. if (!formJson) return {};
  817. // 解析JSON字符串
  818. const parsed = typeof formJson === 'string' ? JSON.parse(formJson) : formJson;
  819. const fields = parsed.fields || [];
  820. const result = {};
  821. // 遍历所有字段,提取label和value
  822. fields.forEach(field => {
  823. const config = field.__config__;
  824. const label = config.label;
  825. const vModel = field.__vModel__;
  826. const value = field[vModel];
  827. // 对于select类型的字段,可能需要根据value找到对应的label
  828. if (field.options && Array.isArray(field.options)) {
  829. const option = field.options.find(opt => opt.value === value);
  830. result[label] = option ? option.label : value;
  831. } else {
  832. result[label] = value;
  833. }
  834. });
  835. return result;
  836. } catch (e) {
  837. console.error('解析formJson失败:', e);
  838. return {};
  839. }
  840. },
  841. // 备用方法(实际用openRejectPopup)
  842. handlePrev() {
  843. this.openRejectPopup()
  844. },
  845. // 审批通过
  846. async handleNext() {
  847. try {
  848. uni.showLoading({
  849. title: '提交中...'
  850. })
  851. // 调用审核接口,传递action=1表示通过
  852. const res = await doAudit({
  853. auditId: this.taskId,
  854. userId: this.userInfo.userId,
  855. businessType: this.auditData.audit.businessType,
  856. userType: 0,
  857. action: 1,
  858. comment: "",
  859. companyId: this.userInfo.companyId,
  860. businessId: this.auditData.audit.businessId
  861. })
  862. uni.hideLoading()
  863. if (res.code === 200) {
  864. uni.showToast({
  865. title: res.message || res.msg || '操作成功',
  866. icon: 'none',
  867. duration: 2000,
  868. mask: true
  869. })
  870. // 重新加载数据
  871. setTimeout(() => {
  872. this.loadData()
  873. }, 2000)
  874. this.goBack()
  875. } else {
  876. uni.showToast({
  877. title: res.message || res.msg || '操作失败',
  878. icon: 'none'
  879. })
  880. }
  881. } catch (e) {
  882. }
  883. },
  884. // 自定义图片预览
  885. showImagePreview(url) {
  886. if (url) {
  887. this.imagePreview.show = true;
  888. this.imagePreview.urls = [url];
  889. this.imagePreview.current = 0;
  890. }
  891. },
  892. // 关闭图片预览
  893. closeImagePreview() {
  894. this.imagePreview.show = false;
  895. },
  896. openUrl(url) {
  897. if (!url) {
  898. return
  899. }
  900. // #ifdef H5
  901. window.open(url, '_blank')
  902. // #endif
  903. // #ifdef APP-PLUS
  904. plus.runtime.openURL(url)
  905. // #endif
  906. // #ifdef MP-WEIXIN
  907. this.copyToClipboard(url)
  908. uni.showToast({
  909. title: '链接已复制,可在浏览器打开',
  910. icon: 'none'
  911. })
  912. // #endif
  913. },
  914. // 判断用户是否在最新的审核人中
  915. isUserInLatestAuditUsers() {
  916. try {
  917. // 获取用户信息
  918. const userInfo = uni.getStorageSync('userInfo');
  919. if (!userInfo || !userInfo.userId) {
  920. console.log('用户信息不存在或没有 userId');
  921. return false;
  922. }
  923. const userId = userInfo.userId.toString();
  924. console.log('当前用户 userId:', userId);
  925. // 检查 auditData 和 auditFlows 是否存在且不为空
  926. if (!this.auditData || !this.auditData.auditFlows || this.auditData.auditFlows.length === 0) {
  927. console.log('auditData 或 auditFlows 不存在或为空');
  928. return false;
  929. }
  930. // 获取 auditFlows 数组的最后一个项作为最新的审核步骤
  931. const latestFlow = this.auditData.auditFlows[this.auditData.auditFlows.length - 1];
  932. console.log('最新的审核步骤:', latestFlow);
  933. // 检查最新步骤的审核人
  934. if (latestFlow && latestFlow.auditUserIds) {
  935. console.log('最新步骤的 auditUserIds:', latestFlow.auditUserIds);
  936. // 解析 auditUserIds 字符串为数组
  937. try {
  938. const auditUserIds = JSON.parse(latestFlow.auditUserIds);
  939. console.log('解析后的 auditUserIds:', auditUserIds);
  940. if (Array.isArray(auditUserIds)) {
  941. // 检查 userId 是否在最新的审核人中,转换类型以确保匹配
  942. const result = auditUserIds.some(id => id.toString() === userId);
  943. console.log('用户是否在最新审核人中:', result);
  944. return result;
  945. }
  946. } catch (error) {
  947. console.error('解析 auditUserIds 失败:', error);
  948. }
  949. }
  950. console.log('用户不在最新审核人中');
  951. return false;
  952. } catch (error) {
  953. console.error('判断用户是否在最新审核人中失败:', error);
  954. return false;
  955. }
  956. },
  957. // 根据职称值获取职称名称
  958. getHospitalTitle(jobTitle) {
  959. console.log(jobTitle, 'jobTitle')
  960. console.log(this.hospitalTitle, 'hospitalTitle')
  961. if (!jobTitle || !this.hospitalTitle ) {
  962. return '-';
  963. }
  964. const title = this.hospitalTitle.find(item => item.dictValue == jobTitle);
  965. console.log(title, 'title')
  966. return title ? title.dictLabel : '-';
  967. }
  968. }
  969. }
  970. </script>
  971. <style lang="scss" scoped>
  972. // 弹窗样式
  973. .reject-popup-content {
  974. padding: 32rpx;
  975. box-sizing: border-box;
  976. overflow: hidden;
  977. border-radius: 24rpx 24rpx 0 0;
  978. .popup-header {
  979. display: flex;
  980. justify-content: center;
  981. align-items: center;
  982. margin-bottom: 32rpx;
  983. position: relative;
  984. .popup-title {
  985. font-size: 32rpx;
  986. font-weight: bold;
  987. color: #333;
  988. }
  989. .close {
  990. position: absolute;
  991. right: 0;
  992. width: 44rpx;
  993. height: 44rpx;
  994. }
  995. }
  996. .input-area {
  997. margin-bottom: 40rpx;
  998. .reason-input {
  999. min-height: 120rpx;
  1000. padding: 20rpx;
  1001. background: #F7F8FA;
  1002. border-radius: 12rpx;
  1003. font-size: 28rpx;
  1004. color: #333;
  1005. width: 100%; // 新增:确保输入框宽度100%
  1006. box-sizing: border-box;
  1007. }
  1008. }
  1009. .btn-group {
  1010. display: flex;
  1011. gap: 24rpx;
  1012. .button {
  1013. width: 332rpx;
  1014. height: 80rpx;
  1015. flex: 1;
  1016. border-radius: 200rpx;
  1017. font-size: 28rpx;
  1018. text-align: center;
  1019. line-height: 80rpx;
  1020. }
  1021. .reject {
  1022. color: #388BFF;
  1023. background: #FFFFFF;
  1024. border-radius: 200rpx 200rpx 200rpx 200rpx;
  1025. border: 2rpx solid #388BFF;
  1026. }
  1027. .confirm {
  1028. background: #388BFF;
  1029. color: #FFFFFF;
  1030. }
  1031. }
  1032. }
  1033. // 原有样式
  1034. .container {
  1035. min-height: 100vh;
  1036. background: #f5f5f5;
  1037. display: flex;
  1038. flex-direction: column;
  1039. height: auto;
  1040. &::before {
  1041. content: '';
  1042. position: absolute;
  1043. top: 0;
  1044. left: 0;
  1045. right: 0;
  1046. width: 100%;
  1047. height: 532rpx;
  1048. background: linear-gradient(180deg, rgba(56, 139, 255, 0.79) 0%, rgba(56, 139, 255, 0) 100%);
  1049. }
  1050. }
  1051. .top {
  1052. display: flex;
  1053. justify-content: center;
  1054. align-items: center;
  1055. height: 88rpx;
  1056. position: relative;
  1057. font-weight: 600;
  1058. font-size: 36rpx;
  1059. color: #FFFFFF;
  1060. .return {
  1061. position: absolute;
  1062. left: 32rpx;
  1063. width: 40rpx;
  1064. height: 40rpx;
  1065. }
  1066. }
  1067. .content {
  1068. flex: 1;
  1069. padding: 24rpx;
  1070. box-sizing: border-box;
  1071. padding-bottom: 200rpx;
  1072. }
  1073. /* 任务卡片样式 */
  1074. .task-card {
  1075. background: #fff;
  1076. border-radius: 16rpx;
  1077. padding: 24rpx;
  1078. margin-bottom: 24rpx;
  1079. .card-header {
  1080. display: flex;
  1081. justify-content: space-between;
  1082. .card-title {
  1083. font-weight: 500;
  1084. font-size: 36rpx;
  1085. color: #333333;
  1086. margin-bottom: 24rpx;
  1087. }
  1088. .card-lable {
  1089. height: 40rpx;
  1090. box-sizing: border-box;
  1091. padding: 4rpx 12rpx;
  1092. font-size: 24rpx;
  1093. border-radius: 8rpx;
  1094. &.pending {
  1095. background: #FEF8E3;
  1096. color: #DE9B14;
  1097. }
  1098. &.reject {
  1099. background: #FFF4F5;
  1100. color: #CF3546;
  1101. }
  1102. &.pass {
  1103. color: #07C160;
  1104. background: #E6FAEF;
  1105. }
  1106. }
  1107. }
  1108. .card-meta {
  1109. display: flex;
  1110. align-items: center;
  1111. gap: 16rpx;
  1112. font-size: 24rpx;
  1113. color: #666;
  1114. .item {
  1115. display: flex;
  1116. align-items: center;
  1117. image {
  1118. width: 32rpx;
  1119. height: 32rpx;
  1120. margin-right: 16rpx;
  1121. }
  1122. }
  1123. }
  1124. }
  1125. /* 通用信息区块样式 */
  1126. .info-section {
  1127. background: #fff;
  1128. border-radius: 16rpx;
  1129. padding: 24rpx;
  1130. margin-bottom: 24rpx;
  1131. .section-header {
  1132. display: flex;
  1133. align-items: center;
  1134. margin-bottom: 24rpx;
  1135. .section-indicator {
  1136. width: 6rpx;
  1137. height: 32rpx;
  1138. background: #388BFF;
  1139. border-radius: 3rpx;
  1140. margin-right: 16rpx;
  1141. }
  1142. .section-title {
  1143. font-weight: 600;
  1144. font-size: 32rpx;
  1145. color: #333333;
  1146. }
  1147. }
  1148. .info-list {
  1149. .info-item {
  1150. display: flex;
  1151. margin-bottom: 24rpx;
  1152. &:last-child {
  1153. margin-bottom: 0;
  1154. }
  1155. .info-label {
  1156. width: 50%;
  1157. font-size: 28rpx;
  1158. color: #666;
  1159. flex-shrink: 0;
  1160. }
  1161. .info-value {
  1162. flex: 1;
  1163. text-align: end;
  1164. font-size: 28rpx;
  1165. color: #333;
  1166. }
  1167. .copy-btn {
  1168. margin-left: 16rpx;
  1169. color: #2196F3;
  1170. font-size: 24rpx;
  1171. cursor: pointer;
  1172. }
  1173. .column {
  1174. flex-direction: column;
  1175. }
  1176. .attachment-item {
  1177. margin-top: 24rpx;
  1178. display: flex;
  1179. justify-content: space-between;
  1180. align-items: center;
  1181. gap: 16rpx;
  1182. background: #F7F8FA;
  1183. border-radius: 16rpx 16rpx 16rpx 16rpx;
  1184. .left {
  1185. display: flex;
  1186. align-items: center;
  1187. .img {
  1188. width: 72rpx;
  1189. height: 72rpx;
  1190. margin-right: 24rpx;
  1191. }
  1192. .txt-item {
  1193. .attachment-name {
  1194. font-size: 28rpx;
  1195. color: #333;
  1196. }
  1197. .attachment-size {
  1198. font-size: 24rpx;
  1199. color: #999;
  1200. }
  1201. }
  1202. }
  1203. .download-btn {
  1204. width: 32rpx;
  1205. height: 32rpx;
  1206. }
  1207. }
  1208. }
  1209. }
  1210. }
  1211. /* 客户信息样式 */
  1212. .client-list {
  1213. .client-item {
  1214. display: flex;
  1215. justify-content: space-between;
  1216. align-items: center;
  1217. padding: 16rpx 0;
  1218. &:last-child {
  1219. border-bottom: none;
  1220. }
  1221. .client-info {
  1222. display: flex;
  1223. align-items: center;
  1224. .avatar {
  1225. width: 88rpx;
  1226. height: 88rpx;
  1227. margin-right: 24rpx;
  1228. }
  1229. .client-txt {
  1230. .client-name {
  1231. font-size: 28rpx;
  1232. font-weight: 500;
  1233. color: #333;
  1234. .client-level {
  1235. margin-left: 8rpx;
  1236. padding: 2rpx 8rpx;
  1237. background: #FFF6E5;
  1238. color: #C89743;
  1239. font-size: 22rpx;
  1240. border-radius: 8rpx;
  1241. }
  1242. }
  1243. }
  1244. .client-hospital {
  1245. font-size: 24rpx;
  1246. color: #666;
  1247. margin-top: 4rpx;
  1248. display: flex;
  1249. align-items: center;
  1250. .line {
  1251. width: 2rpx;
  1252. height: 28rpx;
  1253. background: #EAEBEE;
  1254. margin: 0 24rpx;
  1255. }
  1256. }
  1257. }
  1258. .client-stats {
  1259. display: flex;
  1260. gap: 24rpx;
  1261. font-size: 24rpx;
  1262. color: #999999;
  1263. .stat-item {
  1264. display: flex;
  1265. flex-direction: column;
  1266. align-items: center;
  1267. .num {
  1268. font-weight: 500;
  1269. font-size: 28rpx;
  1270. color: #333333;
  1271. }
  1272. }
  1273. }
  1274. }
  1275. }
  1276. /* 资质信息样式 */
  1277. .qualification-list {
  1278. .qualification-item {
  1279. margin-bottom: 32rpx;
  1280. &:last-child {
  1281. margin-bottom: 0;
  1282. }
  1283. .qualification-label {
  1284. display: block;
  1285. font-size: 28rpx;
  1286. color: #666666;
  1287. margin-bottom: 16rpx;
  1288. }
  1289. .image-grid {
  1290. display: flex;
  1291. flex-wrap: wrap;
  1292. gap: 16rpx;
  1293. .qualification-image {
  1294. width: calc((100% - 32rpx) / 2);
  1295. height: 240rpx;
  1296. border-radius: 8rpx;
  1297. object-fit: cover;
  1298. }
  1299. }
  1300. }
  1301. }
  1302. /* 审批信息样式 */
  1303. .approval-list {
  1304. .approval-item {
  1305. position: relative;
  1306. padding-left: 24rpx;
  1307. margin-bottom: 68rpx;
  1308. display: flex;
  1309. align-items: center;
  1310. justify-content: space-between;
  1311. &:last-child {
  1312. margin-bottom: 0;
  1313. }
  1314. .left {
  1315. display: flex;
  1316. // align-items: center;
  1317. .avatar-box {
  1318. width: 80rpx;
  1319. height: 80rpx;
  1320. margin-right: 32rpx;
  1321. position: relative;
  1322. .avatar {
  1323. width: 100%;
  1324. height: 100%;
  1325. }
  1326. .icon {
  1327. position: absolute;
  1328. bottom: 0;
  1329. right: 0;
  1330. width: 32rpx;
  1331. height: 32rpx;
  1332. }
  1333. }
  1334. .approval-user {
  1335. gap: 12rpx;
  1336. .user-name {
  1337. font-weight: 500;
  1338. font-size: 28rpx;
  1339. color: #333;
  1340. }
  1341. .user-status {
  1342. font-size: 24rpx;
  1343. }
  1344. }
  1345. }
  1346. .approval-time {
  1347. font-size: 24rpx;
  1348. color: #999;
  1349. margin-top: 4rpx;
  1350. }
  1351. .approval-comment{
  1352. margin-top: 14rpx;
  1353. width: 100%;
  1354. padding: 20rpx;
  1355. font-size: 28rpx;
  1356. background: #F7F8FA;
  1357. border-radius: 16rpx 16rpx 16rpx 16rpx;
  1358. }
  1359. }
  1360. .approval-line {
  1361. position: absolute;
  1362. left: 64rpx;
  1363. bottom: -64rpx;
  1364. width: 1rpx;
  1365. height: 56rpx;
  1366. background: #BFD8FF;
  1367. }
  1368. }
  1369. .reason {
  1370. font-size: 28rpx;
  1371. color: #666666;
  1372. line-height: 40rpx;
  1373. margin-left: 136rpx;
  1374. background: #F7F8FA;
  1375. border-radius: 16rpx;
  1376. line-height: 40rpx;
  1377. padding: 20rpx;
  1378. }
  1379. .bottom-bar {
  1380. position: fixed;
  1381. bottom: 0;
  1382. left: 0;
  1383. right: 0;
  1384. background: #fff;
  1385. padding: 24rpx 32rpx;
  1386. border-top: 1rpx solid #F2F3F5;
  1387. z-index: 100;
  1388. display: flex;
  1389. align-items: center;
  1390. .action-buttons {
  1391. display: flex;
  1392. flex: 1;
  1393. justify-content: space-between;
  1394. .btn {
  1395. width: 292rpx;
  1396. height: 88rpx;
  1397. display: flex;
  1398. align-items: center;
  1399. justify-content: center;
  1400. font-size: 32rpx;
  1401. font-weight: 500;
  1402. border-radius: 200rpx 200rpx 200rpx 200rpx;
  1403. cursor: pointer;
  1404. display: flex;
  1405. align-items: center;
  1406. &.btn-cancel {
  1407. background: #fff;
  1408. border: 2rpx solid #CF3546;
  1409. color: #CF3546;
  1410. }
  1411. &.btn-submit {
  1412. background: #388BFF;
  1413. color: #fff;
  1414. }
  1415. .icon {
  1416. width: 32rpx;
  1417. height: 32rpx;
  1418. margin-right: 16rpx;
  1419. }
  1420. }
  1421. }
  1422. }
  1423. /* 自定义图片预览样式 */
  1424. .image-preview-modal {
  1425. position: fixed;
  1426. top: 0;
  1427. left: 0;
  1428. right: 0;
  1429. bottom: 0;
  1430. background-color: rgba(0, 0, 0, 0.8);
  1431. display: flex;
  1432. justify-content: center;
  1433. align-items: center;
  1434. z-index: 9999;
  1435. }
  1436. .image-preview-content {
  1437. position: relative;
  1438. width: 100%;
  1439. max-height: 90vh;
  1440. display: flex;
  1441. flex-direction: column;
  1442. align-items: center;
  1443. }
  1444. .preview-image {
  1445. width: 100%;
  1446. max-height: 80vh;
  1447. object-fit: contain;
  1448. }
  1449. .link {
  1450. color: #388BFF;
  1451. text-decoration: underline;
  1452. display: block;
  1453. overflow: hidden;
  1454. text-overflow: ellipsis;
  1455. white-space: nowrap;
  1456. max-width: 100%;
  1457. }
  1458. .close-button {
  1459. position: absolute;
  1460. top: -60rpx;
  1461. right: 0;
  1462. width: 60rpx;
  1463. height: 60rpx;
  1464. background-color: rgba(0, 0, 0, 0.5);
  1465. color: #ffffff;
  1466. border-radius: 50%;
  1467. display: flex;
  1468. justify-content: center;
  1469. align-items: center;
  1470. font-size: 40rpx;
  1471. font-weight: bold;
  1472. cursor: pointer;
  1473. }
  1474. </style>