orderDetail.vue 51 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772
  1. <template>
  2. <view class="all-container">
  3. <view class="bg"></view>
  4. <zj-page-layout
  5. :isScroll="true"
  6. :hasFooter="true"
  7. :refresherTriggered="refresherTriggered"
  8. @refresherrefresh="refresherrefresh"
  9. >
  10. <!-- 状态 -->
  11. <view class="status-container">
  12. <view class="status" @tap="openFeedback"
  13. >{{ detail ? detail.orderStatusText : '' }}<text class="iconfont icon-jinru"></text
  14. ></view>
  15. <view class="time" v-if="detail && detail.appointmentTime"
  16. >已预约 {{ detail.appointmentTime.slice(0, 10) }}</view
  17. >
  18. </view>
  19. <!-- tab栏 -->
  20. <view class="tab-container">
  21. <u-tabs :scrollable="true" :list="tabList" :current="curTab - 1" @click="changeTab" itemStyle="height: 36px;">
  22. </u-tabs>
  23. </view>
  24. <view class="content-container" v-if="detail">
  25. <!-- 基本信息 -->
  26. <block v-if="~[1].indexOf(curTab)">
  27. <view class="user-container card">
  28. <view class="top">
  29. <view class="type">
  30. <view class="left">{{ detail.orderSmallTypeText ? detail.orderSmallTypeText.slice(0, 2) : '' }}</view>
  31. <view v-if="detail && orderStatus_v !== 'DQD'" class="right" @tap="copyData()">复制</view>
  32. </view>
  33. <view class="user">{{ detail.userName }} {{ detail.userMobile }}</view>
  34. <view class="address">
  35. <view class="text"
  36. >{{ detail.province }}{{ detail.city }}{{ detail.area }}{{ detail.street
  37. }}{{ detail.address || detail.gpsAddress }}
  38. </view>
  39. <view
  40. v-if="detail && orderStatus_v !== 'DQD'"
  41. class="ctrl"
  42. @tap.stop="
  43. $openLocation({
  44. lat: detail.lat,
  45. lng: detail.lng,
  46. address: detail.address || detail.gpsAddress
  47. })
  48. "
  49. ><text class="iconfont icon-daohang"></text>导航</view
  50. >
  51. </view>
  52. </view>
  53. <view class="bottom" v-if="detail && orderStatus_v !== 'DQD'">
  54. <view class="it" @tap="$callPhone(detail.userMobile)"
  55. ><text class="iconfont icon-call"></text>联系电话1</view
  56. >
  57. <view class="it" @tap="$callPhone(detail.userMobile2 || detail.userMobile)"
  58. ><text class="iconfont icon-call"></text>联系电话2</view
  59. >
  60. </view>
  61. </view>
  62. <!-- 商品信息 -->
  63. <view class="goods-container card mt30">
  64. <view class="common-title">商品信息</view>
  65. <view class="item" v-for="(item, index) in detail.pgOrderProducts" :key="index">
  66. <view class="main">
  67. <image :src="item.imgUrl ? item.imgUrl : require('@/static/images/logo.png')" mode="aspectFill"></image>
  68. <view class="info">
  69. <view class="name">
  70. <view class="left" v-if="detail.isZl">{{ item.mainName || '' }}</view>
  71. <view class="left" v-else>{{ item.smallName || '' }} {{ item.productName || '' }}</view>
  72. <view class="right">x{{ item.num }}</view>
  73. </view>
  74. <view class="tags" v-if="!detail.isZl">
  75. <view class="it">{{ item.brandName }}</view>
  76. <!-- <view class="it">家用空调</view> -->
  77. </view>
  78. </view>
  79. </view>
  80. <!-- <view class="images" v-if="isOpenGoods">
  81. <view class="it" v-if="item.insideImg">
  82. <image :src="imageUrl + item.insideImg" mode="aspectFill"
  83. @tap="prevImg(item.insideImg)"></image>
  84. <view class="text">内机</view>
  85. </view>
  86. <view class="it" v-if="item.outImg">
  87. <image :src="imageUrl + item.outImg" mode="aspectFill" @tap="prevImg(item.outImg)">
  88. </image>
  89. <view class="text">外机</view>
  90. </view>
  91. <block v-if="item.partImgs">
  92. <view class="it" v-for="(it, idx) in item.partImgs.split(',')" :key="idx">
  93. <image :src="imageUrl + it" mode="aspectFill" @tap="() => prevImg(it)"></image>
  94. <view class="text">配件</view>
  95. </view>
  96. </block>
  97. </view> -->
  98. </view>
  99. <!-- <view class="ctrl" @tap="isOpenGoods = !isOpenGoods">
  100. <text>{{ isOpenGoods ? '收起' : '查看更多' }}</text>
  101. <text class="iconfont icon-left" :class="isOpenGoods ? 'is' : ''"></text>
  102. </view> -->
  103. </view>
  104. <!-- 订单信息 -->
  105. <view class="info-container card mt30" v-if="detail.saleOrderId && !detail.pgIncreId">
  106. <view class="common-title">订单信息</view>
  107. <view>
  108. <view class="row">
  109. <view class="label">订单编号</view>
  110. <view class="value">{{ detail.saleOrderId }}</view>
  111. <view v-if="detail && orderStatus_v !== 'DQD'" class="ctrl" @tap="$copy(detail.saleOrderId)">复制</view>
  112. </view>
  113. <view class="row">
  114. <view class="label">下单时间</view>
  115. <view class="value">{{ detail.saleCreateTime || '' }}</view>
  116. </view>
  117. <view class="row">
  118. <view class="label">订单金额</view>
  119. <view class="value">¥{{ detail.saleTotalAmount | priceFilter }}</view>
  120. </view>
  121. <view class="row">
  122. <view class="label">订单备注</view>
  123. <view class="value">{{ detail.saleRemark || '' }}</view>
  124. </view>
  125. </view>
  126. </view>
  127. <view class="info-container card mt30" v-if="detail.pgIncreId && increDetail">
  128. <view class="common-title">产品信息</view>
  129. <view class="row">
  130. <view class="label">服务类型</view>
  131. <view class="value">延保</view>
  132. </view>
  133. <view class="row">
  134. <view class="label">产品品牌</view>
  135. <view class="value">{{ increDetail.brandName }}</view>
  136. </view>
  137. <view class="row">
  138. <view class="label">产品大类</view>
  139. <view class="value">{{ increDetail.mainName }}</view>
  140. </view>
  141. <view class="row">
  142. <view class="label">服务内容</view>
  143. <view class="value">{{ increDetail.increContent }}</view>
  144. </view>
  145. </view>
  146. <view class="info-container card mt30" v-if="detail.pgIncreId && increDetail">
  147. <view class="common-title">产品凭证</view>
  148. <view class="row">
  149. <view class="label">内机条码</view>
  150. <view class="value">{{ increDetail.insideCode }}</view>
  151. </view>
  152. <view class="imgs">
  153. <!-- 内机条码 -->
  154. <view class="it">
  155. <block>
  156. <image mode="aspectFill" :src="increDetail.insideCodeImg" @tap="prevImg(increDetail.insideCodeImg)">
  157. </image>
  158. </block>
  159. <view class="name">内机条码</view>
  160. </view>
  161. <!-- 机器铭牌 -->
  162. <view class="it">
  163. <block>
  164. <image mode="aspectFill" :src="increDetail.machineImg" @tap="prevImg(increDetail.machineImg)">
  165. </image>
  166. </block>
  167. <view class="name">机器铭牌<br />(含出厂日期)</view>
  168. </view>
  169. <!-- 购机凭证 -->
  170. <view class="it">
  171. <block>
  172. <image mode="aspectFill" :src="increDetail.buyCertImg" @tap="prevImg(increDetail.buyCertImg)">
  173. </image>
  174. </block>
  175. <view class="name">购机凭证</view>
  176. </view>
  177. </view>
  178. </view>
  179. <!-- 延保订单信息 -->
  180. <view class="info-container card mt30" v-if="detail.pgIncreId && increDetail">
  181. <view class="common-title">订单信息</view>
  182. <view>
  183. <view class="row">
  184. <view class="label">订单编号</view>
  185. <view class="value">{{ increDetail.id }}</view>
  186. <view v-if="detail && orderStatus_v !== 'DQD'" class="ctrl" @tap="$copy(increDetail.id)">复制</view>
  187. </view>
  188. <view class="row">
  189. <view class="label">下单时间</view>
  190. <view class="value">{{ increDetail.createTime || '' }}</view>
  191. </view>
  192. <view class="row">
  193. <view class="label">订单金额</view>
  194. <view class="value">¥{{ increDetail.amount }}</view>
  195. </view>
  196. <view class="row">
  197. <view class="label">订单备注</view>
  198. <view class="value">{{ detail.remark || '' }}</view>
  199. </view>
  200. </view>
  201. </view>
  202. <!-- 服务信息 -->
  203. <view class="info-container card mt30">
  204. <view class="common-title">服务信息</view>
  205. <view>
  206. <view class="row">
  207. <view class="label">工单编号</view>
  208. <view class="value">{{ detail.id }}</view>
  209. <view v-if="detail && orderStatus_v !== 'DQD'" class="ctrl" @tap="$copy(detail.id)">复制</view>
  210. </view>
  211. <view class="row">
  212. <view class="label">下单时间</view>
  213. <view class="value">{{ detail.createTime }}</view>
  214. </view>
  215. <view class="row">
  216. <view class="label">接单时间</view>
  217. <view class="value">{{ detail.workerReceTime || '' }}</view>
  218. </view>
  219. <view class="row">
  220. <view class="label">主工程师</view>
  221. <view class="value">{{ detail.workerName }} {{ detail.workerMobile }}</view>
  222. <view v-if="detail && orderStatus_v !== 'DQD'" class="ctrl" @tap="$callPhone(detail.workerMobile)"
  223. ><text class="iconfont icon-call"></text
  224. ></view>
  225. </view>
  226. <view class="row" v-for="(item, index) in detail.pgOrderWorkers.filter(o => !o.isMaster)" :key="index">
  227. <view class="label">辅工程师</view>
  228. <view class="value">{{ item.workerName }} {{ item.workerMobile }}</view>
  229. <view v-if="detail && orderStatus_v !== 'DQD'" class="ctrl" @tap="$callPhone(item.workerMobile)"
  230. ><text class="iconfont icon-call"></text
  231. ></view>
  232. </view>
  233. <view class="row">
  234. <view class="label">下单渠道</view>
  235. <view class="value">{{ detail.orderChannelText || '' }}</view>
  236. </view>
  237. <view class="row">
  238. <view class="label">订单备注</view>
  239. <view class="value">{{ detail.remark || '' }}</view>
  240. </view>
  241. </view>
  242. </view>
  243. <!-- 建单信息 -->
  244. <view class="info-container card mt30">
  245. <view class="common-title">建单信息</view>
  246. <view>
  247. <view class="row">
  248. <view class="label">建单人名</view>
  249. <view class="value">{{ detail.createBy || '' }}</view>
  250. </view>
  251. <view class="row">
  252. <view class="label">下单网点</view>
  253. <view class="value">{{ detail.websitName || '' }}</view>
  254. </view>
  255. </view>
  256. </view>
  257. </block>
  258. <!-- 服务信息 -->
  259. <block v-if="~[2].indexOf(curTab)">
  260. <!-- 过程反馈 -->
  261. <view class="feedback-container card">
  262. <view class="common-title2">
  263. <view class="title">过程反馈</view>
  264. <view v-if="detail && orderStatus_v !== 'DQD'" class="right" @tap="toFeedbackList"
  265. >查看全部<text class="iconfont icon-jinru"></text>
  266. </view>
  267. </view>
  268. <view class="list" v-if="detail.lastOperator">
  269. <view class="item">
  270. <u-avatar
  271. :text="detail.lastOperatorWebsit ? detail.lastOperatorWebsit.slice(0, 1) : 'A'"
  272. fontSize="18"
  273. randomBgColor
  274. ></u-avatar>
  275. <view class="main">
  276. <view class="name">{{ detail.lastOperatorWebsit || '' }}</view>
  277. <view class="time">{{ detail.lastOperatorTime || '' }}</view>
  278. <view class="content">{{ detail.lastOperator || '' }}</view>
  279. </view>
  280. </view>
  281. </view>
  282. <Loading :type="3" :loadStatus="2" :isLoadAnimation="false" v-else />
  283. </view>
  284. <!-- 预约信息 -->
  285. <view class="info-container card mt30" v-if="detail && detail.appointmentTime">
  286. <view class="common-title">预约信息</view>
  287. <view>
  288. <view class="row">
  289. <view class="label">预约时间</view>
  290. <view class="value">{{ detail.appointmentTime.slice(0, 10) }}</view>
  291. </view>
  292. <view class="row">
  293. <view class="label">预约备注</view>
  294. <view class="value">{{ detail.changeRemark || detail.appointmentRemark }}</view>
  295. </view>
  296. </view>
  297. </view>
  298. <!-- 完工信息 -->
  299. <view class="info-container card mt30" v-if="detail && (orderStatus_v == 'YWG' || orderStatus_v == 'YJS')">
  300. <view class="common-title2">
  301. <view class="title">完工信息</view>
  302. <view v-if="detail && orderStatus_v !== 'DQD'" class="right" @tap="toOverDetail"
  303. >查看更多<text class="iconfont icon-jinru"></text
  304. ></view>
  305. </view>
  306. <view>
  307. <view class="row">
  308. <view class="label">完工时间</view>
  309. <view class="value">{{ detail.overTime || detail.websitOverTime || '' }}</view>
  310. </view>
  311. <view class="row">
  312. <view class="label">完工地点</view>
  313. <view class="value"
  314. >{{ detail.province }}{{ detail.city }}{{ detail.area }}{{ detail.street }}{{ detail.address }}
  315. </view>
  316. </view>
  317. </view>
  318. </view>
  319. </block>
  320. <!-- 电子支付 -->
  321. <block v-if="~[3].indexOf(curTab)">
  322. <block v-if="detail.rpProjectRepairId">
  323. <view class="product-container card" v-for="(item, index) in payList" :key="index">
  324. <view class="row">
  325. <view class="label">支付单号</view>
  326. <view class="value">{{ item.orderId }}</view>
  327. </view>
  328. <view class="row">
  329. <view class="label">支付状态</view>
  330. <view class="value" style="color: red">{{ item.examineStatus | examineStatusFilter }}</view>
  331. </view>
  332. <view class="common-title mt30">产品信息</view>
  333. <view class="product">
  334. <view
  335. class="it"
  336. v-for="(it, idx) in item.rpMaterialOrderItems.filter(
  337. o => o.chargeType == 'ACC' || o.chargeType == 'MCC'
  338. )"
  339. :key="idx"
  340. >
  341. <view class="name"
  342. >{{ it.goodsName }}<text>×{{ it.num }}</text></view
  343. >
  344. <view class="price">¥{{ it.totalAmount }}</view>
  345. </view>
  346. <view class="total">
  347. <view class="text">合计:</view>
  348. <view class="price"
  349. >¥{{
  350. [
  351. 0,
  352. 0,
  353. 0,
  354. ...item.rpMaterialOrderItems
  355. .filter(o => o.chargeType == 'ACC' || o.chargeType == 'MCC')
  356. .map(val => val.totalAmount)
  357. ].reduce((a, b) => (a * 100 + b * 100) / 100, 0)
  358. }}</view
  359. >
  360. </view>
  361. </view>
  362. <view class="common-title mt30">服务费用</view>
  363. <view class="product">
  364. <view
  365. class="it"
  366. v-for="(it, idx) in item.rpMaterialOrderItems.filter(o => o.chargeType == 'SERV')"
  367. :key="idx"
  368. >
  369. <view class="name">{{ it.amountName }}</view>
  370. <view class="price">¥{{ it.normAmount }}</view>
  371. </view>
  372. <view class="total">
  373. <view class="text">合计:</view>
  374. <view class="price"
  375. >¥{{
  376. [
  377. 0,
  378. 0,
  379. 0,
  380. ...item.rpMaterialOrderItems.filter(o => o.chargeType == 'SERV').map(val => val.normAmount)
  381. ].reduce((a, b) => (a * 100 + b * 100) / 100, 0)
  382. }}</view
  383. >
  384. </view>
  385. </view>
  386. <view class="bottom">
  387. <view class="left">订单总金额</view>
  388. <view class="right">
  389. <view class="text">合计:</view>
  390. <view class="price"
  391. >¥{{
  392. [
  393. 0,
  394. 0,
  395. 0,
  396. ...item.rpMaterialOrderItems.filter(o => o.chargeType == 'SERV').map(val => val.normAmount),
  397. ...item.rpMaterialOrderItems
  398. .filter(o => o.chargeType == 'ACC' || o.chargeType == 'MCC')
  399. .map(val => val.totalAmount)
  400. ].reduce((a, b) => (a * 100 + b * 100) / 100, 0)
  401. }}</view
  402. >
  403. </view>
  404. </view>
  405. <view class="row mt30">
  406. <view class="label">操作人员</view>
  407. <view class="value">{{ item.createBy }}</view>
  408. </view>
  409. <view class="row mt20">
  410. <view class="label">订单备注</view>
  411. <view class="value">{{ item.remark }}</view>
  412. </view>
  413. </view>
  414. </block>
  415. <block v-else>
  416. <view class="product-container card" v-for="(item, index) in payList" :key="index">
  417. <view class="common-title mt30">支付费用{{ index + 1 }}</view>
  418. <view class="row">
  419. <view class="label">支付单号</view>
  420. <view class="value">{{ item.orderId }}</view>
  421. </view>
  422. <view class="row">
  423. <view class="label">支付状态</view>
  424. <view
  425. class="value"
  426. :style="{ color: item.payStatus == 'WAIT' ? 'red' : item.payStatus == 'PAID' ? 'blue' : '' }"
  427. >{{ item.payStatus | payStatusFilter }}</view
  428. >
  429. </view>
  430. <view class="common-title mt30">产品信息</view>
  431. <view class="product">
  432. <view
  433. class="it"
  434. v-for="(it, idx) in item.workerOrderItems.filter(o => o.chargeType == 'ACC' || o.chargeType == 'MCC')"
  435. :key="idx"
  436. >
  437. <view class="name"
  438. >{{ it.goodsName }}<text>×{{ it.num }}</text></view
  439. >
  440. <view class="price">¥{{ it.totalAmount }}</view>
  441. </view>
  442. <view class="total">
  443. <view class="text">合计:</view>
  444. <view class="price"
  445. >¥{{
  446. [
  447. 0,
  448. 0,
  449. 0,
  450. ...item.workerOrderItems
  451. .filter(o => o.chargeType == 'ACC' || o.chargeType == 'MCC')
  452. .map(val => val.totalAmount)
  453. ].reduce((a, b) => (a * 100 + b * 100) / 100, 0)
  454. }}</view
  455. >
  456. </view>
  457. </view>
  458. <view class="common-title mt30">服务费用</view>
  459. <view class="product">
  460. <view
  461. class="it"
  462. v-for="(it, idx) in item.workerOrderItems.filter(o => o.chargeType == 'SERV')"
  463. :key="idx"
  464. >
  465. <view class="name">{{ it.amountName }}</view>
  466. <view class="price">¥{{ it.normAmount }}</view>
  467. </view>
  468. <view class="total">
  469. <view class="text">合计:</view>
  470. <view class="price"
  471. >¥{{
  472. [
  473. 0,
  474. 0,
  475. 0,
  476. ...item.workerOrderItems.filter(o => o.chargeType == 'SERV').map(val => val.normAmount)
  477. ].reduce((a, b) => (a * 100 + b * 100) / 100, 0)
  478. }}</view
  479. >
  480. </view>
  481. </view>
  482. <view class="bottom">
  483. <view class="left">订单总金额</view>
  484. <view class="right">
  485. <view class="text">合计:</view>
  486. <view class="price"
  487. >¥{{
  488. [
  489. 0,
  490. 0,
  491. 0,
  492. ...item.workerOrderItems.filter(o => o.chargeType == 'SERV').map(val => val.normAmount),
  493. ...item.workerOrderItems
  494. .filter(o => o.chargeType == 'ACC' || o.chargeType == 'MCC')
  495. .map(val => val.totalAmount)
  496. ].reduce((a, b) => (a * 100 + b * 100) / 100, 0)
  497. }}</view
  498. >
  499. </view>
  500. </view>
  501. <view class="row mt30">
  502. <view class="label">操作人员</view>
  503. <view class="value">{{ item.createBy }}</view>
  504. </view>
  505. <view class="row mt20">
  506. <view class="label">订单备注</view>
  507. <view class="value">{{ item.remark }}</view>
  508. </view>
  509. <view style="height: 20rpx"></view>
  510. <view v-if="item.payStatus == 'WAIT'">
  511. <u-button type="success" text="扫码支付" @click="scanCode(item)">扫码支付</u-button>
  512. </view>
  513. </view>
  514. </block>
  515. <block v-if="payList.length < 1">
  516. <Loading :type="3" :loadStatus="2" showText="暂无电子支付信息" :isLoadAnimation="false" />
  517. </block>
  518. </block>
  519. <!-- 费用结算 -->
  520. <block v-if="~[4].indexOf(curTab)">
  521. <!-- 服务费用 -->
  522. <view class="info-container card mt30" v-for="(item, index) in settleList" :key="index">
  523. <block v-if="item.settleNormType !== 'OTHER'">
  524. <view class="common-title2">
  525. <view class="title">服务费用{{ index + 1 }}</view>
  526. <view class="right">{{ orderStatus_v == 'YJS' ? '已结算' : '结算中' }}</view>
  527. </view>
  528. <view>
  529. <view class="row">
  530. <view class="label">产品大类</view>
  531. <view class="value">{{ item.mainName || '' }}</view>
  532. </view>
  533. <view class="row">
  534. <view class="label">产品小类</view>
  535. <view class="value">{{ item.smallName || '' }}</view>
  536. </view>
  537. <view class="row">
  538. <view class="label">机型名称</view>
  539. <view class="value">{{ item.goodsName || '' }}</view>
  540. </view>
  541. <!-- <view class="row">
  542. <view class="label">收费标准</view>
  543. <view class="value">¥{{ item.normAmount | priceFilter }}</view>
  544. </view> -->
  545. <view class="row">
  546. <view class="label">数&emsp;&emsp;量</view>
  547. <view class="value">{{ item.settleNum || '' }}</view>
  548. </view>
  549. <view class="row">
  550. <view class="label">结算金额</view>
  551. <view class="value" v-if="orderStatus_v == 'YJS'">¥{{ item.workerSettleAmount | priceFilter }}</view>
  552. <view class="value" v-else>-</view>
  553. </view>
  554. </view>
  555. </block>
  556. <block v-else>
  557. <view class="common-title2">
  558. <view class="title">其他费用</view>
  559. <view class="right">{{ orderStatus_v == 'YJS' ? '已结算' : '结算中' }}</view>
  560. </view>
  561. <view>
  562. <view class="row">
  563. <view class="label">类&emsp;&emsp;型</view>
  564. <view class="value">{{ item.typeName || '' }}</view>
  565. </view>
  566. <view class="row">
  567. <view class="label">规&emsp;&emsp;格</view>
  568. <view class="value">{{ item.label || '' }}</view>
  569. </view>
  570. <!-- <view class="row">
  571. <view class="label">单&emsp;&emsp;价</view>
  572. <view class="value">¥{{ item.normAmount | priceFilter }}</view>
  573. </view> -->
  574. <view class="row">
  575. <view class="label">数&emsp;&emsp;量</view>
  576. <view class="value">{{ item.settleNum || '' }}</view>
  577. </view>
  578. <view class="row">
  579. <view class="label">结算金额</view>
  580. <view class="value" v-if="orderStatus_v == 'YJS'">¥{{ item.workerSettleAmount | priceFilter }}</view>
  581. <view class="value" v-else>-</view>
  582. </view>
  583. </view>
  584. </block>
  585. </view>
  586. <block v-if="settleList.length < 1">
  587. <Loading :type="3" :loadStatus="2" showText="暂无员工结算信息" :isLoadAnimation="false" />
  588. </block>
  589. </block>
  590. </view>
  591. <Loading :type="3" :loadStatus="loadStatus" :isLoadAnimation="false" />
  592. <template slot="footer">
  593. <view class="bottom-container">
  594. <view class="left" style="width: 100%" v-if="detail">
  595. <!-- 待抢单 -->
  596. <block v-if="orderStatus_v == 'DQD' && (detail.orderType == 'INSTALL' ? !!userInfo.workerNumber : true)">
  597. <u-button type="primary" text="抢单" @tap="qdOrder(detail)"></u-button>
  598. </block>
  599. </view>
  600. <view class="right" v-if="detail">
  601. <!-- 待接单 -->
  602. <block v-if="orderStatus_v == 'DJD'">
  603. <u-button
  604. plain
  605. type="primary"
  606. text="配件申请"
  607. v-if="detail.orderType != 'INSTALL'"
  608. @tap="toPartsApply()"
  609. ></u-button>
  610. <u-button
  611. plain
  612. type="primary"
  613. text="取消加急"
  614. @tap="actionUrgent(false)"
  615. v-if="detail.pgOrderFlags && detail.pgOrderFlags.some(o => o.tag == 'JIA_JI')"
  616. ></u-button>
  617. <u-button plain type="primary" text="加急" @tap="actionUrgent(true)" v-else></u-button>
  618. </block>
  619. <u-button
  620. v-if="
  621. (orderStatus_v == 'DJD' || (detail.isImportExcel && !detail.isMeet)) &&
  622. (detail.orderType == 'INSTALL' ? !!userInfo.workerNumber : true)
  623. "
  624. type="primary"
  625. text="接单"
  626. @tap="actionReceive()"
  627. ></u-button>
  628. <!-- 服务中 -->
  629. <block v-if="orderStatus_v == 'FWZ' || orderStatus_v == 'YCD'">
  630. <u-button
  631. v-if="userInfo.workerNumber == detail.workerNumber"
  632. plain
  633. type="primary"
  634. text="变更小工"
  635. @tap="biangengxiaogong()"
  636. ></u-button>
  637. <u-button
  638. plain
  639. type="primary"
  640. text="配件申请"
  641. v-if="detail.orderType != 'INSTALL'"
  642. @tap="toPartsApply()"
  643. ></u-button>
  644. <u-button
  645. plain
  646. type="primary"
  647. text="辅材收费"
  648. @tap="toCharge('M')"
  649. v-if="detail.orderType == 'INSTALL'"
  650. ></u-button>
  651. <u-button plain type="primary" text="配件收费" @tap="toCharge('P')" v-else></u-button>
  652. <u-button type="primary" text="过程反馈" @tap="toFeedback()"></u-button>
  653. </block>
  654. </view>
  655. </view>
  656. </template>
  657. </zj-page-layout>
  658. <selectionWorkers
  659. v-if="item"
  660. :title="title"
  661. :detail="item"
  662. :type="selectionWorkersType"
  663. :callback="callback"
  664. @close="
  665. () => {
  666. item = null
  667. selectionWorkersType = null
  668. callback = null
  669. }
  670. "
  671. />
  672. <u-popup :show="isShowFeedback" @close="isShowFeedback = false" closeable round="10">
  673. <view class="feedback-dialog">
  674. <view class="title">服务路由</view>
  675. <view class="content">
  676. <logistics :logisticsData="feedbackList"></logistics>
  677. </view>
  678. </view>
  679. </u-popup>
  680. <zhifutanchuan
  681. v-if="state > 0"
  682. :detail="detail_zf"
  683. :orderId="orderId_zf"
  684. :state="state"
  685. @scan="scan"
  686. @back="back"
  687. @offTiming="offTiming"
  688. />
  689. </view>
  690. </template>
  691. <script>
  692. import zjDialogPicker from '@/components/zj-dialog/zj-dialog-picker.vue'
  693. import Logistics from '@/components/logistics2/common-logistics.vue'
  694. import selectionWorkers from '@/components/selectionWorkers.vue'
  695. import zhifutanchuan from '@/components/zhifutanchuan.vue'
  696. import { wxScanCode } from '@/common/utils/util.js'
  697. import { getStorage } from '@/common/utils/storage.js'
  698. export default {
  699. components: {
  700. zjDialogPicker,
  701. Logistics,
  702. selectionWorkers,
  703. zhifutanchuan
  704. },
  705. filters: {
  706. payStatusFilter(val) {
  707. const MAP = {
  708. CANCEL: '已取消',
  709. WAIT: '待支付',
  710. PAID: '已支付'
  711. }
  712. return MAP[val]
  713. },
  714. examineStatusFilter(val) {
  715. const MAP = {
  716. WAIT: '待审批',
  717. OK: '审批通过',
  718. FAIL: '审批驳回',
  719. NO: '已取消',
  720. PAID: '已现场支付',
  721. NO_PAID: '未支付'
  722. }
  723. return MAP[val]
  724. }
  725. },
  726. data() {
  727. return {
  728. id: null,
  729. imageUrl: this.$imageUrl,
  730. detail: null,
  731. increDetail: null,
  732. loadStatus: 1,
  733. errorText: '',
  734. refresherTriggered: false,
  735. curTab: 1,
  736. tabList: [
  737. { name: '基本信息', value: 1 },
  738. { name: '服务信息', value: 2 },
  739. { name: '电子支付', value: 3 },
  740. { name: '员工结算', value: 4 }
  741. ],
  742. isOpenGoods: false,
  743. payList: [], // 支付信息列表
  744. settleList: [], // 结算列表
  745. isShowFeedback: false,
  746. feedbackList: [],
  747. behavior: '',
  748. selectionWorkersType: '',
  749. item: null,
  750. callback: null,
  751. title: '',
  752. state: 0,
  753. detail_zf: null,
  754. orderId_zf: null
  755. }
  756. },
  757. computed: {
  758. userInfo() {
  759. return getStorage('user')
  760. },
  761. orderStatus_v() {
  762. if (['DYY'].includes(this?.detail?.orderStatus)) {
  763. // 待预约
  764. return 'DYY'
  765. } else if (['DQD'].includes(this?.detail?.orderStatus)) {
  766. // 待抢单
  767. return 'DQD'
  768. } else if (
  769. [
  770. 'DSHPG',
  771. 'CJ',
  772. 'YPD',
  773. 'DXSPD',
  774. 'DZBPG',
  775. 'DWDSPGP',
  776. 'DXSSPGP',
  777. 'DTJXSSPGP',
  778. 'DZBSPGP',
  779. 'DFZXPD',
  780. 'DFZXSPGP',
  781. 'XSBH',
  782. 'TJXSBH',
  783. 'ZBBH',
  784. 'FZXBH',
  785. 'FL'
  786. ].includes(this?.detail?.orderStatus)
  787. ) {
  788. // 待商户派工
  789. return 'DSHPG'
  790. } else if (['DWDPG', 'DWDPD', 'WDBH'].includes(this?.detail?.orderStatus)) {
  791. // 待网点派工
  792. return 'DWDPG'
  793. } else if (['DJD', 'DSM', 'YZP'].includes(this?.detail?.orderStatus)) {
  794. // 待接单
  795. return 'DJD'
  796. } else if (['FWZ', 'GCSZT', 'BFWG'].includes(this?.detail?.orderStatus)) {
  797. // 服务中
  798. return 'FWZ'
  799. } else if (['YCD'].includes(this?.detail?.orderStatus)) {
  800. // 异常单
  801. return 'YCD'
  802. } else if (['YWG', 'GCSZX', 'WDWG', 'YWGO'].includes(this?.detail?.orderStatus)) {
  803. // 已完工待结算
  804. return 'YWG'
  805. } else if (['YJS', 'LRCD'].includes(this?.detail?.orderStatus)) {
  806. // 已结算
  807. return 'YJS'
  808. } else if (['YQX', 'FWZT', 'YCGB', 'FWQX'].includes(this?.detail?.orderStatus)) {
  809. // 已取消
  810. return 'YQX'
  811. }
  812. return ''
  813. }
  814. },
  815. async onLoad({ id, behavior }) {
  816. this.id = id
  817. this.behavior = behavior
  818. await this.refreshData()
  819. this.crossPage.$on('refreshWorkorderDetail', async () => {
  820. await this.refreshData()
  821. })
  822. },
  823. onUnload() {
  824. this.crossPage.$off('refreshWorkorderDetail')
  825. },
  826. methods: {
  827. scan() {
  828. if (this.timeout) {
  829. clearTimeout(this.timeout)
  830. }
  831. this.scanCode()
  832. },
  833. back() {
  834. if (this.timeout) {
  835. clearTimeout(this.timeout)
  836. }
  837. this.$navToPage(
  838. {
  839. url: `/packageMaterial/pages/index?type=M`
  840. },
  841. 'reLaunch'
  842. )
  843. },
  844. offTiming() {
  845. if (this.timeout) {
  846. clearTimeout(this.timeout)
  847. }
  848. },
  849. // 扫码
  850. async scanCode(item) {
  851. this.detail_zf = { ...item }
  852. this.orderId_zf = item.orderId
  853. var codeVal = await wxScanCode(['qrCode'])
  854. this.submitData(codeVal)
  855. },
  856. // 下单
  857. submitData(code) {
  858. this.$api
  859. .post('/pay/paid', {
  860. authCode: code,
  861. orderId: this.orderId_zf,
  862. payType: 'WECHAT'
  863. })
  864. .then(res => {
  865. if (res.data) {
  866. // 支付成功
  867. this.getPayList(() => {
  868. this.state = 2
  869. })
  870. } else {
  871. // 支付失败
  872. this.getPayList(() => {
  873. this.state = 4
  874. })
  875. }
  876. })
  877. .catch(res => {
  878. // 等待支付
  879. if (res.message === 'USERPAYING') {
  880. if (this.state == 0) {
  881. this.state = 1
  882. }
  883. this.getDetail__()
  884. } else {
  885. this.$tips(res.message)
  886. }
  887. })
  888. },
  889. getDetail__(cb) {
  890. this.$api
  891. .post('/pay/getOrder', {
  892. orderId: this.orderId_zf
  893. })
  894. .then(res => {
  895. this.detail_zf = res.data
  896. if (res.data.payStatus == 'PAID') {
  897. this.state = 2
  898. } else {
  899. this.timeout = setTimeout(() => {
  900. this.getDetail__(cb)
  901. }, 1000)
  902. }
  903. cb?.()
  904. })
  905. .catch(res => {})
  906. .finally(res => {})
  907. },
  908. // 触发下拉刷新
  909. async refresherrefresh(e) {
  910. this.refresherTriggered = true
  911. await this.refreshData()
  912. },
  913. async changeTab(e) {
  914. this.curTab = e.value
  915. this.loadStatus = 1
  916. await this.refreshData()
  917. },
  918. async refreshData() {
  919. try {
  920. await this.getDetail()
  921. await this.getSettleList()
  922. if (this.curTab === 1) {
  923. // await this.getDetail();
  924. } else if (this.curTab === 2) {
  925. } else if (this.curTab === 3) {
  926. await this.getPayList()
  927. } else if (this.curTab === 4) {
  928. await this.getSettleList()
  929. }
  930. this.refresherTriggered = false
  931. this.loadStatus = 0
  932. } catch (e) {
  933. this.loadStatus = 2
  934. }
  935. },
  936. // 获取详情
  937. getDetail() {
  938. return new Promise((resolve, reject) => {
  939. this.$api
  940. .post('/pg/order/base/detail', {
  941. orderBaseId: this.id
  942. })
  943. .then(res => {
  944. this.detail = res.data
  945. if (
  946. this.behavior === 'lqdd' &&
  947. !['DQD'].includes(res.data.orderStatus) &&
  948. res.data.workerId !== this.$store.state.user.userId
  949. ) {
  950. this.$modal({
  951. title: '提示',
  952. content: '来晚啦,工单已经被抢走了~',
  953. confirmText: '知道啦',
  954. showCancel: false
  955. })
  956. .then(() => {
  957. uni.switchTab({
  958. url: '/pages/index/index'
  959. })
  960. })
  961. .catch(() => {
  962. uni.switchTab({
  963. url: '/pages/index/index'
  964. })
  965. })
  966. }
  967. if (res.data.pgIncreOrderId) {
  968. this.getIncreDetail(res.data.pgIncreOrderId)
  969. }
  970. resolve(1)
  971. })
  972. .catch(res => {
  973. reject(0)
  974. })
  975. })
  976. },
  977. getIncreDetail(id) {
  978. this.$api
  979. .post('/increConfig/detailIncre', {
  980. id
  981. })
  982. .then(res => {
  983. this.increDetail = res.data
  984. })
  985. },
  986. copyData() {
  987. let name = this.detail.userName
  988. let phone = this.detail.userMobile
  989. let address = `${this.detail.gpsAddress ? this.detail.gpsAddress + this.detail.address : this.detail.address}`
  990. this.$copy(`${name},${phone},${address}`)
  991. },
  992. async openFeedback() {
  993. await this.getFeedbackList()
  994. this.isShowFeedback = true
  995. },
  996. getFeedbackList() {
  997. return new Promise((resolve, reject) => {
  998. this.$api
  999. .post('/pg/order/base/operator/list', {
  1000. orderBaseId: this.id
  1001. })
  1002. .then(res => {
  1003. let data = res.data.map(item => {
  1004. return {
  1005. title: item.type,
  1006. time: item.createTime,
  1007. content: item.content,
  1008. imgSrc: item.imgSrc
  1009. }
  1010. })
  1011. this.feedbackList = data
  1012. })
  1013. .finally(res => {
  1014. resolve(1)
  1015. })
  1016. })
  1017. },
  1018. // 获取支付信息
  1019. getPayList(cb) {
  1020. return new Promise((resolve, reject) => {
  1021. let url = ''
  1022. if (this.detail.rpProjectRepairId) {
  1023. url = '/engin/material/detailWorker'
  1024. } else {
  1025. url = '/changeOrder/getOrderList'
  1026. }
  1027. this.$api
  1028. .post(url, {
  1029. workerOrderId: this.id
  1030. })
  1031. .then(async res => {
  1032. this.payList = res.data.map(item => {
  1033. var gengduo = [
  1034. {
  1035. chargeType: 'SERV',
  1036. amountName: '服务费用',
  1037. normAmount: item.servicePrice || 0
  1038. },
  1039. {
  1040. chargeType: 'SERV',
  1041. amountName: '其他费用',
  1042. normAmount: item.otherPrice || 0
  1043. }
  1044. ]
  1045. if (this.detail.rpProjectRepairId) {
  1046. if (!item.rpMaterialOrderItems) {
  1047. item.rpMaterialOrderItems = []
  1048. }
  1049. item.rpMaterialOrderItems.push(...gengduo)
  1050. } else {
  1051. if (!item.workerOrderItems) {
  1052. item.workerOrderItems = []
  1053. }
  1054. item.workerOrderItems.push(...gengduo)
  1055. }
  1056. return { ...item }
  1057. })
  1058. cb?.()
  1059. resolve(1)
  1060. })
  1061. .catch(res => {
  1062. cb?.()
  1063. reject(0)
  1064. })
  1065. })
  1066. },
  1067. // 获取安装结算
  1068. getSettleList() {
  1069. return new Promise((resolve, reject) => {
  1070. this.$api
  1071. .post('/order/settle/norm/detail', {
  1072. orderId: this.id
  1073. })
  1074. .then(res => {
  1075. this.settleList = res.data
  1076. if (this.settleList.length > 0 && this.orderStatus_v == 'YJS') {
  1077. this.tabList[3].name = `员工结算(${this.settleList.reduce(
  1078. (total, obj) => total + obj.workerSettleAmount,
  1079. 0
  1080. )})`
  1081. } else {
  1082. this.tabList[3].name = `员工结算`
  1083. }
  1084. resolve(1)
  1085. })
  1086. .catch(res => {
  1087. reject(0)
  1088. })
  1089. })
  1090. },
  1091. // 预览图片
  1092. prevImg(url) {
  1093. uni.previewImage({
  1094. current: this.imageUrl + url,
  1095. urls: [this.imageUrl + url]
  1096. })
  1097. },
  1098. // 加急
  1099. actionUrgent(flag) {
  1100. this.$modal({
  1101. title: '加急操作',
  1102. content: '加急操作,会消息通知所有订单相关人员,请谨慎操作。'
  1103. })
  1104. .then(() => {
  1105. this.$api
  1106. .post('/pg/order/base/flag', {
  1107. orderBaseId: this.id,
  1108. orderFlagEnum: 'JIA_JI',
  1109. flag: flag
  1110. })
  1111. .then(res => {
  1112. this.$successToast()
  1113. this.getDetail()
  1114. this.crossPage.$emit('refreshWorkorderList', '')
  1115. })
  1116. })
  1117. .catch(() => {})
  1118. },
  1119. // 变更小工
  1120. biangengxiaogong() {
  1121. this.title = '更换小工'
  1122. this.selectionWorkersType = 3
  1123. this.item = { ...this.detail }
  1124. this.callback = () => {
  1125. this.$successToast()
  1126. this.getDetail()
  1127. this.crossPage.$emit('refreshWorkorderList', '')
  1128. this.$nextTick(() => {
  1129. this.item = null
  1130. this.selectionWorkersType = null
  1131. this.callback = null
  1132. this.title = null
  1133. })
  1134. }
  1135. },
  1136. // 接单
  1137. actionReceive() {
  1138. this.title = '接收确认'
  1139. this.selectionWorkersType = 1
  1140. this.item = { ...this.detail }
  1141. this.callback = () => {
  1142. this.$successToast()
  1143. this.getDetail()
  1144. this.crossPage.$emit('refreshWorkorderList', '')
  1145. this.$nextTick(() => {
  1146. this.item = null
  1147. this.selectionWorkersType = null
  1148. this.callback = null
  1149. this.title = null
  1150. })
  1151. }
  1152. // this.$modal({
  1153. // title: '接单确认',
  1154. // content: '确认接单?'
  1155. // })
  1156. // .then(() => {
  1157. // this.$api
  1158. // .post('/pg/order/base/rece', {
  1159. // orderBaseId: this.id
  1160. // })
  1161. // .then(res => {
  1162. // this.$successToast()
  1163. // this.getDetail()
  1164. // this.crossPage.$emit('refreshWorkorderList', '')
  1165. // })
  1166. // })
  1167. // .catch(() => {})
  1168. },
  1169. qdOrder(item) {
  1170. // this.title = '接收确认'
  1171. // this.selectionWorkersType = 2
  1172. // this.item = { ...item }
  1173. // this.callback = () => {
  1174. // this.$successToast()
  1175. // this.getDetail()
  1176. // this.crossPage.$emit('refreshWorkorderList', '')
  1177. // this.$nextTick(() => {
  1178. // this.item = null
  1179. // this.selectionWorkersType = null
  1180. // this.callback = null
  1181. // })
  1182. // }
  1183. this.$modal({
  1184. title: '抢单确认',
  1185. content: '确认抢单?'
  1186. })
  1187. .then(() => {
  1188. this.$api
  1189. .post('/pg/order/base/qd', {
  1190. orderBaseId: item.id
  1191. })
  1192. .then(res => {
  1193. this.$successToast()
  1194. this.getDetail()
  1195. this.crossPage.$emit('refreshWorkorderList', '')
  1196. })
  1197. })
  1198. .catch(() => {})
  1199. },
  1200. // 去收费
  1201. toCharge(type) {
  1202. if (type == 'M') {
  1203. this.$navToPage({
  1204. url: `/packageMaterial/pages/sale/index?type=${type}&oid=${this.id}`
  1205. })
  1206. } else if (type == 'P') {
  1207. this.$navToPage({
  1208. url: `/packageMaterial/pages/newSale/index?type=${type}&oid=${this.id}`
  1209. })
  1210. }
  1211. },
  1212. // 去配件申请
  1213. toPartsApply() {
  1214. this.$navToPage({
  1215. url: `/packageMaterial/pages/partsApply/form?id=${this.id}`
  1216. })
  1217. },
  1218. // 去过程反馈
  1219. toFeedback() {
  1220. this.$navToPage({
  1221. url: `/packageWorkorder/pages/processFeedback?id=${this.id}`
  1222. })
  1223. },
  1224. // 去过程反馈列表
  1225. toFeedbackList() {
  1226. this.$navToPage({
  1227. url: `/packageWorkorder/pages/feedbackList?id=${this.id}`
  1228. })
  1229. },
  1230. // 去完工明细
  1231. toOverDetail() {
  1232. this.$navToPage({
  1233. url: `/packageWorkorder/pages/overDetail?id=${this.id}`
  1234. })
  1235. }
  1236. }
  1237. }
  1238. </script>
  1239. <style lang="scss" scoped>
  1240. .all-container {
  1241. position: relative;
  1242. }
  1243. .bg {
  1244. position: absolute;
  1245. top: 0;
  1246. left: 0;
  1247. width: 100%;
  1248. height: 300rpx;
  1249. background: linear-gradient(179.48deg, rgba(200, 224, 251, 1) 0.45%, rgba(247, 247, 247, 1) 98.96%);
  1250. }
  1251. .status-container {
  1252. padding: 30rpx;
  1253. .status {
  1254. font-size: 36rpx;
  1255. font-weight: 500;
  1256. text {
  1257. margin-left: 12rpx;
  1258. }
  1259. }
  1260. .time {
  1261. font-size: 24rpx;
  1262. color: $sec-font;
  1263. margin-top: 12rpx;
  1264. }
  1265. }
  1266. .tab-container {
  1267. margin-bottom: 30rpx;
  1268. }
  1269. .card {
  1270. @include zj-card;
  1271. }
  1272. .common-title {
  1273. font-size: 36rpx;
  1274. font-weight: 600;
  1275. padding-bottom: 20rpx;
  1276. }
  1277. .common-title2 {
  1278. padding-bottom: 20rpx;
  1279. display: flex;
  1280. align-items: center;
  1281. justify-content: space-between;
  1282. .title {
  1283. font-size: 36rpx;
  1284. font-weight: 600;
  1285. }
  1286. .right {
  1287. font-size: 28rpx;
  1288. color: $theme-color;
  1289. display: flex;
  1290. align-items: center;
  1291. flex-wrap: wrap;
  1292. text {
  1293. font-size: 28rpx;
  1294. opacity: 0.5;
  1295. }
  1296. }
  1297. }
  1298. .content-container {
  1299. padding: 0 30rpx 30rpx;
  1300. }
  1301. .user-container {
  1302. .top {
  1303. padding: 30rpx;
  1304. .type {
  1305. display: flex;
  1306. align-items: center;
  1307. justify-content: space-between;
  1308. .left {
  1309. font-size: 36rpx;
  1310. color: $theme-color;
  1311. font-weight: 500;
  1312. }
  1313. .right {
  1314. font-size: 28rpx;
  1315. color: $theme-color;
  1316. }
  1317. }
  1318. .user {
  1319. font-weight: 500;
  1320. margin-top: 20rpx;
  1321. }
  1322. .address {
  1323. display: flex;
  1324. justify-content: space-between;
  1325. margin-top: 20rpx;
  1326. .text {
  1327. font-size: 28rpx;
  1328. flex: 1;
  1329. margin-right: 20rpx;
  1330. }
  1331. .ctrl {
  1332. font-size: 28rpx;
  1333. color: $theme-color;
  1334. .iconfont {
  1335. font-size: 28rpx;
  1336. margin-right: 4rpx;
  1337. }
  1338. }
  1339. }
  1340. }
  1341. .bottom {
  1342. border-top: 1px solid #eaeaea;
  1343. display: flex;
  1344. height: 80rpx;
  1345. .it {
  1346. flex: 1;
  1347. display: flex;
  1348. align-items: center;
  1349. justify-content: center;
  1350. font-size: 28rpx;
  1351. color: $theme-color;
  1352. &:last-child {
  1353. border-left: 1px solid #eaeaea;
  1354. }
  1355. .iconfont {
  1356. font-size: 36rpx;
  1357. margin-right: 8rpx;
  1358. }
  1359. }
  1360. }
  1361. }
  1362. .goods-container {
  1363. padding: 30rpx;
  1364. .item {
  1365. border-bottom: 1px solid #d6e0f2;
  1366. padding: 20rpx 0;
  1367. &:last-child {
  1368. border: none;
  1369. }
  1370. .main {
  1371. display: flex;
  1372. image {
  1373. width: 140rpx;
  1374. height: 140rpx;
  1375. flex-shrink: 0;
  1376. }
  1377. .info {
  1378. flex: 1;
  1379. margin-left: 20rpx;
  1380. .name {
  1381. display: flex;
  1382. justify-content: space-between;
  1383. .left {
  1384. font-weight: 500;
  1385. }
  1386. .right {
  1387. margin-left: 30rpx;
  1388. color: $sec-font;
  1389. }
  1390. }
  1391. .tags {
  1392. display: flex;
  1393. flex-wrap: wrap;
  1394. .it {
  1395. height: 42rpx;
  1396. padding: 0 16rpx;
  1397. background: #f4f5f9;
  1398. border-radius: 8rpx;
  1399. font-size: 24rpx;
  1400. display: flex;
  1401. align-items: center;
  1402. justify-content: center;
  1403. margin-top: 12rpx;
  1404. margin-right: 8rpx;
  1405. &:last-child {
  1406. margin-right: 0;
  1407. }
  1408. }
  1409. }
  1410. }
  1411. }
  1412. .images {
  1413. display: flex;
  1414. flex-wrap: wrap;
  1415. margin-top: 24rpx;
  1416. .it {
  1417. margin-right: 30rpx;
  1418. image {
  1419. width: 116rpx;
  1420. height: 116rpx;
  1421. }
  1422. .text {
  1423. text-align: center;
  1424. color: $sec-font;
  1425. margin-top: 8rpx;
  1426. }
  1427. }
  1428. }
  1429. }
  1430. .ctrl {
  1431. display: flex;
  1432. align-items: center;
  1433. justify-content: center;
  1434. margin-top: 10rpx;
  1435. text {
  1436. color: $sec-font;
  1437. }
  1438. .iconfont {
  1439. font-size: 24rpx;
  1440. transform: rotate(-90deg);
  1441. margin-left: 10rpx;
  1442. &.is {
  1443. transform: rotate(90deg);
  1444. }
  1445. }
  1446. }
  1447. }
  1448. .info-container {
  1449. padding: 30rpx;
  1450. .row {
  1451. display: flex;
  1452. margin-top: 20rpx;
  1453. &:first-child {
  1454. margin-top: 0;
  1455. }
  1456. .label {
  1457. font-size: 28rpx;
  1458. color: $sec-font;
  1459. margin-right: 20rpx;
  1460. flex-shrink: 0;
  1461. }
  1462. .value {
  1463. font-size: 28rpx;
  1464. }
  1465. .ctrl {
  1466. font-size: 28rpx;
  1467. color: $theme-color;
  1468. margin-left: 20rpx;
  1469. }
  1470. }
  1471. }
  1472. .product-container {
  1473. padding: 30rpx;
  1474. margin-bottom: 30rpx;
  1475. .row {
  1476. display: flex;
  1477. .label {
  1478. font-size: 28rpx;
  1479. color: $sec-font;
  1480. margin-right: 20rpx;
  1481. flex-shrink: 0;
  1482. }
  1483. .value {
  1484. font-size: 28rpx;
  1485. flex: 1;
  1486. }
  1487. }
  1488. .product {
  1489. background: #f5f5f5;
  1490. border-radius: 12rpx;
  1491. padding: 20rpx;
  1492. .it {
  1493. display: flex;
  1494. align-items: flex-end;
  1495. margin-bottom: 20rpx;
  1496. .name {
  1497. flex: 1;
  1498. font-size: 28rpx;
  1499. font-weight: 500;
  1500. text {
  1501. color: $sec-font;
  1502. margin-left: 12rpx;
  1503. font-weight: normal;
  1504. }
  1505. }
  1506. .price {
  1507. margin-left: 30rpx;
  1508. font-size: 28rpx;
  1509. font-weight: 500;
  1510. }
  1511. }
  1512. .total {
  1513. display: flex;
  1514. align-items: center;
  1515. justify-content: flex-end;
  1516. margin-top: 30rpx;
  1517. .text {
  1518. font-size: 28rpx;
  1519. color: $sec-font;
  1520. }
  1521. .price {
  1522. font-size: 28rpx;
  1523. color: $minor-color;
  1524. font-weight: 500;
  1525. }
  1526. }
  1527. }
  1528. .bottom {
  1529. margin-top: 20rpx;
  1530. display: flex;
  1531. align-items: center;
  1532. justify-content: space-between;
  1533. .left {
  1534. font-size: 28rpx;
  1535. font-weight: 500;
  1536. }
  1537. .right {
  1538. display: flex;
  1539. align-items: center;
  1540. .text {
  1541. font-size: 28rpx;
  1542. color: $sec-font;
  1543. }
  1544. .price {
  1545. font-size: 28rpx;
  1546. color: $minor-color;
  1547. font-weight: 500;
  1548. }
  1549. }
  1550. }
  1551. }
  1552. .feedback-container {
  1553. padding: 30rpx;
  1554. .list {
  1555. .item {
  1556. display: flex;
  1557. padding: 10rpx 0;
  1558. .main {
  1559. margin-left: 20rpx;
  1560. .name {
  1561. font-weight: 500;
  1562. line-height: 32rpx;
  1563. }
  1564. .time {
  1565. font-size: 28rpx;
  1566. margin-top: 12rpx;
  1567. color: $sec-font;
  1568. line-height: 32rpx;
  1569. }
  1570. .content {
  1571. font-size: 28rpx;
  1572. margin-top: 12rpx;
  1573. line-height: 32rpx;
  1574. }
  1575. }
  1576. }
  1577. }
  1578. }
  1579. .bottom-container {
  1580. padding: 20rpx;
  1581. display: flex;
  1582. justify-content: space-between;
  1583. .right {
  1584. display: flex;
  1585. ::v-deep .u-button {
  1586. width: 160rpx;
  1587. margin-left: 20rpx;
  1588. }
  1589. }
  1590. }
  1591. .feedback-dialog {
  1592. padding: 30rpx 30rpx 0;
  1593. .title {
  1594. margin-bottom: 30rpx;
  1595. text-align: center;
  1596. font-weight: 600;
  1597. font-size: 36rpx;
  1598. }
  1599. .content {
  1600. padding-bottom: 30rpx;
  1601. max-height: 800rpx;
  1602. overflow-y: scroll;
  1603. }
  1604. }
  1605. .imgs {
  1606. display: flex;
  1607. flex-wrap: wrap;
  1608. .it {
  1609. display: flex;
  1610. flex-direction: column;
  1611. align-items: center;
  1612. position: relative;
  1613. margin-top: 30rpx;
  1614. margin-right: 30rpx;
  1615. &:nth-child(3n) {
  1616. margin-right: 0;
  1617. }
  1618. image {
  1619. width: 190rpx;
  1620. height: 190rpx;
  1621. background: #f4f4f7;
  1622. border-radius: 20rpx;
  1623. overflow: hidden;
  1624. }
  1625. .name {
  1626. margin-top: 24rpx;
  1627. color: $sec-font;
  1628. text {
  1629. color: $minor-color;
  1630. }
  1631. }
  1632. }
  1633. }
  1634. </style>