酷炫直播运营系统小程序版本

submitApply.vue 45KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334
  1. <template>
  2. <view style="background: linear-gradient(180deg, #333947 0%, #242A37 100%);" v-if="!table_loading">
  3. <view v-if="apply_id" style="display: flex;align-items: center;margin-left:32rpx;margin-top:20rpx">
  4. <text style="color:#FFFFFF;font-size:26rpx;">报销单(序列号:{{reimburse_info&&reimburse_info.id}})</text>
  5. <view :class="['statusReimbursement',reimburse_info.status==0?'bg-4F7EFF':reimburse_info.status==1?'bg-ECBE64':reimburse_info.status==2?'bg-58BCA6':reimburse_info.status==3?'bg-F03F5C':'']" v-if="reimburse_info">
  6. {{reimburse_info.is_resubmited==1?'已重新提审':(reimburse_info.status==0?'已保存':reimburse_info.status==1?'待审核':reimburse_info.status==2?'审核通过':reimburse_info.status==3?'审核驳回':'')}}
  7. </view>
  8. </view>
  9. <view class="applyTop">
  10. <view class="item">公司:{{reimburse_info&&reimburse_info.company?reimburse_info.company:'-'}}</view>
  11. <view class="item">部门:{{reimburse_info&&reimburse_info.department?reimburse_info.department:'-'}}</view>
  12. <view class="item">岗位:{{reimburse_info&&reimburse_info.station_name?reimburse_info.station_name:'-'}}</view>
  13. <view class="item">经手人:{{reimburse_info&&reimburse_info.staff_name?reimburse_info.staff_name:'-'}}</view>
  14. </view>
  15. <view class="table">
  16. <view class="self-table self-table-border">
  17. <view class="self-table-tr self-table-head">
  18. <view class="self-table-th" style="width:80rpx;flex: initial;" v-if="editFlag">
  19. <view :class="['self-checkbox',allSelection?'self-checkbox-active':'']" @click="handleSelectionChange('all')">
  20. <view class="iconfont icon-queren_icon"></view>
  21. </view>
  22. </view>
  23. <view class="self-table-th">直播日期</view>
  24. <view class="self-table-th">金额</view>
  25. <view class="self-table-th border-none" style="width: 200rpx;flex: auto;padding:0">
  26. <view class="self-table-th table-th">出发</view>
  27. <view class="flex" style="overflow: hidden;border-top: 2rpx solid #3D4453;">
  28. <view class="self-table-th table-th">时间</view>
  29. <view class="self-table-th table-th">地点</view>
  30. </view>
  31. </view>
  32. <view class="self-table-th border-none" style="width: 200rpx;flex: auto;padding:0">
  33. <view class="self-table-th table-th">到达</view>
  34. <view class="flex" style="overflow: hidden;border-top: 2rpx solid #3D4453;">
  35. <view class="self-table-th table-th">时间</view>
  36. <view class="self-table-th table-th">地点</view>
  37. </view>
  38. </view>
  39. <view class="self-table-th">交通工具</view>
  40. <view class="self-table-th">事由说明</view>
  41. <view class="self-table-th">加班类型</view>
  42. <view class="self-table-th" v-if="editFlag">操作</view>
  43. <view class="self-table-th" v-if="source=='audit'">核对</view>
  44. </view>
  45. <scroll-view class="self-table-body" scroll-y="true">
  46. <view class="self-table-tr" v-for="(item,index) in data_list" :key="index">
  47. <view class="self-table-td" style="width:80rpx;flex: initial;" v-if="editFlag">
  48. <view :class="['self-checkbox',multipleIdArr.indexOf(item.self_id) != -1 ? 'self-checkbox-active' : '']" @click="handleSelectionChange(index)">
  49. <view class="iconfont icon-queren_icon"></view>
  50. </view>
  51. </view>
  52. <view class="self-table-td">
  53. <view v-if="item.type==2">{{item.date}}</view>
  54. <template v-else>
  55. <view class="liveApplyItem" v-for="(item1) in item.list" :key="'date'+item1.id">
  56. {{item1.date}}
  57. </view>
  58. </template>
  59. </view>
  60. <view class="self-table-td">
  61. <template v-if="item.type==2">
  62. <view>{{item.amount}}</view>
  63. <view style="border-top:1px solid #3D4453" v-if="item.toll_fee">{{item.toll_fee}}</view>
  64. </template>
  65. <template v-else>
  66. <view class="liveApplyItem" v-for="(item1) in item.list" :key="'amount'+item1.id">
  67. <view style="width:calc(100%)">
  68. <view>{{item1.amount}}</view>
  69. <view style="border-top:1px solid #3D4453" v-if="item1.toll_fee">
  70. {{item1.toll_fee}}
  71. </view>
  72. </view>
  73. </view>
  74. </template>
  75. </view>
  76. <view class="self-table-td flex" style="width: 200rpx;flex: auto;">
  77. <view class="self-table-td border-none">
  78. <view v-if="item.type==2">{{item.start_time}}</view>
  79. <template v-else>
  80. <view class="liveApplyItem" v-for="(item1) in item.list" :key="'start_time'+item1.id">
  81. <view>{{item1.start_time}}</view>
  82. </view>
  83. </template>
  84. </view>
  85. <view class="self-table-td">
  86. <view v-if="item.type==2">{{item.start_site}}</view>
  87. <template v-else>
  88. <view class="liveApplyItem" v-for="(item1) in item.list" :key="'start_site'+item1.id">
  89. <view class="ellipsis_2">{{item1.start_site}}</view>
  90. </view>
  91. </template>
  92. </view>
  93. </view>
  94. <view class="self-table-td flex" style="width: 200rpx;flex: auto;">
  95. <view class="self-table-td border-none">
  96. <template v-if="item.type==2">
  97. <view>{{item.end_time}}</view>
  98. </template>
  99. <template v-else>
  100. <view class="liveApplyItem" v-for="(item1) in item.list" :key="'end_time'+item1.id">
  101. <view>{{item1.end_time}}</view>
  102. </view>
  103. </template>
  104. </view>
  105. <view class="self-table-td">
  106. <view v-if="item.type==2">{{item.end_site}}</view>
  107. <template v-else>
  108. <view class="liveApplyItem" style="line-height:20px" v-for="(item1) in item.list" :key="'end_site'+item1.id">
  109. <view class="ellipsis_2">{{item1.end_site}}</view>
  110. </view>
  111. </template>
  112. </view>
  113. </view>
  114. <view class="self-table-td">
  115. <view v-if="item.type==2">{{item.car_type == 1 ? '出租车' : '网约车'}}</view>
  116. <template v-else>
  117. <view class="liveApplyItem" v-for="(item1) in item.list" :key="'car_type'+item1.id">
  118. {{item1.car_type == 1 ? '出租车' : '网约车'}}
  119. </view>
  120. </template>
  121. </view>
  122. <view class="self-table-td">
  123. <template v-if="item.type==2">
  124. <view class="ellipsis ellipsis_2">
  125. {{item.reason?item.reason:'-'}}
  126. <text v-if="item.remark">
  127. ({{item.remark?item.remark:'-'}})
  128. </text>
  129. </view>
  130. <view style="border-top:1px solid #3D4453" v-if="item.toll_fee">过路费</view>
  131. </template>
  132. <template v-else>
  133. <view class="liveApplyItem" v-for="(item1) in item.list" :key="'reason'+item1.id">
  134. <view style="width:100%">
  135. <view class="ellipsis ellipsis_2" style="line-height:18px">
  136. {{item1.reason?item1.reason:'-'}}
  137. <text v-if="item1.remark">
  138. ({{item1.remark?item1.remark:'-'}})
  139. </text>
  140. </view>
  141. <view style="border-top:1px solid #3D4453" v-if="item1.toll_fee">过路费
  142. </view>
  143. </view>
  144. </view>
  145. </template>
  146. </view>
  147. <view class="self-table-td">
  148. <view v-if="item.type==2">普通加班</view>
  149. <template v-else>
  150. <view class="liveApplyItem" v-for="(item1) in item.list" :key="'type'+item1.id">
  151. 直播加班
  152. </view>
  153. </template>
  154. </view>
  155. <view class="self-table-td flex-center" v-if="editFlag">
  156. <!-- 其他报销 -->
  157. <template v-if="item.type==2">
  158. <text v-if="item.status==0||item.status==3" type="text" size="small" @click.stop="editClick(item,1,1)" class="c-5B80F4">编辑</text>
  159. <text v-else type="text" size="small" @click.stop="editClick(item,1,2)" class="c-5B80F4">查看</text>
  160. </template>
  161. <!-- 直播报销 -->
  162. <template v-else>
  163. <view class="liveApplyItem" v-if="item.list&&item.list.length>0">
  164. <text v-if="item.list[0].status==0||item.list[0].status==3" type="text" size="small" @click.stop="editClick(item.list[0],0,1)" class="c-5B80F4">编辑</text>
  165. <text v-else type="text" size="small" @click.stop="editClick(item.list[0],0,2)" class="c-5B80F4">查看</text>
  166. </view>
  167. </template>
  168. </view>
  169. <view class="self-table-td" v-if="source=='audit'">
  170. <view class="self-table-td border-none" v-if="item.type==2">
  171. <view :class="['self-checkbox',checkList.indexOf(item.id) != -1 ? 'self-checkbox-active' : '']" @click="checkCheckbox" :data-id='item.id'>
  172. <view class="iconfont icon-queren_icon"></view>
  173. </view>
  174. </view>
  175. <template v-else>
  176. <view class="liveApplyItem" v-for="(item1) in item.list" :key="'check'+item1.id">
  177. <view :class="['self-checkbox',checkList.indexOf(item1.id) != -1 ? 'self-checkbox-active' : '']" @click="checkCheckbox" :data-id='item1.id'>
  178. <view class="iconfont icon-queren_icon"></view>
  179. </view>
  180. </view>
  181. </template>
  182. </view>
  183. </view>
  184. </scroll-view>
  185. </view>
  186. </view>
  187. <view class="loading_hint" v-if="data_list.length==0">暂无订单</view>
  188. <view style="margin-left:40rpx">
  189. <view class="topDataItem">
  190. <view class="label">报销摘要:</view>
  191. <text class="labelCon">加班打车</text>
  192. </view>
  193. <view class="topDataItem">
  194. <view class="label">报销金额:</view>
  195. <text class="labelCon" style="color:#4f7eff;font-weight:bold">¥{{$formatNum(amount)}}</text>
  196. </view>
  197. <view class="topDataItem" style="display: block;">
  198. <view class="label flex" style="align-items: flex-start;"><text style="color:#FF2B2B">*</text>图片附件:<view style="color:#FF2B2B;flex:1">网约车需上传发票和行程单明细截图,出租车和过路费需上传小票。文件不可超过2M。</view>
  199. </view>
  200. <view class="flex" style="margin-top:20rpx" v-if="editFlag">
  201. <view class="imgbox imgbox2" v-for="(item,index) in file_urls" :key="'file'+index" @click="openFile(index,'file_urls')">
  202. <view class="iconfont icon-butongguo_icon" @click.stop="removeFile(index)"></view>
  203. <image src="../../static/img/pdf.png" mode="widthFix" v-if="item.indexOf('.pdf')!=-1"></image>
  204. <image v-else :src="item"></image>
  205. </view>
  206. <view class="uploadFile" @click="uploadFileEvent">+</view>
  207. </view>
  208. <view class="flex" style="margin-top:20rpx" v-else>
  209. <view class="imgbox" v-for="(item,index) in file_urls" :key="'file'+index" @click="openFile(index,'file_urls')">
  210. <image src="../../static/img/pdf.png" mode="widthFix" v-if="item.indexOf('.pdf')!=-1"></image>
  211. <image v-else :src="item" mode="widthFix"></image>
  212. </view>
  213. </view>
  214. </view>
  215. <view class="topDataItem tMar17 flex" style="align-items: flex-start;" v-if="editFlag">
  216. <view class="label" style="margin-top:14rpx">备注:</view>
  217. <textarea class="textarea" :value='remarks' placeholder-style="color:#B8B8B8" placeholder="请输入备注" @input="textareaBlur" />
  218. </view>
  219. <view class="topDataItem tMar10" v-else>
  220. <view class="label">备注:</view>
  221. <text class="labelCon">{{remarks?remarks:''}}</text>
  222. </view>
  223. <view class="topDataItem tMar20" v-if="apply_id&&reimburse_info&&reimburse_info.status!=0">
  224. <view class="label">附件:</view>
  225. <view class="flex" style="flex-wrap: wrap;">
  226. <view class="enclosure" v-for="(item,index) in reimburse_info.file_submits" :key="'file'+index" @click.stop="openFile(index)">
  227. <view class="iconfont icon-xiazai_icon"></view>
  228. {{item && item.split('/') && item.split('/')[item.split('/').length - 1] ? item.split('/')[item.split('/').length - 1]:'附件'}}
  229. </view>
  230. </view>
  231. </view>
  232. <view class="h3_title">审批流程</view>
  233. <view class="timelineBox tMar15">
  234. <view class="timeLineItem" v-for="(item, index) in examine_info" :key="index">
  235. <view :class="['iconfont icon-shenpi_icon']" :style="item.execute_info&&item.execute_info.status==2?'color:#5B80F4':item.execute_info&&item.execute_info.status==3?'color:#FF2B2B':''">
  236. </view>
  237. <view class="timeLineContent">
  238. <view class="contentTime">{{index+1}}级审批
  239. <text v-if="item.executors&&item.executors.length!=0">({{item.executors.join(',')}})</text>
  240. </view>
  241. <template v-if="item.execute_info&&item.execute_info.executor_name">
  242. <view class="approver">
  243. <view class="label">审批人:</view>
  244. {{item.execute_info.executor_name}} ·
  245. {{item.execute_info&&item.execute_info.status==1?'审核中':item.execute_info&&item.execute_info.status==2?'已通过':item.execute_info&&item.execute_info.status==3?'已驳回':''}}
  246. </view>
  247. <view class="approver">
  248. <view class="label" v-if="item.execute_info&&item.execute_info.execute_time">审批时间:
  249. </view>
  250. {{item.execute_info.execute_time}}
  251. </view>
  252. </template>
  253. <view class="approver" v-if="item.execute_info&&item.execute_info.execute_remarks">
  254. <view class="label">审批意见:</view>
  255. <view style="flex:1">{{item.execute_info.execute_remarks}}</view>
  256. </view>
  257. <view class="approver" v-if="item.execute_info&&item.execute_info.execute_file_url&&item.execute_info.execute_file_url.length>0">
  258. <view class="label">附件:</view>
  259. <view style="flex:1;display: flex;align-items: center;flex-wrap: wrap">
  260. <view v-for="(cf,cfidx) in item.execute_info.execute_file_url" :key="cfidx" class="pointer tMar5">
  261. <view @click="openFile(cfidx,'uploadFileList',cf.file_url)" class="enclosureNow">{{cf.file_name}}</view>
  262. </view>
  263. </view>
  264. </view>
  265. </view>
  266. </view>
  267. </view>
  268. <template v-if="commentList&&commentList.length>0">
  269. <view class="h3_title">回复</view>
  270. <view>
  271. <view v-for="(c,cidx) in commentList" :key="c.id" class="tMar10">
  272. <text class="c-999 f20 rMar10">{{c.created_at?c.created_at:'-'}}</text>
  273. <text class="f24">{{c.staff_name?c.staff_name:'-'}}: </text>
  274. <text class="f24 line18">{{c.comment?c.comment:'-'}}</text>
  275. <view v-if="c.file_url&&c.file_url.length>0" style="display: flex;align-items: center;flex-wrap: wrap">
  276. <view v-for="(cf,cfidx) in c.file_url" :key="cfidx" class="pointer tMar5">
  277. <view @click="openFile(cfidx,'uploadFileList',cf.file_url)" class="enclosureNow">{{cf.file_name}}</view>
  278. </view>
  279. </view>
  280. </view>
  281. </view>
  282. </template>
  283. <template v-if="(p_id&&source == 'audit') || (orderStatus==1&&selfFlag)">
  284. <view class="topDataItem tMar17 flex" style="align-items: flex-start;position: relative">
  285. <view class="label" style="margin-top:14rpx">备注:</view>
  286. <textarea class="textarea" placeholder-style="color:#B8B8B8" placeholder="请输入备注,输入@即可选择需要提醒的人" v-model="remarks_audit" @input="remarks_auditBlur" />
  287. <view @click="uploadFileEventComment" class="addFileCss">添加附件</view>
  288. <view v-show="showStaffList" class="staffCss">
  289. <view class="flex" v-for="(c,cidx) in commentStaffList" :key="c.staff_id" @click="chooseStaff(c)">
  290. <!-- <view :style="c.checked ? 'color: #0c4fe7' : ''">{{c.staff_name}}</view>-->
  291. <view>{{c.staff_name}}</view>
  292. </view>
  293. </view>
  294. </view>
  295. <view class="label" style="font-size: 24rpx;color: #FF2B2B;line-height: 40rpx;padding-left: 80rpx;"><text>*</text>不通过报销单需备注原因,@人员功能仅在回复时有效,否则将以备注内容显示.</view>
  296. <view v-if="uploadFileList&&uploadFileList.length>0" style="display: flex;align-items: center;flex-wrap: wrap;padding-left: 80rpx">
  297. <view v-for="(cf,cfidx) in uploadFileList" :key="cfidx" class="pointer tMar5" style="display: flex;align-items: center;">
  298. <text @click="openFile(cfidx,'uploadFileList',cf.url)" class="enclosureNow">{{cf.filename}}</text>
  299. <text @click="deleFile(cfidx)" class="iconfont icon-shanchu_icon pointer lMar8 f18"></text>
  300. </view>
  301. </view>
  302. </template>
  303. </view>
  304. <view class="buttons">
  305. <view class="button button4" v-if="reimburse_info&&reimburse_info.status==2" @click="printDOM">导出</view>
  306. <view class="button button4" v-if="(p_id&&source == 'audit') || (orderStatus==1&&selfFlag)" @click="replyClick">回 复</view>
  307. <template v-if="!p_id&&source!='audit'">
  308. <view class="button button4" @click="addSubmit(0)" v-if="!failFlag&&editFlag">保 存</view>
  309. <view class="button button2" @click="addSubmit(1)" v-if="editFlag">提 审</view>
  310. <!-- <view class="button button3" v-if="reimburse_info&&reimburse_info.status==3&&reimburse_info.is_resubmited != 1" @click="delReimbSubmit">作废</view>-->
  311. <view class="button button3" v-if="failFlag&&editFlag" @click="delReimbSubmit">作废</view>
  312. </template>
  313. <template v-else-if="reimburse_info&&reimburse_info.status==1&&reimburse_info.enable_examine">
  314. <view class="button button2" @click="examineOperate(1)">通过</view>
  315. <view class="button button3" @click="examineOperate(2)">不通过</view>
  316. </template>
  317. </view>
  318. <wm-watermark :text="real_name"></wm-watermark>
  319. </view>
  320. </template>
  321. <script>
  322. export default {
  323. data () {
  324. return {
  325. real_name: '',
  326. apply_id: '',
  327. reimburse_info: {},
  328. examine_info: {},
  329. data_list: [],
  330. amount: 0,
  331. remarks_audit: '',
  332. remarks: '',
  333. source: '',
  334. p_id: '',
  335. editFlag: false,
  336. failFlag: false,
  337. table_loading: true,
  338. file_urls: [],
  339. allSelection: false,
  340. multipleSelection: [],
  341. multipleIdArr: [],
  342. checkList: [],
  343. commentList:[],//评论列表
  344. commentStaffList:[],//评论@人员列表
  345. uploadFileList:[],//上传文件的列表,备注上的添加附件
  346. orderStatus:'',//审核状态是什么,主要用来看是否是待审核
  347. showStaffList:false,
  348. selfFlag:true
  349. // staffChecked:[],
  350. }
  351. },
  352. async onLoad (option) {
  353. await this.$onLaunched;
  354. this.real_name = uni.getStorageSync('userInfo').info.real_name
  355. if (option && option.source) {
  356. this.source = option.source
  357. }
  358. if(option && option.status){
  359. this.orderStatus = option.status
  360. }
  361. if (option && option.p_id) {
  362. this.p_id = option.p_id
  363. }
  364. if(option.page == 'reimbursementPage'){
  365. if (this.apply_id) {
  366. this.reimburseDetailList()
  367. this.commentList_init()
  368. this.eitStaff()
  369. } else {
  370. this.getReimburseApplyList()
  371. }
  372. }else{
  373. if (option && option.apply_id) {
  374. this.apply_id = option.apply_id
  375. this.reimburseDetailList()
  376. this.commentList_init()
  377. this.eitStaff()
  378. } else {
  379. this.editFlag = true
  380. this.getReimburseApplyList()
  381. }
  382. }
  383. },
  384. methods: {
  385. deleFile(index){ //删除多余上传的文件,不需要走后台接口
  386. this.uploadFileList.splice(index,1)
  387. },
  388. uploadFileEventComment () {
  389. let _this = this;
  390. wx.chooseImage({
  391. success (res) {
  392. const tempFilePaths = res.tempFilePaths
  393. uni.showLoading({
  394. title: '加载中'
  395. });
  396. wx.uploadFile({
  397. url: _this.$rootDocment + _this.$api.manage_fileUpload,
  398. filePath: tempFilePaths[0],
  399. name: 'file',
  400. header: {
  401. 'sessionKey': uni.getStorageSync('session_key') ? uni.getStorageSync(
  402. 'session_key') : false
  403. },
  404. formData: {
  405. 'admin_id': uni.getStorageSync('admin_id'),
  406. 'ttl': uni.getStorageSync('ttl'),
  407. 'sign': uni.getStorageSync('sign')
  408. },
  409. success (res) {
  410. uni.hideLoading()
  411. const data = res.data
  412. _this.uploadFileList.push(JSON.parse(data).rst)
  413. },
  414. fail (err) {
  415. uni.hideLoading()
  416. }
  417. })
  418. }
  419. })
  420. },
  421. remarks_auditBlur (e) {
  422. this.remarks_audit = e.detail.value;
  423. this.showStaffList = false
  424. if(e.detail.value.charAt(e.detail.value.length-1) == '@'){
  425. this.showStaffList = true
  426. }
  427. },
  428. chooseStaff(item){
  429. if(this.remarks_audit.charAt(this.remarks_audit.length-1) == '@'){
  430. this.remarks_audit = this.remarks_audit.substr(0,this.remarks_audit.length-1)
  431. }
  432. this.remarks_audit += '@'+item.staff_name+' '
  433. this.showStaffList = false
  434. //先不要删
  435. // let idx = this.staffChecked.indexOf(item.staff_name)
  436. // if(idx>-1){
  437. // this.staffChecked.splice(idx,1)
  438. // this.remarks_audit = this.remarks_audit.replace('@'+item.staff_name+' ','')
  439. // item.checked=false
  440. // }else{
  441. // this.staffChecked.push(item.staff_name)
  442. // if(this.remarks_audit.charAt(this.remarks_audit.length-1) == '@'){
  443. // this.remarks_audit = this.remarks_audit.substr(0,this.remarks_audit.length-1)
  444. // }
  445. // this.remarks_audit += '@'+item.staff_name+' '
  446. // item.checked=true
  447. // }
  448. },
  449. eitStaff(){ // 获取@人员列表
  450. if(this.apply_id == ''){
  451. uni.showToast({
  452. title: '无序列号',
  453. icon: 'none'
  454. });
  455. return false
  456. }
  457. this.staffChecked = []
  458. this.$req(this.$api.auditcomment_staffList, 'get', {
  459. submit_id: this.apply_id
  460. }, (res) => {
  461. if (res && res.errno == 0) {
  462. this.commentStaffList = res.rst
  463. // this.commentStaffList.forEach(i=>{
  464. // i.checked = false
  465. // })
  466. } else if (res.errno != 4002) {
  467. uni.showToast({
  468. title: res.err,
  469. icon: 'none'
  470. });
  471. }
  472. }), (err) => {
  473. uni.showToast({
  474. title: err,
  475. icon: 'none'
  476. });
  477. }
  478. },
  479. commentList_init(){ //回复列表
  480. uni.showLoading({
  481. title: '加载中'
  482. });
  483. this.$req(this.$api.auditcommentList, 'get', {
  484. submit_id: this.apply_id,
  485. page: 1,
  486. page_size: 500
  487. }, (res) => {
  488. if (res && res.errno == 0) {
  489. this.commentList = res.rst.data
  490. } else if (res.errno != 4002) {
  491. uni.showToast({
  492. title: res.err,
  493. icon: 'none'
  494. });
  495. }
  496. uni.hideLoading()
  497. }), (err) => {
  498. uni.showToast({
  499. title: err,
  500. icon: 'none'
  501. });
  502. uni.hideLoading()
  503. }
  504. },
  505. replyClick(){ //点击回复
  506. if(this.remarks_audit == ''){
  507. uni.showToast({
  508. title: '回复内容必填',
  509. icon: 'none'
  510. });
  511. return false
  512. }
  513. uni.showLoading({
  514. title: '加载中'
  515. });
  516. let filesNow = []
  517. this.uploadFileList.forEach(item=>{
  518. filesNow.push(item.url)
  519. })//格式化文件
  520. this.$req(this.$api.auditcomment_add, 'post', {
  521. submit_id: this.apply_id,
  522. comment: this.remarks_audit,
  523. file_url: filesNow
  524. }, (res) => {
  525. if (res && res.errno == 0) {
  526. this.commentList_init()
  527. this.remarks_audit = ' '
  528. this.uploadFileList = []
  529. } else if (res.errno != 4002) {
  530. uni.showToast({
  531. title: res.err,
  532. icon: 'none'
  533. });
  534. }
  535. uni.hideLoading()
  536. }), (err) => {
  537. uni.showToast({
  538. title: err,
  539. icon: 'none'
  540. });
  541. uni.hideLoading()
  542. }
  543. },
  544. editClick (item, type, isEdit) {
  545. //type 1其他报销 0直播报销
  546. if (type == 1) {
  547. uni.navigateTo({
  548. url: '../addExpenseFormElse/addExpenseForm?item=' + encodeURIComponent(JSON.stringify(item)) + '&isEdit=' + isEdit +'&page=submitApply'
  549. })
  550. } else {
  551. // isEdit是否可编辑,0新增,1可编辑,2仅查看
  552. uni.navigateTo({
  553. url: '../addExpenseForm/addExpenseForm?item=' + encodeURIComponent(JSON.stringify(item)) + '&isEdit=' + isEdit+'&page=submitApply'
  554. })
  555. }
  556. },
  557. checkCheckbox (e) {//核对
  558. let id = e.currentTarget.dataset.id;
  559. if (this.checkList.indexOf(id) != -1) {
  560. this.checkList = this.checkList.filter((v) => {
  561. return v != id
  562. })
  563. } else {
  564. this.checkList.push(id)
  565. }
  566. },
  567. getReimburseApplyList () {
  568. uni.showLoading({
  569. title: '加载中'
  570. });
  571. this.$req(this.$api.reimburseApplyList, 'get', {
  572. }, (res) => {
  573. uni.hideLoading()
  574. this.table_loading = false;
  575. if (res && res.errno == 0) {
  576. this.reimburse_info = res.rst.reimburse_info;
  577. this.examine_info = res.rst.examine_info;
  578. var arr = res.rst.data_list
  579. this.data_list = [];
  580. arr.forEach((item, index) => {
  581. item.list.forEach((item_list) => {
  582. item_list.ischeck = false
  583. })
  584. if (item.type == 2) {
  585. this.data_list = this.data_list.concat(item.list)
  586. } else {
  587. this.data_list.push(item)
  588. }
  589. });
  590. this.data_list.forEach((item, index) => {
  591. item.self_id = index
  592. })
  593. } else if (res.errno != 4002) {
  594. uni.showToast({
  595. title: res.err,
  596. icon: 'none'
  597. });
  598. }
  599. }), (err) => {
  600. this.table_loading = false
  601. uni.hideLoading()
  602. }
  603. },
  604. handleSelectionChange (type) { //选择
  605. if (type == 'all') {
  606. this.allSelection = !this.allSelection
  607. if (this.allSelection) {
  608. this.multipleSelection = this.data_list
  609. } else {
  610. this.multipleSelection = []
  611. }
  612. } else {
  613. let arr = this.multipleSelection.filter((v) => {
  614. return v.self_id == this.data_list[type].self_id
  615. })
  616. if (arr.length == 0) {
  617. this.multipleSelection.push(this.data_list[type])
  618. } else {
  619. this.multipleSelection = this.multipleSelection.filter((v) => {
  620. return v.self_id != this.data_list[type].self_id
  621. })
  622. }
  623. }
  624. this.multipleIdArr = this.multipleSelection.map((v) => {
  625. return v.self_id
  626. })
  627. this.amount = 0;
  628. if (this.multipleSelection && this.multipleSelection.length != 0) {
  629. this.multipleSelection.forEach((item) => {
  630. if (item.type == 2) {
  631. this.amount = parseFloat((this.amount + Number(item.amount) + Number(item.toll_fee))
  632. .toFixed(10))
  633. } else {
  634. item.list.forEach((item1) => {
  635. this.amount = parseFloat((this.amount + Number(item1.amount) + Number(item1
  636. .toll_fee)).toFixed(10))
  637. })
  638. }
  639. })
  640. }
  641. },
  642. removeFile (index) { //删除文件
  643. uni.showModal({
  644. title: '提示',
  645. content: '确定要删除该文件?',
  646. confirmText: '确定',
  647. success: (res) => {
  648. if (res.confirm) {
  649. this.file_urls.splice(index, 1)
  650. } else if (res.cancel) { }
  651. }
  652. })
  653. },
  654. uploadFileEvent () {
  655. let _this = this;
  656. wx.chooseImage({
  657. success (res) {
  658. const tempFilePaths = res.tempFilePaths
  659. uni.showLoading({
  660. title: '加载中'
  661. });
  662. wx.uploadFile({
  663. url: _this.$rootDocment + _this.$api.manage_fileUpload,
  664. filePath: tempFilePaths[0],
  665. name: 'file',
  666. header: {
  667. 'sessionKey': uni.getStorageSync('session_key') ? uni.getStorageSync(
  668. 'session_key') : false
  669. },
  670. formData: {
  671. 'admin_id': uni.getStorageSync('admin_id'),
  672. 'ttl': uni.getStorageSync('ttl'),
  673. 'sign': uni.getStorageSync('sign')
  674. },
  675. success (res) {
  676. uni.hideLoading()
  677. const data = res.data
  678. _this.file_urls.push(JSON.parse(data).rst.url)
  679. },
  680. fail (err) {
  681. uni.hideLoading()
  682. console.log(err, 'err')
  683. }
  684. })
  685. }
  686. })
  687. },
  688. examineOperate (status) { //审核报销单
  689. if (status == 2 && this.remarks_audit == '') {
  690. uni.showToast({
  691. title: '不通过时,备注为必填项',
  692. icon: 'none'
  693. });
  694. return false
  695. } else {
  696. uni.showLoading({
  697. title: '加载中'
  698. });
  699. let filesNow = []
  700. this.uploadFileList.forEach(item=>{
  701. filesNow.push(item.url)
  702. })//格式化文件
  703. this.$req(this.$api.audit_operate, 'post', {
  704. process_id: this.p_id,
  705. status: status,
  706. remarks: this.remarks_audit,
  707. file_url: filesNow
  708. }, (res) => {
  709. uni.hideLoading()
  710. if (res && res.errno == 0) {
  711. this.goBack(status == 1 ? 2 : 3)
  712. } else if (res.errno != 4002) {
  713. uni.showToast({
  714. title: res.err,
  715. icon: 'none'
  716. });
  717. }
  718. }), (err) => {
  719. uni.hideLoading()
  720. }
  721. }
  722. },
  723. delReimbSubmit () { //作废报销单
  724. uni.showModal({
  725. title: '提示',
  726. content: '确定要作废此报销单?',
  727. confirmText: '确定',
  728. success: (res) => {
  729. if (res.confirm) {
  730. uni.showLoading({
  731. title: '加载中'
  732. });
  733. this.$req(this.$api.delReimbSubmit, 'post', {
  734. id: this.apply_id
  735. }, (res) => {
  736. uni.hideLoading()
  737. if (res && res.errno == 0) {
  738. this.goBack(0, 'resubmited')
  739. } else if (res.errno != 4002) {
  740. uni.showToast({
  741. title: res.err,
  742. icon: 'none'
  743. });
  744. }
  745. }), (err) => {
  746. uni.hideLoading()
  747. }
  748. } else if (res.cancel) { }
  749. }
  750. })
  751. },
  752. addSubmit (status) { //提审或保存
  753. if (!this.multipleSelection || this.multipleSelection.length == 0) {
  754. uni.showToast({
  755. title: '请选择您要报销的明细',
  756. icon: 'none'
  757. });
  758. return
  759. }
  760. var rei_ids = []; //直播报销id数组
  761. var detail_ids = []; //其他报销明细id数组
  762. this.multipleSelection.forEach((item) => {
  763. if (item.type == 2) { //普通加班
  764. detail_ids.push(item.id)
  765. } else if (item.list && item.list.length > 0) {
  766. rei_ids.push(item.list[0].rei_id)
  767. }
  768. })
  769. if (!this.file_urls || this.file_urls.length == 0) {
  770. uni.showToast({
  771. title: '请上传附件',
  772. icon: 'none'
  773. });
  774. return
  775. }
  776. uni.showLoading({
  777. title: '加载中'
  778. });
  779. var params = {
  780. rei_ids: rei_ids,
  781. detail_ids: detail_ids,
  782. note: '加班打车', //报销摘要,暂时写死,怕以后回加别的
  783. remark: this.remarks,
  784. amount: this.amount,
  785. file_urls: this.file_urls,
  786. submit: status,
  787. }
  788. var axios_api = this.$api.addReimbSubmit
  789. if (this.apply_id) {
  790. axios_api = this.$api.editReimbSubmit
  791. params.id = this.apply_id
  792. }
  793. this.$req(axios_api, 'post', params, (res) => {
  794. uni.hideLoading()
  795. if (res && res.errno == 0) {
  796. if(status == 1 && this.reimburse_info.status == 3){
  797. this.goBack(-9);//驳回重新提审,新增订单
  798. }else{
  799. if (this.apply_id) {//编辑
  800. this.goBack(status)
  801. } else {//新增
  802. this.goBack(-9)
  803. }
  804. }
  805. } else if (res.errno != 4002) {
  806. uni.showToast({
  807. title: res.err,
  808. icon: 'none'
  809. });
  810. }
  811. }), (err) => {
  812. uni.hideLoading()
  813. }
  814. },
  815. printDOM () { //导出
  816. uni.showModal({
  817. title: '提示',
  818. content: '导出报销详情,请使用手机自带的长截图!',
  819. showCancel: false,
  820. confirmText: '我知道了',
  821. success: function (res) {
  822. if (res.confirm) { } else if (res.cancel) { }
  823. }
  824. })
  825. },
  826. textareaBlur (e) {
  827. this.remarks = e.detail.value;
  828. },
  829. reimburseDetailList () { //报销单详情
  830. uni.showLoading({
  831. title: '加载中'
  832. });
  833. this.$req(this.$api.reimburseDetailList, 'get', {
  834. id: this.apply_id
  835. }, (res) => {
  836. uni.hideLoading()
  837. this.table_loading = false;
  838. if (res && res.errno == 0) {
  839. this.reimburse_info = res.rst.reimburse_info;
  840. this.examine_info = res.rst.examine_info;
  841. if(uni.getStorageSync('userInfo').info.id == this.reimburse_info.staff_id){
  842. this.selfFlag=true
  843. }else{
  844. this.selfFlag=false
  845. }
  846. var arr = res.rst.data_list
  847. this.data_list = [];
  848. arr.forEach((item, index) => {
  849. item.list.forEach((item_list) => {
  850. item_list.ischeck = false
  851. })
  852. if (item.type == 2) {
  853. this.data_list = this.data_list.concat(item.list)
  854. } else {
  855. this.data_list.push(item)
  856. }
  857. });
  858. this.amount = this.reimburse_info.amount
  859. this.remarks = this.reimburse_info.remark
  860. // 附件
  861. if (this.reimburse_info.file_urls && this.reimburse_info.file_urls.length > 0) {
  862. this.file_urls = this.reimburse_info.file_urls
  863. }
  864. //是否可编辑 expenseOverview:报销概览 audit:审核列表
  865. if (this.source != 'expenseOverview' && !this.p_id && this.source != 'audit' && (!this
  866. .apply_id || this.apply_id == '' || (this.reimburse_info && (this.reimburse_info
  867. .status == 0||this.reimburse_info
  868. .status == 3)))) { //可编辑
  869. if(this.selfFlag){//是否是本人
  870. this.editFlag = true
  871. }else{
  872. this.editFlag = false
  873. }
  874. } else {
  875. this.editFlag = false
  876. }
  877. if (this.source != 'expenseOverview' && !this.p_id && this.source != 'audit' && (this
  878. .apply_id && this.reimburse_info && this.reimburse_info.status == 3 && this
  879. .reimburse_info.is_resubmited != 1)) { //是否为驳回状态,且不是审核人员
  880. this.failFlag = true
  881. } else {
  882. this.failFlag = false
  883. }
  884. this.allSelection = false;
  885. this.handleSelectionChange('all')
  886. //明细显示回显
  887. var echo_arr = []
  888. this.data_list.forEach((item, index) => {
  889. item.self_id = index
  890. if (item.is_selected == 1) {
  891. echo_arr.push(item)
  892. }
  893. })
  894. this.multipleSelection = echo_arr;
  895. this.multipleIdArr = this.multipleSelection.map((v) => {
  896. return v.self_id
  897. })
  898. } else if (res.errno != 4002) {
  899. uni.showToast({
  900. title: res.err,
  901. icon: 'none'
  902. });
  903. }
  904. }), (err) => {
  905. this.table_loading = false
  906. uni.hideLoading()
  907. }
  908. },
  909. openFile (index,type1,fileurl) {
  910. let url = '';
  911. if (type1 == 'file_urls') {
  912. url = this.file_urls[index]
  913. } else if(type1 == 'uploadFileList'){
  914. if(fileurl){
  915. url = fileurl
  916. }else{
  917. uni.showToast({
  918. title: '链接找不到',
  919. icon: 'none'
  920. });
  921. }
  922. }else {
  923. url = this.reimburse_info.file_submits[index]
  924. }
  925. url = url.replace(/live-data-center.oss-cn-beijing.aliyuncs.com/, (this.$rootDocment.split('/'))[(this.$rootDocment.split('/')).length - 1] + '/oss')
  926. url = url.replace('http://','https://')
  927. if (url[0] == '/') {
  928. url = 'https:' + url
  929. }
  930. let name = url.split('/')[url.split('/').length - 1]
  931. let type = name.split(".")[name.split(".").length - 1];
  932. let image = ["JPG", "JPEG", "PNG"];
  933. let file = ["DOC", "XLS", "PPT", "PDF", "DOCX", "XLSX", "PPTX"];
  934. let urls = [];
  935. urls.push(url);
  936. // 如果文件是图片类型
  937. if (image.indexOf(type.toLocaleUpperCase()) > -1) {
  938. uni.previewImage({
  939. urls: urls,
  940. success: () => { },
  941. fail: (e) => {
  942. console.log(e);
  943. showModalWithText('预览文件失败')
  944. },
  945. });
  946. }
  947. // 如果文件是DOC/XLS/PPT/PDF/DOCX/XLSX/PPTX类型
  948. else if (file.indexOf(type.toLocaleUpperCase()) > -1) {
  949. uni.showLoading({
  950. title: '加载中'
  951. });
  952. // 小程序配置的合法域名为https协议
  953. if (url.indexOf("http") > -1 && url.indexOf("https") === -1) {
  954. url = url.replace("http", "https");
  955. }
  956. uni.downloadFile({
  957. url: url,
  958. success: function (res) {
  959. uni.hideLoading()
  960. var filePath = res.tempFilePath;
  961. uni.openDocument({
  962. filePath: filePath,
  963. fileType: type.toLocaleLowerCase(),
  964. success: function (res) {
  965. console.log('打开文档成功');
  966. // 提示:预览文件失败
  967. },
  968. fail: (e) => {
  969. uni.hideLoading()
  970. console.log(e);
  971. // 提示:预览文件失败
  972. uni.showToast({
  973. title: '预览文件失败',
  974. icon: 'none'
  975. });
  976. },
  977. });
  978. },
  979. fail: function (err) {
  980. // 提示:预览文件失败
  981. uni.showToast({
  982. title: '预览文件失败',
  983. icon: 'none'
  984. });
  985. },
  986. });
  987. } else {
  988. // 提示:此类型文件暂不支持预览
  989. uni.showToast({
  990. title: '此类型文件暂不支持预览',
  991. icon: 'none'
  992. });
  993. }
  994. },
  995. goBack (status, is_resubmited) {
  996. let pages = getCurrentPages(); // 当前页面
  997. let beforePage = pages[pages.length - 2]; // 上一页
  998. uni.navigateBack({
  999. success: function () {
  1000. beforePage.onLoad({ page: 'previousPage', previousPageStatus: status, is_resubmited: is_resubmited }); // 执行上一页的onLoad方法
  1001. }
  1002. });
  1003. }
  1004. }
  1005. }
  1006. </script>
  1007. <style scoped lang="scss">
  1008. @import "@/common/css/table.scss";
  1009. .textarea {
  1010. height: 90rpx;
  1011. background: #373e4e;
  1012. flex: 1;
  1013. margin-right: 20rpx;
  1014. padding: 10rpx;
  1015. color: #ffffff;
  1016. font-size: 26rpx;
  1017. line-height: 34rpx;
  1018. min-height: 150rpx;
  1019. }
  1020. .timeLineItem {
  1021. display: flex;
  1022. align-items: flex-start;
  1023. margin-top: 26rpx;
  1024. .iconfont {
  1025. font-size: 28rpx;
  1026. margin-top: 6rpx;
  1027. margin-right: 16rpx;
  1028. color: #828282;
  1029. }
  1030. .timeLineContent {
  1031. .approver {
  1032. font-size: 24rpx;
  1033. line-height: 40rpx;
  1034. color: #ffffff;
  1035. display: flex;
  1036. .label {
  1037. font-size: 24rpx;
  1038. color: #cec8c8;
  1039. margin-right: 10rpx;
  1040. }
  1041. }
  1042. .contentTime {
  1043. font-size: 28rpx;
  1044. color: #ffffff;
  1045. line-height: 40rpx;
  1046. text {
  1047. font-size: 28rpx;
  1048. }
  1049. }
  1050. }
  1051. }
  1052. .topDataItem {
  1053. display: flex;
  1054. align-items: flex-start;
  1055. margin-top: 36rpx;
  1056. .label {
  1057. color: #b8b8b8;
  1058. font-size: 26rpx;
  1059. line-height: 36rpx;
  1060. margin-right: 20rpx;
  1061. }
  1062. .labelCon {
  1063. color: #ffffff;
  1064. font-size: 26rpx;
  1065. line-height: 36rpx;
  1066. flex: 1;
  1067. }
  1068. .addFileCss{
  1069. position: absolute;
  1070. right: 0;
  1071. bottom: 0;
  1072. color: #0c4fe7;
  1073. font-size: 26rpx;
  1074. z-index: 3;
  1075. padding: 20rpx 30rpx;
  1076. }
  1077. .staffCss{
  1078. position: absolute;
  1079. right: 20rpx;
  1080. top: -100rpx;
  1081. font-size: 28rpx;
  1082. z-index: 3;
  1083. width: 300rpx;
  1084. height: 150rpx;
  1085. background-color: #373e4e;
  1086. overflow-y: auto;
  1087. padding: 10rpx;
  1088. border-radius: 8rpx;
  1089. view {
  1090. line-height: 48rpx;
  1091. }
  1092. }
  1093. }
  1094. .h3_title {
  1095. color: #b8b8b8;
  1096. font-size: 26rpx;
  1097. line-height: 36rpx;
  1098. margin-top: 36rpx;
  1099. }
  1100. .statusReimbursement {
  1101. font-size: 20rpx;
  1102. color: #fff;
  1103. background: #ecbe64;
  1104. line-height: 40rpx;
  1105. display: inline-block;
  1106. padding: 0 8rpx;
  1107. font-weight: bold;
  1108. border-radius: 8rpx;
  1109. margin-left: 8rpx;
  1110. }
  1111. .table {
  1112. margin: 20rpx 32rpx 0;
  1113. width: 100%;
  1114. overflow-x: auto;
  1115. .liveApplyItem {
  1116. height: 140rpx;
  1117. display: flex;
  1118. align-items: center;
  1119. justify-content: center;
  1120. border-bottom: 2rpx solid #3d4453;
  1121. }
  1122. }
  1123. .loading_hint {
  1124. background: #373e4e;
  1125. margin-left: 32rpx;
  1126. }
  1127. .self-table {
  1128. width: 2000rpx;
  1129. .border-none {
  1130. &::after {
  1131. width: 0 !important;
  1132. }
  1133. }
  1134. .self-table-tr {
  1135. font-size: 24rpx;
  1136. line-height: 30rpx;
  1137. }
  1138. .table-th {
  1139. line-height: 60rpx;
  1140. }
  1141. }
  1142. .applyTop {
  1143. background: linear-gradient(160deg, #87b5ff 0%, #4f7eff 100%);
  1144. border-radius: 6rpx;
  1145. padding: 18rpx 24rpx;
  1146. margin: 16rpx 32rpx;
  1147. .item {
  1148. color: #ffffff;
  1149. font-size: 26rpx;
  1150. line-height: 36rpx;
  1151. margin: 7rpx 0;
  1152. }
  1153. }
  1154. .buttons {
  1155. display: flex;
  1156. align-items: center;
  1157. justify-content: center;
  1158. padding: 90rpx 0;
  1159. margin-top: 15rpx;
  1160. .button {
  1161. width: 156rpx;
  1162. height: 70rpx;
  1163. border-radius: 8rpx;
  1164. border: 2rpx solid #979797;
  1165. color: #747474;
  1166. font-size: 28rpx;
  1167. line-height: 66rpx;
  1168. text-align: center;
  1169. margin: 0 22rpx;
  1170. }
  1171. .button2 {
  1172. background: #5b80f4;
  1173. border-color: #5b80f4;
  1174. color: #ffffff;
  1175. }
  1176. .button3 {
  1177. background: #e7605a;
  1178. border-color: #e7605a;
  1179. color: #ffffff;
  1180. }
  1181. .button4 {
  1182. background: #f39f2f;
  1183. border-color: #f39f2f;
  1184. color: #ffffff;
  1185. }
  1186. }
  1187. .enclosureNow {
  1188. color: #ffffff;
  1189. margin-right: 10rpx;
  1190. cursor: pointer;
  1191. background: #373e4e;
  1192. border: 1rpx solid #5d5d5d;
  1193. font-size: 18rpx;
  1194. line-height: 30rpx;
  1195. border-radius: 6rpx;
  1196. display: flex;
  1197. align-items: center;
  1198. margin-bottom: 5rpx;
  1199. padding: 0 9rpx;
  1200. }
  1201. .enclosure {
  1202. color: #ffffff;
  1203. margin-right: 20px;
  1204. cursor: pointer;
  1205. background: #373e4e;
  1206. border: 2rpx solid #5d5d5d;
  1207. font-size: 20rpx;
  1208. line-height: 44rpx;
  1209. border-radius: 6rpx;
  1210. display: flex;
  1211. align-items: center;
  1212. margin-bottom: 10rpx;
  1213. padding: 0 9rpx;
  1214. .iconfont {
  1215. color: #4f7eff;
  1216. font-size: 20rpx;
  1217. margin-right: 10rpx;
  1218. }
  1219. }
  1220. .imgbox {
  1221. width: 100rpx;
  1222. height: 100rpx;
  1223. border-radius: 8rpx;
  1224. overflow: hidden;
  1225. position: relative;
  1226. margin-right: 20rpx;
  1227. image {
  1228. width: 100%;
  1229. height: 100%;
  1230. }
  1231. }
  1232. .uploadFile {
  1233. width: 136rpx;
  1234. height: 136rpx;
  1235. background: rgba(91, 128, 244, 0.26);
  1236. border: 2rpx dotted #5b80f4;
  1237. border-radius: 6rpx;
  1238. display: flex;
  1239. align-items: center;
  1240. justify-content: center;
  1241. color: #ffffff;
  1242. font-size: 60rpx;
  1243. }
  1244. .imgbox2 {
  1245. width: 136rpx;
  1246. height: 136rpx;
  1247. overflow: inherit;
  1248. image {
  1249. width: 100%;
  1250. height: 100%;
  1251. border-radius: 8rpx;
  1252. }
  1253. .iconfont {
  1254. position: absolute;
  1255. color: #ffffff;
  1256. top: -18rpx;
  1257. right: 0;
  1258. font-size: 36rpx;
  1259. }
  1260. }
  1261. .self-checkbox {
  1262. width: 32rpx;
  1263. height: 32rpx;
  1264. border: 2rpx solid #979797;
  1265. border-radius: 4rpx;
  1266. margin: auto;
  1267. .iconfont {
  1268. font-size: 14rpx;
  1269. color: transparent;
  1270. }
  1271. &.self-checkbox-active {
  1272. border-color: #5b80f4;
  1273. background: #5b80f4;
  1274. .iconfont {
  1275. color: #ffffff;
  1276. }
  1277. }
  1278. }
  1279. </style>